From 75203e96deb7f0583cd039ccb3333758904eee69 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 18 Oct 2017 11:21:39 +0200 Subject: [PATCH 001/551] initial layer flow --- resources/definitions/fdmprinter.def.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ca424dfd2f..e988366c7c 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1863,6 +1863,20 @@ "enabled": "machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": true }, + "material_flow_layer_0": + { + "label": "Initial Layer Flow", + "description": "Flow compensation for the first layer: the amount of material extruded on the initial layer is multiplied by this value.", + "unit": "%", + "default_value": 100, + "value": "material_flow", + "type": "float", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "enabled": "machine_gcode_flavor != \"UltiGCode\"", + "settable_per_mesh": true + }, "retraction_enable": { "label": "Enable Retraction", From f1a2da0f8af2a3f7b9bb5f833e0f81ff91276ffb Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 18 Oct 2017 11:30:36 +0200 Subject: [PATCH 002/551] also enablew inital layer flow for the UM2 the normal flow isn't enabled because that is done in the firmware of the printer. The saem doesn't hold for the initial layer flow. --- 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 e988366c7c..416e1a7a85 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1874,7 +1874,6 @@ "minimum_value": "5", "minimum_value_warning": "50", "maximum_value_warning": "150", - "enabled": "machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": true }, "retraction_enable": From d9ae54a139d06103fc0d6cfd0217eedceb945014 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Tue, 31 Oct 2017 10:48:23 +0100 Subject: [PATCH 003/551] Update ChangeLog.txt --- plugins/ChangeLogPlugin/ChangeLog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 63d9b83495..13b735794b 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -1,6 +1,6 @@ [3.0.4] *Bug fixes -- Fixed OpenGL issue that prevent Cura from starting. +- Fixed OpenGL issue that prevents Cura from starting. *License agreement on the first startup has been added From d3f583b7a43b4509a0c0d6ef8a83112d96b23a5b Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 31 Oct 2017 11:47:55 +0100 Subject: [PATCH 004/551] CURA-4502 Minor changes --- plugins/ChangeLogPlugin/ChangeLog.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 13b735794b..d7d68e04a2 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -5,7 +5,8 @@ *License agreement on the first startup has been added [3.0.3] -*Bug fixes for the MakePrintable plugin. +*Bug fixes +- Add missing libraries for the MakePrintable plugin. [3.0.0] *Faster start-up From 1491c37485c49750c0f13dade58343406b0e1d7c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 3 Nov 2017 16:03:28 +0100 Subject: [PATCH 005/551] Don't crash if support density is 0 Found while working on CURA-4523. --- 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 cffaa1df3d..459d1911b1 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3495,7 +3495,7 @@ "minimum_value_warning": "support_line_width", "default_value": 2.66, "enabled": "support_enable", - "value": "(support_line_width * 100) / support_infill_rate * (2 if support_pattern == 'grid' else (3 if support_pattern == 'triangles' else 1))", + "value": "0 if support_infill_rate == 0 else (support_line_width * 100) / support_infill_rate * (2 if support_pattern == 'grid' else (3 if support_pattern == 'triangles' else 1))", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -5127,7 +5127,7 @@ "description": "Skip one in every N connection lines to make the support structure easier to break away.", "type": "int", "default_value": 5, - "value": "round(support_skip_zag_per_mm / support_line_distance)", + "value": "0 if support_line_distance == 0 else round(support_skip_zag_per_mm / support_line_distance)", "minimum_value": "1", "minimum_value_warning": "3", "enabled": "support_enable and (support_pattern == 'zigzag') and support_skip_some_zags", From f89c494274adf473fb699906f43b87411f7f4f0c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 3 Nov 2017 09:24:46 +0100 Subject: [PATCH 006/551] Add settings for tree support These three to start with. I don't know if I can implement more. We'll see about that later. Contributes to issue CURA-4523. --- resources/definitions/fdmprinter.def.json | 38 +++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 459d1911b1..815fed7390 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3655,6 +3655,44 @@ "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false }, + "support_tree_enable": + { + "label": "Tree Support", + "description": "Generate a tree-like support with branches that support your print. This may reduce material usage and print time.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true + }, + "support_tree_angle": + { + "label": "Tree Support Branch Angle", + "description": "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach.", + "unit": "°", + "type": "float", + "minimum_value": "0", + "maximum_value": "90", + "maximum_value_warning": "60", + "default_value": 40, + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_tree_wall_thickness": + { + "label": "Tree Support Wall Thickness", + "description": "The thickness of the walls of the tree support. Thicker walls take longer to print but are more stable.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "minimum_value_warning": "wall_line_width", + "default_value": 0.8, + "value": "wall_line_width * 2", + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "gradual_support_infill_steps": { "label": "Gradual Support Infill Steps", From 72c32bac3a16182ed99a7a89cad7d90f1fdb2cb0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 3 Nov 2017 10:55:23 +0100 Subject: [PATCH 007/551] Add tree support wall line count setting I knew I forgot one. Contributes to issue CURA-4523. --- resources/definitions/fdmprinter.def.json | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 815fed7390..c2a069aa6e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3681,7 +3681,7 @@ "support_tree_wall_thickness": { "label": "Tree Support Wall Thickness", - "description": "The thickness of the walls of the tree support. Thicker walls take longer to print but are more stable.", + "description": "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily.", "unit": "mm", "type": "float", "minimum_value": "0", @@ -3691,7 +3691,24 @@ "limit_to_extruder": "support_infill_extruder_nr", "enabled": "support_tree_enable", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": true, + "children": + { + "support_tree_wall_line_count": + { + "label": "Tree Support Wall Line Count", + "description": "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily.", + "type": "int", + "minimum_value": "0", + "minimum_value_warning": "1", + "default_value": 2, + "value": "round(support_tree_wall_thickness / support_line_width)", + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } }, "gradual_support_infill_steps": { From 79dee2619e8bc36d961781a42789af85d090cd53 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 6 Nov 2017 15:27:43 +0100 Subject: [PATCH 008/551] Also show some of the support settings for support trees Only the ones that are applicable to support trees as well (such as the overhang angle). I haven't decided on whether support interfaces should be implemented. Maybe later. Contributes to issue CURA-4523. --- 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 c2a069aa6e..f57273e280 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3344,7 +3344,7 @@ "description": "The extruder train to use for printing the support. This is used in multi-extrusion.", "type": "extruder", "default_value": "0", - "enabled": "support_enable and machine_extruder_count > 1", + "enabled": "(support_enable or support_tree_enable) and machine_extruder_count > 1", "settable_per_mesh": false, "settable_per_extruder": false, "children": { @@ -3355,7 +3355,7 @@ "type": "extruder", "default_value": "0", "value": "support_extruder_nr", - "enabled": "support_enable and machine_extruder_count > 1", + "enabled": "(support_enable or support_tree_enable) and machine_extruder_count > 1", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -3366,7 +3366,7 @@ "type": "extruder", "default_value": "0", "value": "support_extruder_nr", - "enabled": "support_enable and machine_extruder_count > 1", + "enabled": "(support_enable or support_tree_enable) and machine_extruder_count > 1", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -3420,7 +3420,7 @@ }, "default_value": "everywhere", "resolve": "'everywhere' if 'everywhere' in extruderValues('support_type') else 'buildplate'", - "enabled": "support_enable", + "enabled": "support_enable or support_tree_enable", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -3435,7 +3435,7 @@ "maximum_value_warning": "80", "default_value": 50, "limit_to_extruder": "support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr", - "enabled": "support_enable", + "enabled": "support_enable or support_tree_enable", "settable_per_mesh": true }, "support_pattern": @@ -3512,7 +3512,7 @@ "maximum_value_warning": "machine_nozzle_size", "default_value": 0.1, "limit_to_extruder": "support_interface_extruder_nr if support_interface_enable else support_infill_extruder_nr", - "enabled": "support_enable", + "enabled": "support_enable or support_tree_enable", "settable_per_mesh": true, "children": { @@ -3525,7 +3525,7 @@ "maximum_value_warning": "machine_nozzle_size", "default_value": 0.1, "type": "float", - "enabled": "support_enable", + "enabled": "support_enable or support_tree_enable", "value": "extruderValue(support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr, 'support_z_distance')", "limit_to_extruder": "support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr", "settable_per_mesh": true @@ -3541,7 +3541,7 @@ "value": "extruderValue(support_bottom_extruder_nr if support_bottom_enable else support_infill_extruder_nr, 'support_z_distance') if support_type == 'everywhere' else 0", "limit_to_extruder": "support_bottom_extruder_nr if support_bottom_enable else support_infill_extruder_nr", "type": "float", - "enabled": "support_enable and resolveOrValue('support_type') == 'everywhere'", + "enabled": "(support_enable or support_tree_enable) and resolveOrValue('support_type') == 'everywhere'", "settable_per_mesh": true } } @@ -3556,7 +3556,7 @@ "maximum_value_warning": "1.5 * machine_nozzle_tip_outer_diameter", "default_value": 0.7, "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_enable", + "enabled": "support_enable or support_tree_enable", "settable_per_mesh": true }, "support_xy_overrides_z": @@ -3571,7 +3571,7 @@ }, "default_value": "z_overrides_xy", "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_enable", + "enabled": "support_enable or support_tree_enable", "settable_per_mesh": true }, "support_xy_distance_overhang": @@ -3585,7 +3585,7 @@ "default_value": 0.2, "value": "machine_nozzle_size / 2", "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_enable and support_xy_overrides_z == 'z_overrides_xy'", + "enabled": "(support_enable or support_tree_enable) and support_xy_overrides_z == 'z_overrides_xy'", "settable_per_mesh": true }, "support_bottom_stair_step_height": @@ -3651,7 +3651,7 @@ "maximum_value_warning": "0.75 * machine_nozzle_size", "maximum_value": "resolveOrValue('layer_height') * 8", "value": "resolveOrValue('layer_height')", - "enabled": "support_enable and support_infill_rate > 0", + "enabled": "(support_enable or support_tree_enable) and support_infill_rate > 0", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false }, @@ -4036,7 +4036,7 @@ "description": "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle.", "type": "bool", "default_value": true, - "enabled": "not support_enable", + "enabled": "not support_enable and not support_tree_enable", "settable_per_mesh": false, "settable_per_extruder": false } From 2ce7c919119e91e5629eb751e277ab7572a2ec0a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 6 Nov 2017 17:30:07 +0100 Subject: [PATCH 009/551] Add setting for contact point spread I'm not sure what will come of this later, but for now I need it. Contributes to issue CURA-4523. --- resources/definitions/fdmprinter.def.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index f57273e280..8c311a9f2f 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3678,6 +3678,18 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "support_tree_branch_distance": + { + "label": "Tree Support Branch Distance", + "description": "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove.", + "unit": "mm", + "type": "float", + "minimum_value": "0.001", + "default_value": 4, + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable", + "settable_per_mesh": true + }, "support_tree_wall_thickness": { "label": "Tree Support Wall Thickness", From 380b0ed2e7154fbd581296ef02cc3bdea2f02695 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Wed, 8 Nov 2017 20:11:49 +0100 Subject: [PATCH 010/551] Add setting for branch diameter Contributes to issue CURA-4523. --- resources/definitions/fdmprinter.def.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8c311a9f2f..176c41dce7 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3690,6 +3690,20 @@ "enabled": "support_tree_enable", "settable_per_mesh": true }, + "support_tree_branch_diameter": + { + "label": "Tree Support Branch Diameter", + "description": "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this.", + "unit": "mm", + "type": "float", + "minimum_value": "0.001", + "minimum_value_warning": "support_line_width * 2", + "default_value": 2, + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "support_tree_wall_thickness": { "label": "Tree Support Wall Thickness", From b660b2ca862f5084837834f771f0e99f1b8d5c91 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Thu, 9 Nov 2017 00:47:20 +0100 Subject: [PATCH 011/551] Rename support_tree_wall_line_count to support_tree_wall_count Wall line is double. Just name it wall. Contributes to issue CURA-4523. --- 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 176c41dce7..14d7e7f39e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3720,7 +3720,7 @@ "settable_per_extruder": true, "children": { - "support_tree_wall_line_count": + "support_tree_wall_count": { "label": "Tree Support Wall Line Count", "description": "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily.", From cd6b1aca2956d40eb505780293bb22930b6a595f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 10 Nov 2017 13:05:32 +0100 Subject: [PATCH 012/551] Add branch diameter angle setting It's a bit obscure. Could we devise a better setting name? Contributes to issue CURA-4523. --- resources/definitions/fdmprinter.def.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 14d7e7f39e..c9dae14bd4 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3704,6 +3704,22 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "support_tree_branch_diameter_angle": + { + "label": "Tree Support Branch Diameter Angle", + "description": "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A negative angle makes them thinner towards the bottom, so be careful as they might disappear. A small positive angle can increase stability of the tree support.", + "unit": "°", + "type": "float", + "minimum_value": "-89.9999", + "maximum_value": "89.9999", + "minimum_value_warning": "0", + "maximum_value_warning": "15", + "default_value": 5, + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "support_tree_wall_thickness": { "label": "Tree Support Wall Thickness", From 4cc895b54b7c242aac4ea08f57dd1b4749ae7e36 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 10 Nov 2017 13:06:29 +0100 Subject: [PATCH 013/551] Use 1 wall for tree support by default Contributes to issue CURA-4523. --- 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 c9dae14bd4..b127b614af 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3729,7 +3729,7 @@ "minimum_value": "0", "minimum_value_warning": "wall_line_width", "default_value": 0.8, - "value": "wall_line_width * 2", + "value": "support_line_width", "limit_to_extruder": "support_infill_extruder_nr", "enabled": "support_tree_enable", "settable_per_mesh": false, @@ -3743,7 +3743,7 @@ "type": "int", "minimum_value": "0", "minimum_value_warning": "1", - "default_value": 2, + "default_value": 1, "value": "round(support_tree_wall_thickness / support_line_width)", "limit_to_extruder": "support_infill_extruder_nr", "enabled": "support_tree_enable", From 57a2bf7c5f739c4e80bfe05487546ee3aeb940d3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 13 Nov 2017 16:33:46 +0100 Subject: [PATCH 014/551] Move tree support to the top of the support category Because it's logical to have it before all of the settings that are enabled/disabled by it. Contributes to issue CURA-4523. --- resources/definitions/fdmprinter.def.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b127b614af..81166a711e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3338,6 +3338,14 @@ "settable_per_mesh": true, "settable_per_extruder": false }, + "support_tree_enable": + { + "label": "Tree Support", + "description": "Generate a tree-like support with branches that support your print. This may reduce material usage and print time.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true + }, "support_extruder_nr": { "label": "Support Extruder", @@ -3655,14 +3663,6 @@ "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false }, - "support_tree_enable": - { - "label": "Tree Support", - "description": "Generate a tree-like support with branches that support your print. This may reduce material usage and print time.", - "type": "bool", - "default_value": false, - "settable_per_mesh": true - }, "support_tree_angle": { "label": "Tree Support Branch Angle", From bb4cb1eb7d11bc7368e3a8cf7b14379f70c644c2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 13 Nov 2017 17:58:50 +0100 Subject: [PATCH 015/551] Make support infill related settings visible if support tree enabled Because the areas generated by support trees are also filled in as normal. Contributes to issue CURA-4523. --- resources/definitions/fdmprinter.def.json | 45 ++++++++++++----------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 81166a711e..ef107be412 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3344,7 +3344,8 @@ "description": "Generate a tree-like support with branches that support your print. This may reduce material usage and print time.", "type": "bool", "default_value": false, - "settable_per_mesh": true + "settable_per_mesh": true, + "settable_per_extruder": false }, "support_extruder_nr": { @@ -3385,7 +3386,7 @@ "type": "extruder", "default_value": "0", "value": "support_extruder_nr", - "enabled": "support_enable and machine_extruder_count > 1", + "enabled": "(support_enable or support_tree_enable) and machine_extruder_count > 1", "settable_per_mesh": false, "settable_per_extruder": false, "children": @@ -3397,7 +3398,7 @@ "type": "extruder", "default_value": "0", "value": "support_interface_extruder_nr", - "enabled": "support_enable and machine_extruder_count > 1", + "enabled": "(support_enable or support_tree_enable) and machine_extruder_count > 1", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -3462,7 +3463,7 @@ "cross": "Cross" }, "default_value": "zigzag", - "enabled": "support_enable", + "enabled": "support_enable or support_tree_enable", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -3473,7 +3474,7 @@ "description": "Connect the ZigZags. This will increase the strength of the zig zag support structure.", "type": "bool", "default_value": true, - "enabled": "support_enable and (support_pattern == 'zigzag')", + "enabled": "(support_enable or support_tree_enable) and support_pattern == 'zigzag'", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -3487,7 +3488,7 @@ "minimum_value": "0", "maximum_value_warning": "100", "default_value": 15, - "enabled": "support_enable", + "enabled": "support_enable or support_tree_enable", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true, @@ -3502,7 +3503,7 @@ "minimum_value": "0", "minimum_value_warning": "support_line_width", "default_value": 2.66, - "enabled": "support_enable", + "enabled": "support_enable or support_tree_enable", "value": "0 if support_infill_rate == 0 else (support_line_width * 100) / support_infill_rate * (2 if support_pattern == 'grid' else (3 if support_pattern == 'triangles' else 1))", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, @@ -3579,7 +3580,7 @@ }, "default_value": "z_overrides_xy", "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable", "settable_per_mesh": true }, "support_xy_distance_overhang": @@ -3593,7 +3594,7 @@ "default_value": 0.2, "value": "machine_nozzle_size / 2", "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "(support_enable or support_tree_enable) and support_xy_overrides_z == 'z_overrides_xy'", + "enabled": "support_enable and support_xy_overrides_z == 'z_overrides_xy'", "settable_per_mesh": true }, "support_bottom_stair_step_height": @@ -3761,7 +3762,7 @@ "minimum_value": "0", "maximum_value_warning": "1 if (support_pattern == 'cross' or support_pattern == 'lines' or support_pattern == 'zigzag' or support_pattern == 'concentric' or support_pattern == 'concentric_3d') else 5", "maximum_value": "999999 if support_line_distance == 0 else (20 - math.log(support_line_distance) / math.log(2))", - "enabled": "support_enable and support_infill_rate > 0", + "enabled": "(support_enable or support_tree_enable) and support_infill_rate > 0", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false }, @@ -3774,7 +3775,7 @@ "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", + "enabled": "(support_enable or support_tree_enable) and support_infill_rate > 0 and gradual_support_infill_steps > 0", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false }, @@ -3785,7 +3786,7 @@ "type": "bool", "default_value": false, "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "support_enable", + "enabled": "support_enable or support_tree_enable", "settable_per_mesh": true, "children": { @@ -3797,7 +3798,7 @@ "default_value": false, "value": "extruderValue(support_roof_extruder_nr, 'support_interface_enable')", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_enable", + "enabled": "support_enable or support_tree_enable", "settable_per_mesh": true }, "support_bottom_enable": @@ -3824,7 +3825,7 @@ "minimum_value_warning": "0.2 + layer_height", "maximum_value_warning": "10", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "support_interface_enable and support_enable", + "enabled": "support_interface_enable and (support_enable or support_tree_enable)", "settable_per_mesh": true, "children": { @@ -3840,7 +3841,7 @@ "maximum_value_warning": "10", "value": "extruderValue(support_roof_extruder_nr, 'support_interface_height')", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_roof_enable and support_enable", + "enabled": "support_roof_enable and (support_enable or support_tree_enable)", "settable_per_mesh": true }, "support_bottom_height": @@ -3855,7 +3856,7 @@ "minimum_value_warning": "min(0.2 + layer_height, support_bottom_stair_step_height)", "maximum_value_warning": "10", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_bottom_enable and support_enable", + "enabled": "support_bottom_enable and (support_enable or support_tree_enable)", "settable_per_mesh": true } } @@ -3882,7 +3883,7 @@ "minimum_value": "0", "maximum_value_warning": "100", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "support_interface_enable and support_enable", + "enabled": "support_interface_enable and (support_enable or support_tree_enable)", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -3897,7 +3898,7 @@ "minimum_value": "0", "maximum_value": "100", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_roof_enable and support_enable", + "enabled": "support_roof_enable and (support_enable or support_tree_enable)", "value": "extruderValue(support_roof_extruder_nr, 'support_interface_density')", "settable_per_mesh": false, "settable_per_extruder": true, @@ -3914,7 +3915,7 @@ "minimum_value_warning": "support_roof_line_width - 0.0001", "value": "0 if support_roof_density == 0 else (support_roof_line_width * 100) / support_roof_density * (2 if support_roof_pattern == 'grid' else (3 if support_roof_pattern == 'triangles' else 1))", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_roof_enable and support_enable", + "enabled": "support_roof_enable and (support_enable or support_tree_enable)", "settable_per_mesh": false, "settable_per_extruder": true } @@ -3971,7 +3972,7 @@ }, "default_value": "concentric", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "support_interface_enable and support_enable", + "enabled": "support_interface_enable and (support_enable or support_tree_enable)", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -3993,7 +3994,7 @@ "default_value": "concentric", "value": "extruderValue(support_roof_extruder_nr, 'support_interface_pattern')", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_roof_enable and support_enable", + "enabled": "support_roof_enable and (support_enable or support_tree_enable)", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -4014,7 +4015,7 @@ "default_value": "concentric", "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_pattern')", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_bottom_enable and support_enable", + "enabled": "support_bottom_enable and (support_enable or support_tree_enable)", "settable_per_mesh": false, "settable_per_extruder": true } From 7a8d9047c8900c33781ce15a2e4559f6ff0b641e Mon Sep 17 00:00:00 2001 From: Brecht Nuyttens Date: Tue, 14 Nov 2017 13:59:06 +0100 Subject: [PATCH 016/551] Another Fix for Vertex Delta definition --- resources/definitions/vertex_delta_k8800.def.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/definitions/vertex_delta_k8800.def.json b/resources/definitions/vertex_delta_k8800.def.json index ddfa54f4c8..dff1c52d0d 100644 --- a/resources/definitions/vertex_delta_k8800.def.json +++ b/resources/definitions/vertex_delta_k8800.def.json @@ -10,9 +10,6 @@ "author": "Velleman" }, "overrides": { - "material_diameter": { - "default_value": 1.75, - }, "machine_width": { "default_value": 200 }, @@ -45,6 +42,9 @@ }, "gantry_height": { "default_value": 0 + }, + "material_diameter": { + "default_value": 1.75 }, "machine_nozzle_offset_x_1": { "default_value": 0 From dd66574464b5e565863472668c05f7f0b2d8548b Mon Sep 17 00:00:00 2001 From: Brecht Nuyttens Date: Tue, 14 Nov 2017 14:14:59 +0100 Subject: [PATCH 017/551] Removed tabs and replaced by spaces --- resources/definitions/vertex_delta_k8800.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/vertex_delta_k8800.def.json b/resources/definitions/vertex_delta_k8800.def.json index dff1c52d0d..e62f61e29f 100644 --- a/resources/definitions/vertex_delta_k8800.def.json +++ b/resources/definitions/vertex_delta_k8800.def.json @@ -43,7 +43,7 @@ "gantry_height": { "default_value": 0 }, - "material_diameter": { + "material_diameter": { "default_value": 1.75 }, "machine_nozzle_offset_x_1": { From 7c85b222b2cff55deb93d42e4431bc264c08c58b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 14 Nov 2017 17:45:45 +0100 Subject: [PATCH 018/551] Don't use support infill by default when printing tree support Only when using area support really. Contributes to issue CURA-4523. --- 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 ef107be412..ee6996b2de 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3488,6 +3488,7 @@ "minimum_value": "0", "maximum_value_warning": "100", "default_value": 15, + "value": "15 if support_enable else 0", "enabled": "support_enable or support_tree_enable", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, From fc187d100a6aaf37e3ef3dd22ea30b84c694f9fe Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 15 Nov 2017 16:00:42 +0100 Subject: [PATCH 019/551] Add setting to tweak collision area sampling resolution Because this can make a lot of difference for the slice time and the stability of the support. Contributes to issue CURA-4523. --- resources/definitions/fdmprinter.def.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ee6996b2de..db2ee3dc90 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3722,6 +3722,22 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "support_tree_collision_resolution": + { + "label": "Tree Support Collision Resolution", + "description": "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically.", + "unit": "mm", + "type": "float", + "minimum_value": "0.001", + "minimum_value_warning": "support_line_width / 4", + "maximum_value_warning": "support_line_width * 2", + "default_value": 0.4, + "value": "support_line_width", + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable and support_tree_branch_diameter_angle > 0", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "support_tree_wall_thickness": { "label": "Tree Support Wall Thickness", From e35fba6f05d5d86a47db7a1f7d26138445a2155e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 17 Nov 2017 15:05:08 +0100 Subject: [PATCH 020/551] Added first stubs for printer output models CL-541 --- cura/PrinterOutput/ExtruderModel.py | 76 ++++++++++++++++++ cura/PrinterOutput/MaterialModel.py | 29 +++++++ cura/PrinterOutput/PrintJobModel.py | 10 +++ cura/PrinterOutput/PrinterModel.py | 115 ++++++++++++++++++++++++++++ cura/PrinterOutput/__init__.py | 0 5 files changed, 230 insertions(+) create mode 100644 cura/PrinterOutput/ExtruderModel.py create mode 100644 cura/PrinterOutput/MaterialModel.py create mode 100644 cura/PrinterOutput/PrintJobModel.py create mode 100644 cura/PrinterOutput/PrinterModel.py create mode 100644 cura/PrinterOutput/__init__.py diff --git a/cura/PrinterOutput/ExtruderModel.py b/cura/PrinterOutput/ExtruderModel.py new file mode 100644 index 0000000000..f08b21aaac --- /dev/null +++ b/cura/PrinterOutput/ExtruderModel.py @@ -0,0 +1,76 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot +from UM.Logger import Logger + +from typing import Optional + +MYPY = False +if MYPY: + from cura.PrinterOutput.PrinterModel import PrinterModel + from cura.PrinterOutput.MaterialModel import MaterialModel + + +class ExtruderModel(QObject): + hotendIDChanged = pyqtSignal() + targetHotendTemperatureChanged = pyqtSignal() + hotendTemperatureChanged = pyqtSignal() + activeMaterialChanged = pyqtSignal() + + def __init__(self, printer: "PrinterModel", parent=None): + super().__init__(parent) + self._printer = printer + self._target_hotend_temperature = 0 + self._hotend_temperature = 0 + self._hotend_id = "" + self._active_material = None # type: Optional[MaterialModel] + + @pyqtProperty(QObject, notify = activeMaterialChanged) + def activeMaterial(self) -> "MaterialModel": + return self._active_material + + def updateActiveMaterial(self, material: Optional["MaterialModel"]): + if self._active_material != material: + self._active_material = material + self.activeMaterialChanged.emit() + + ## Update the hotend temperature. This only changes it locally. + def updateHotendTemperature(self, temperature: int): + if self._hotend_temperature != temperature: + self._hotend_temperature = temperature + self.hotendTemperatureChanged.emit() + + def updateTargetHotendTemperature(self, temperature: int): + if self._target_hotend_temperature != temperature: + self._target_hotend_temperature = temperature + self.targetHotendTemperatureChanged.emit() + + ## Set the target hotend temperature. This ensures that it's actually sent to the remote. + @pyqtSlot(int) + def setTargetHotendTemperature(self, temperature: int): + self._setTargetHotendTemperature(temperature) + self.updateTargetHotendTemperature(temperature) + + @pyqtProperty(int, notify = targetHotendTemperatureChanged) + def targetHotendTemperature(self) -> int: + return self._target_hotend_temperature + + @pyqtProperty(int, notify=hotendTemperatureChanged) + def hotendTemperature(self) -> int: + return self._hotendTemperature + + ## Protected setter for the hotend temperature of the connected printer (if any). + # /parameter temperature Temperature hotend needs to go to (in deg celsius) + # /sa setTargetHotendTemperature + def _setTargetHotendTemperature(self, temperature): + Logger.log("w", "_setTargetHotendTemperature is not implemented by this model") + + @pyqtProperty(str, notify = hotendIDChanged) + def hotendID(self) -> str: + return self._hotend_id + + def updateHotendID(self, id: str): + if self._hotend_id != id: + self._hotend_id = id + self.hotendIDChanged.emit() diff --git a/cura/PrinterOutput/MaterialModel.py b/cura/PrinterOutput/MaterialModel.py new file mode 100644 index 0000000000..41a3680d57 --- /dev/null +++ b/cura/PrinterOutput/MaterialModel.py @@ -0,0 +1,29 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot + + +class MaterialModel(QObject): + def __init__(self, guid, type, color, brand, parent = None): + super().__init__(parent) + self._guid = guid + self._type = type + self._color = color + self._brand = brand + + @pyqtProperty(str, constant = True) + def guid(self): + return self._guid + + @pyqtProperty(str, constant=True) + def type(self): + return self._type + + @pyqtProperty(str, constant=True) + def brand(self): + return self._brand + + @pyqtProperty(str, constant=True) + def color(self): + return self._color \ No newline at end of file diff --git a/cura/PrinterOutput/PrintJobModel.py b/cura/PrinterOutput/PrintJobModel.py new file mode 100644 index 0000000000..9b7952322a --- /dev/null +++ b/cura/PrinterOutput/PrintJobModel.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant + + +class PrintJobModel(QObject): + + def __init__(self, parent=None): + super().__init__(parent) \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterModel.py b/cura/PrinterOutput/PrinterModel.py new file mode 100644 index 0000000000..72933ed22a --- /dev/null +++ b/cura/PrinterOutput/PrinterModel.py @@ -0,0 +1,115 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot +from UM.Logger import Logger +from typing import Optional, List + +MYPY = False +if MYPY: + from cura.PrinterOutput.PrintJobModel import PrintJobModel + from cura.PrinterOutput.ExtruderModel import ExtruderModel + + +class PrinterModel(QObject): + bedTemperatureChanged = pyqtSignal() + targetBedTemperatureChanged = pyqtSignal() + printerStateChanged = pyqtSignal() + activePrintJobChanged = pyqtSignal() + nameChanged = pyqtSignal() + + def __init__(self, parent=None): + super().__init__(parent) + self._bed_temperature = 0 + self._target_bed_temperature = 0 + self._name = "" + + self._extruders = [] # type: List[ExtruderModel] + + self._active_print_job = None # type: Optional[PrintJobModel] + + # Features of the printer; + self._can_pause = True + self._can_abort = True + self._can_pre_heat_bed = True + self._can_control_manually = True + + @pyqtProperty(str, notify=nameChanged) + def name(self): + return self._name + + def setName(self, name): + self._setName(name) + self.updateName(name) + + def _setName(self, name): + Logger.log("w", "_setTargetBedTemperature is not implemented by this model") + + def updateName(self, name): + if self._name != name: + self._name = name + self.nameChanged.emit() + + ## Update the bed temperature. This only changes it locally. + def updateBedTemperature(self, temperature): + if self._bed_temperature != temperature: + self._bed_temperature = temperature + self.bedTemperatureChanged.emit() + + def updateTargetBedTemperature(self, temperature): + if self._target_bed_temperature != temperature: + self._target_bed_temperature = temperature + self.targetBedTemperatureChanged.emit() + + ## Set the target bed temperature. This ensures that it's actually sent to the remote. + @pyqtSlot(int) + def setTargetBedTemperature(self, temperature): + self._setTargetBedTemperature(temperature) + self.updateTargetBedTemperature(temperature) + + ## Protected setter for the bed temperature of the connected printer (if any). + # /parameter temperature Temperature bed needs to go to (in deg celsius) + # /sa setTargetBedTemperature + def _setTargetBedTemperature(self, temperature): + Logger.log("w", "_setTargetBedTemperature is not implemented by this model") + + def updateActivePrintJob(self, print_job): + if self._active_print_job != print_job: + self._active_print_job = print_job + self.activePrintJobChanged.emit() + + @pyqtProperty(QObject, notify = activePrintJobChanged) + def activePrintJob(self): + return self._active_print_job + + @pyqtProperty(str, notify=printerStateChanged) + def printerState(self): + return self._printer_state + + @pyqtProperty(int, notify = bedTemperatureChanged) + def bedTemperature(self): + return self._bed_temperature + + @pyqtProperty(int, notify=targetBedTemperatureChanged) + def targetBedTemperature(self): + return self._target_bed_temperature + + # Does the printer support pre-heating the bed at all + @pyqtProperty(bool, constant=True) + def canPreHeatBed(self): + return self._can_pre_heat_bed + + # Does the printer support pause at all + @pyqtProperty(bool, constant=True) + def canPause(self): + return self._can_pause + + # Does the printer support abort at all + @pyqtProperty(bool, constant=True) + def canAbort(self): + return self._can_abort + + # Does the printer support manual control at all + @pyqtProperty(bool, constant=True) + def canControlManually(self): + return self._can_control_manually diff --git a/cura/PrinterOutput/__init__.py b/cura/PrinterOutput/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From 700f7179f1d5cbfed9b88aa56ee41d7c56c07cd8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 17 Nov 2017 16:05:28 +0100 Subject: [PATCH 021/551] Rename models to prevent conflict --- .../{ExtruderModel.py => ExtruderOuputModel.py} | 14 +++++++------- .../{MaterialModel.py => MaterialOutputModel.py} | 2 +- .../{PrintJobModel.py => PrintJobOutputModel.py} | 2 +- .../{PrinterModel.py => PrinterOutputModel.py} | 10 +++++----- 4 files changed, 14 insertions(+), 14 deletions(-) rename cura/PrinterOutput/{ExtruderModel.py => ExtruderOuputModel.py} (84%) rename cura/PrinterOutput/{MaterialModel.py => MaterialOutputModel.py} (91%) rename cura/PrinterOutput/{PrintJobModel.py => PrintJobOutputModel.py} (75%) rename cura/PrinterOutput/{PrinterModel.py => PrinterOutputModel.py} (93%) diff --git a/cura/PrinterOutput/ExtruderModel.py b/cura/PrinterOutput/ExtruderOuputModel.py similarity index 84% rename from cura/PrinterOutput/ExtruderModel.py rename to cura/PrinterOutput/ExtruderOuputModel.py index f08b21aaac..d465b7250a 100644 --- a/cura/PrinterOutput/ExtruderModel.py +++ b/cura/PrinterOutput/ExtruderOuputModel.py @@ -8,29 +8,29 @@ from typing import Optional MYPY = False if MYPY: - from cura.PrinterOutput.PrinterModel import PrinterModel - from cura.PrinterOutput.MaterialModel import MaterialModel + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel -class ExtruderModel(QObject): +class ExtruderOutputModel(QObject): hotendIDChanged = pyqtSignal() targetHotendTemperatureChanged = pyqtSignal() hotendTemperatureChanged = pyqtSignal() activeMaterialChanged = pyqtSignal() - def __init__(self, printer: "PrinterModel", parent=None): + def __init__(self, printer: "PrinterOutputModel", parent=None): super().__init__(parent) self._printer = printer self._target_hotend_temperature = 0 self._hotend_temperature = 0 self._hotend_id = "" - self._active_material = None # type: Optional[MaterialModel] + self._active_material = None # type: Optional[MaterialOutputModel] @pyqtProperty(QObject, notify = activeMaterialChanged) - def activeMaterial(self) -> "MaterialModel": + def activeMaterial(self) -> "MaterialOutputModel": return self._active_material - def updateActiveMaterial(self, material: Optional["MaterialModel"]): + def updateActiveMaterial(self, material: Optional["MaterialOutputModel"]): if self._active_material != material: self._active_material = material self.activeMaterialChanged.emit() diff --git a/cura/PrinterOutput/MaterialModel.py b/cura/PrinterOutput/MaterialOutputModel.py similarity index 91% rename from cura/PrinterOutput/MaterialModel.py rename to cura/PrinterOutput/MaterialOutputModel.py index 41a3680d57..0471b85db8 100644 --- a/cura/PrinterOutput/MaterialModel.py +++ b/cura/PrinterOutput/MaterialOutputModel.py @@ -4,7 +4,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot -class MaterialModel(QObject): +class MaterialOutputModel(QObject): def __init__(self, guid, type, color, brand, parent = None): super().__init__(parent) self._guid = guid diff --git a/cura/PrinterOutput/PrintJobModel.py b/cura/PrinterOutput/PrintJobOutputModel.py similarity index 75% rename from cura/PrinterOutput/PrintJobModel.py rename to cura/PrinterOutput/PrintJobOutputModel.py index 9b7952322a..b2eb3824e3 100644 --- a/cura/PrinterOutput/PrintJobModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -4,7 +4,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant -class PrintJobModel(QObject): +class PrintJobOutputModel(QObject): def __init__(self, parent=None): super().__init__(parent) \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterModel.py b/cura/PrinterOutput/PrinterOutputModel.py similarity index 93% rename from cura/PrinterOutput/PrinterModel.py rename to cura/PrinterOutput/PrinterOutputModel.py index 72933ed22a..ec1a268631 100644 --- a/cura/PrinterOutput/PrinterModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -7,11 +7,11 @@ from typing import Optional, List MYPY = False if MYPY: - from cura.PrinterOutput.PrintJobModel import PrintJobModel - from cura.PrinterOutput.ExtruderModel import ExtruderModel + from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel -class PrinterModel(QObject): +class PrinterOutputModel(QObject): bedTemperatureChanged = pyqtSignal() targetBedTemperatureChanged = pyqtSignal() printerStateChanged = pyqtSignal() @@ -24,9 +24,9 @@ class PrinterModel(QObject): self._target_bed_temperature = 0 self._name = "" - self._extruders = [] # type: List[ExtruderModel] + self._extruders = [] # type: List[ExtruderOutputModel] - self._active_print_job = None # type: Optional[PrintJobModel] + self._active_print_job = None # type: Optional[PrintJobOutputModel] # Features of the printer; self._can_pause = True From 3a8eef9768721f7d3a95ac89e8a7e67b9da813d9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 17 Nov 2017 16:25:44 +0100 Subject: [PATCH 022/551] Added a printerOutputController to send commands to remote. The idea is that this class can be subclassed. CL-541 --- cura/PrinterOutput/ExtruderOuputModel.py | 8 +--- cura/PrinterOutput/PrintJobOutputModel.py | 44 ++++++++++++++++++- cura/PrinterOutput/PrinterOutputController.py | 21 +++++++++ cura/PrinterOutput/PrinterOutputModel.py | 19 +++----- 4 files changed, 71 insertions(+), 21 deletions(-) create mode 100644 cura/PrinterOutput/PrinterOutputController.py diff --git a/cura/PrinterOutput/ExtruderOuputModel.py b/cura/PrinterOutput/ExtruderOuputModel.py index d465b7250a..121e9a69d9 100644 --- a/cura/PrinterOutput/ExtruderOuputModel.py +++ b/cura/PrinterOutput/ExtruderOuputModel.py @@ -49,7 +49,7 @@ class ExtruderOutputModel(QObject): ## Set the target hotend temperature. This ensures that it's actually sent to the remote. @pyqtSlot(int) def setTargetHotendTemperature(self, temperature: int): - self._setTargetHotendTemperature(temperature) + self._printer.getController().setTargetHotendTemperature(self._printer, self, temperature) self.updateTargetHotendTemperature(temperature) @pyqtProperty(int, notify = targetHotendTemperatureChanged) @@ -60,12 +60,6 @@ class ExtruderOutputModel(QObject): def hotendTemperature(self) -> int: return self._hotendTemperature - ## Protected setter for the hotend temperature of the connected printer (if any). - # /parameter temperature Temperature hotend needs to go to (in deg celsius) - # /sa setTargetHotendTemperature - def _setTargetHotendTemperature(self, temperature): - Logger.log("w", "_setTargetHotendTemperature is not implemented by this model") - @pyqtProperty(str, notify = hotendIDChanged) def hotendID(self) -> str: return self._hotend_id diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index b2eb3824e3..1e0d82f1b0 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -2,9 +2,49 @@ # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant +MYPY = False +if MYPY: + from cura.PrinterOutput.PrinterOutputController import PrinterOutputController class PrintJobOutputModel(QObject): + stateChanged = pyqtSignal() + timeTotalChanged = pyqtSignal() + timeElapsedChanged = pyqtSignal() - def __init__(self, parent=None): - super().__init__(parent) \ No newline at end of file + def __init__(self, output_controller: "PrinterOutputController", parent=None): + super().__init__(parent) + self._output_controller = output_controller + self._state = "" + self._time_total = 0 + self._time_elapsed = 0 + + @pyqtProperty(int, notify = timeTotalChanged) + def timeTotal(self): + return self._time_total + + @pyqtProperty(int, notify = timeElapsedChanged) + def timeElapsed(self): + return self._time_elapsed + + @pyqtProperty(str, notify=stateChanged) + def state(self): + return self._state + + def updateTimeTotal(self, new_time_total): + if self._time_total != new_time_total: + self._time_total = new_time_total + self.timeTotalChanged.emit() + + def updateTimeElapsed(self, new_time_elapsed): + if self._time_elapsed != new_time_elapsed: + self._time_elapsed = new_time_elapsed + self.timeElapsedChanged.emit() + + def updateState(self, new_state): + if self._state != new_state: + self._state = new_state + self.stateChanged.emit() + + def setState(self, state): + self._output_controller.setJobState(self, state) \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py new file mode 100644 index 0000000000..c69b49e6e3 --- /dev/null +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -0,0 +1,21 @@ + + +MYPY = False +if MYPY: + from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + from cura.PrinterOutput.ExtruderOuputModel import ExtruderOuputModel + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + +class PrinterOutputController: + def __init__(self): + pass + + def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOuputModel", temperature: int): + # TODO: implement + pass + + def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int): + pass + + def setJobState(self, job: "PrintJobOutputModel", state: str): + pass \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index ec1a268631..d34883a56b 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -9,6 +9,7 @@ MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel + from cura.PrinterOutput.PrinterOutputController import PrinterOutputController class PrinterOutputModel(QObject): @@ -18,12 +19,12 @@ class PrinterOutputModel(QObject): activePrintJobChanged = pyqtSignal() nameChanged = pyqtSignal() - def __init__(self, parent=None): + def __init__(self, output_controller: "PrinterOutputController", parent=None): super().__init__(parent) self._bed_temperature = 0 self._target_bed_temperature = 0 self._name = "" - + self._controller = output_controller self._extruders = [] # type: List[ExtruderOutputModel] self._active_print_job = None # type: Optional[PrintJobOutputModel] @@ -34,6 +35,9 @@ class PrinterOutputModel(QObject): self._can_pre_heat_bed = True self._can_control_manually = True + def getController(self): + return self._controller + @pyqtProperty(str, notify=nameChanged) def name(self): return self._name @@ -42,9 +46,6 @@ class PrinterOutputModel(QObject): self._setName(name) self.updateName(name) - def _setName(self, name): - Logger.log("w", "_setTargetBedTemperature is not implemented by this model") - def updateName(self, name): if self._name != name: self._name = name @@ -64,15 +65,9 @@ class PrinterOutputModel(QObject): ## Set the target bed temperature. This ensures that it's actually sent to the remote. @pyqtSlot(int) def setTargetBedTemperature(self, temperature): - self._setTargetBedTemperature(temperature) + self._controller.setTargetBedTemperature(self, temperature) self.updateTargetBedTemperature(temperature) - ## Protected setter for the bed temperature of the connected printer (if any). - # /parameter temperature Temperature bed needs to go to (in deg celsius) - # /sa setTargetBedTemperature - def _setTargetBedTemperature(self, temperature): - Logger.log("w", "_setTargetBedTemperature is not implemented by this model") - def updateActivePrintJob(self, print_job): if self._active_print_job != print_job: self._active_print_job = print_job From f0a8db3d4ea3de703ae129d29d7017b3298fcc5e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 17 Nov 2017 16:48:36 +0100 Subject: [PATCH 023/551] Add way to set head position CL-541 --- cura/PrinterOutput/PrinterOutputController.py | 12 ++++ cura/PrinterOutput/PrinterOutputModel.py | 58 ++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index c69b49e6e3..be077dd352 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -18,4 +18,16 @@ class PrinterOutputController: pass def setJobState(self, job: "PrintJobOutputModel", state: str): + pass + + def cancelPreheatBed(self, printer: "PrinterOutputModel"): + pass + + def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): + pass + + def setHeadPosition(self, printer: "PrinterOutputModel", x, y, z, speed): + pass + + def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): pass \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index d34883a56b..407a433bb4 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -4,6 +4,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot from UM.Logger import Logger from typing import Optional, List +from UM.Math.Vector import Vector MYPY = False if MYPY: @@ -18,15 +19,19 @@ class PrinterOutputModel(QObject): printerStateChanged = pyqtSignal() activePrintJobChanged = pyqtSignal() nameChanged = pyqtSignal() + headPositionChanged = pyqtSignal() - def __init__(self, output_controller: "PrinterOutputController", parent=None): + def __init__(self, output_controller: "PrinterOutputController", extruders: Optional["ExtruderOutputModel"] = None, parent=None): super().__init__(parent) self._bed_temperature = 0 self._target_bed_temperature = 0 self._name = "" self._controller = output_controller self._extruders = [] # type: List[ExtruderOutputModel] + if self._extruders is not None: + self._extruders = extruders + self._head_position = Vector(0, 0, 0) self._active_print_job = None # type: Optional[PrintJobOutputModel] # Features of the printer; @@ -35,6 +40,57 @@ class PrinterOutputModel(QObject): self._can_pre_heat_bed = True self._can_control_manually = True + @pyqtProperty("QVariantList", constant = True) + def extruders(self): + return self._extruders + + @pyqtProperty(QVariant, notify = headPositionChanged) + def headPosition(self): + return {"x": self._head_position.x, "y": self._head_position.y, "z": self.head_position_z} + + def updateHeadPosition(self, x, y, z): + if self._head_position.x != x or self._head_position.y != y or self._head_position.z != z: + self._head_position = Vector(x, y, z) + self.headPositionChanged.emit() + + @pyqtProperty("long", "long", "long") + @pyqtProperty("long", "long", "long", "long") + def setHeadPosition(self, x, y, z, speed = 3000): + self._controller.setHeadPosition(self, x, y, z, speed) + + @pyqtProperty("long") + @pyqtProperty("long", "long") + def setHeadX(self, x, speed = 3000): + self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed) + + @pyqtProperty("long") + @pyqtProperty("long", "long") + def setHeadY(self, y, speed = 3000): + self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed) + + @pyqtProperty("long") + @pyqtProperty("long", "long") + def setHeadY(self, z, speed = 3000): + self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed) + + @pyqtSlot("long", "long", "long") + @pyqtSlot("long", "long", "long", "long") + def moveHead(self, x = 0, y = 0, z = 0, speed = 3000): + self._controller.moveHead(self, x, y, z, speed) + + ## Pre-heats the heated bed of the printer. + # + # \param temperature The temperature to heat the bed to, in degrees + # Celsius. + # \param duration How long the bed should stay warm, in seconds. + @pyqtSlot(float, float) + def preheatBed(self, temperature, duration): + self._controller.preheatBed(self, temperature, duration) + + @pyqtSlot() + def cancelPreheatBed(self): + self._controller.cancelPreheatBed(self) + def getController(self): return self._controller From 00a5127b192325c99d5f2e5e23850cebade54e8c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 17 Nov 2017 17:00:09 +0100 Subject: [PATCH 024/551] Added home head & bed CL-541 --- cura/PrinterOutput/PrinterOutputController.py | 6 ++++++ cura/PrinterOutput/PrinterOutputModel.py | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index be077dd352..0625a8ef9f 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -30,4 +30,10 @@ class PrinterOutputController: pass def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): + pass + + def homeBed(self, printer): + pass + + def homeHead(self, printer): pass \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 407a433bb4..ab8ca83ec6 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -40,6 +40,14 @@ class PrinterOutputModel(QObject): self._can_pre_heat_bed = True self._can_control_manually = True + @pyqtSlot() + def homeHead(self): + self._controller.homeHead(self) + + @pyqtSlot() + def homeBed(self): + self._controller.homeBed(self) + @pyqtProperty("QVariantList", constant = True) def extruders(self): return self._extruders From b63880e57f34e2ebeea1de292fac845263adf91e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 17 Nov 2017 17:00:32 +0100 Subject: [PATCH 025/551] Printer Output model now must have at least one extruder CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index ab8ca83ec6..00644980b4 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -21,15 +21,13 @@ class PrinterOutputModel(QObject): nameChanged = pyqtSignal() headPositionChanged = pyqtSignal() - def __init__(self, output_controller: "PrinterOutputController", extruders: Optional["ExtruderOutputModel"] = None, parent=None): + def __init__(self, output_controller: "PrinterOutputController", extruders: List["ExtruderOutputModel"], parent=None): super().__init__(parent) self._bed_temperature = 0 self._target_bed_temperature = 0 self._name = "" self._controller = output_controller - self._extruders = [] # type: List[ExtruderOutputModel] - if self._extruders is not None: - self._extruders = extruders + self._extruders = extruders self._head_position = Vector(0, 0, 0) self._active_print_job = None # type: Optional[PrintJobOutputModel] From 22f2279a768fa79c40e51418b1cf2fde2bd1586f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 10:59:57 +0100 Subject: [PATCH 026/551] Moved bunch of code from the old location to the new bits in archtiecture CL-541 --- .../NetworkedPrinterOutputDevice.py | 71 ++ cura/PrinterOutput/PrinterOutputController.py | 1 + cura/PrinterOutputDevice.py | 620 +----------------- .../UM3PrinterOutputDevicePlugin.py | 2 + 4 files changed, 92 insertions(+), 602 deletions(-) create mode 100644 cura/PrinterOutput/NetworkedPrinterOutputDevice.py create mode 100644 plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py new file mode 100644 index 0000000000..dc02fa839d --- /dev/null +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -0,0 +1,71 @@ +from UM.Application import Application +from cura.PrinterOutputDevice import PrinterOutputDevice + +from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply +from PyQt5.QtCore import QUrl + +from time import time +from typing import Callable + +class NetworkedPrinterOutputDevice(PrinterOutputDevice): + def __init__(self, device_id, parent = None): + super().__init__(device_id = device_id, parent = parent) + self._manager = None + self._createNetworkManager() + self._last_response_time = time() + self._last_request_time = None + self._api_prefix = "" + self._address = "" + + self._user_agent = "%s/%s " % (Application.getInstance().getApplicationName(), Application.getInstance().getVersion()) + + self._onFinishedCallbacks = {} + + def _update(self): + if not self._manager.networkAccessible(): + pass # TODO: no internet connection. + + pass + + def _createEmptyRequest(self, target): + url = QUrl("http://" + self._address + self._api_prefix + target) + request = QNetworkRequest(url) + request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") + request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) + return request + + def _put(self, target: str, data: str, onFinished: Callable): + request = self._createEmptyRequest(target) + self._onFinishedCallbacks[request] = onFinished + self._manager.put(request, data.encode()) + + def _get(self, target: str, onFinished: Callable): + request = self._createEmptyRequest(target) + self._onFinishedCallbacks[request] = onFinished + self._manager.get(request) + + def _delete(self, target: str, onFinished: Callable): + pass + + def _post(self, target: str, data: str, onFinished: Callable, onProgress: Callable): + pass + + def _createNetworkManager(self): + if self._manager: + self._manager.finished.disconnect(self.__handleOnFinished) + #self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged) + #self._manager.authenticationRequired.disconnect(self._onAuthenticationRequired) + + self._manager = QNetworkAccessManager() + self._manager.finished.connect(self.__handleOnFinished) + #self._manager.authenticationRequired.connect(self._onAuthenticationRequired) + #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes + + def __handleOnFinished(self, reply: QNetworkReply): + self._last_response_time = time() + try: + self._onFinishedCallbacks[reply.request()](reply) + del self._onFinishedCallbacks[reply.request] # Remove the callback. + except Exception as e: + print("Something went wrong with callback", e) + pass \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index 0625a8ef9f..9f9a26a2a5 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -6,6 +6,7 @@ if MYPY: from cura.PrinterOutput.ExtruderOuputModel import ExtruderOuputModel from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + class PrinterOutputController: def __init__(self): pass diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 837ecc97c6..3f12c2f40c 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -5,13 +5,10 @@ from UM.i18n import i18nCatalog from UM.OutputDevice.OutputDevice import OutputDevice from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl from PyQt5.QtQml import QQmlComponent, QQmlContext -from PyQt5.QtWidgets import QMessageBox from enum import IntEnum # For the connection state tracking. -from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Logger import Logger from UM.Signal import signalemitter -from UM.PluginRegistry import PluginRegistry from UM.Application import Application import os @@ -29,38 +26,12 @@ i18n_catalog = i18nCatalog("cura") # For all other uses it should be used in the same way as a "regular" OutputDevice. @signalemitter class PrinterOutputDevice(QObject, OutputDevice): + printersChanged = pyqtSignal + def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) - self._container_registry = ContainerRegistry.getInstance() - self._target_bed_temperature = 0 - self._bed_temperature = 0 - self._num_extruders = 1 - self._hotend_temperatures = [0] * self._num_extruders - self._target_hotend_temperatures = [0] * self._num_extruders - self._material_ids = [""] * self._num_extruders - self._hotend_ids = [""] * self._num_extruders - self._progress = 0 - self._head_x = 0 - self._head_y = 0 - self._head_z = 0 - self._connection_state = ConnectionState.closed - self._connection_text = "" - self._time_elapsed = 0 - self._time_total = 0 - self._job_state = "" - self._job_name = "" - self._error_text = "" - self._accepts_commands = True - self._preheat_bed_timeout = 900 # Default time-out for pre-heating the bed, in seconds. - self._preheat_bed_timer = QTimer() # Timer that tracks how long to preheat still. - self._preheat_bed_timer.setSingleShot(True) - self._preheat_bed_timer.timeout.connect(self.cancelPreheatBed) - - self._printer_state = "" - self._printer_type = "unknown" - - self._camera_active = False + self._printers = [] self._monitor_view_qml_path = "" self._monitor_component = None @@ -71,84 +42,24 @@ class PrinterOutputDevice(QObject, OutputDevice): self._control_item = None self._qml_context = None - self._can_pause = True - self._can_abort = True - self._can_pre_heat_bed = True - self._can_control_manually = True + + self._update_timer = QTimer() + self._update_timer.setInterval(2000) # TODO; Add preference for update interval + self._update_timer.setSingleShot(False) + self._update_timer.timeout.connect(self._update) + + def _update(self): + pass def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None): raise NotImplementedError("requestWrite needs to be implemented") - ## Signals + @pyqtProperty(QObject, notify = printersChanged) + def activePrinter(self): + if len(self._printers): - # Signal to be emitted when bed temp is changed - bedTemperatureChanged = pyqtSignal() - - # Signal to be emitted when target bed temp is changed - targetBedTemperatureChanged = pyqtSignal() - - # Signal when the progress is changed (usually when this output device is printing / sending lots of data) - progressChanged = pyqtSignal() - - # Signal to be emitted when hotend temp is changed - hotendTemperaturesChanged = pyqtSignal() - - # Signal to be emitted when target hotend temp is changed - targetHotendTemperaturesChanged = pyqtSignal() - - # Signal to be emitted when head position is changed (x,y,z) - headPositionChanged = pyqtSignal() - - # Signal to be emitted when either of the material ids is changed - materialIdChanged = pyqtSignal(int, str, arguments = ["index", "id"]) - - # Signal to be emitted when either of the hotend ids is changed - hotendIdChanged = pyqtSignal(int, str, arguments = ["index", "id"]) - - # Signal that is emitted every time connection state is changed. - # it also sends it's own device_id (for convenience sake) - connectionStateChanged = pyqtSignal(str) - - connectionTextChanged = pyqtSignal() - - timeElapsedChanged = pyqtSignal() - - timeTotalChanged = pyqtSignal() - - jobStateChanged = pyqtSignal() - - jobNameChanged = pyqtSignal() - - errorTextChanged = pyqtSignal() - - acceptsCommandsChanged = pyqtSignal() - - printerStateChanged = pyqtSignal() - - printerTypeChanged = pyqtSignal() - - # Signal to be emitted when some drastic change occurs in the remaining time (not when the time just passes on normally). - preheatBedRemainingTimeChanged = pyqtSignal() - - # Does the printer support pre-heating the bed at all - @pyqtProperty(bool, constant=True) - def canPreHeatBed(self): - return self._can_pre_heat_bed - - # Does the printer support pause at all - @pyqtProperty(bool, constant=True) - def canPause(self): - return self._can_pause - - # Does the printer support abort at all - @pyqtProperty(bool, constant=True) - def canAbort(self): - return self._can_abort - - # Does the printer support manual control at all - @pyqtProperty(bool, constant=True) - def canControlManually(self): - return self._can_control_manually + return self._printers[0] + return None @pyqtProperty(QObject, constant=True) def monitorItem(self): @@ -204,513 +115,18 @@ class PrinterOutputDevice(QObject, OutputDevice): Logger.log("e", "QQmlComponent status %s", self._monitor_component.status()) Logger.log("e", "QQmlComponent error string %s", self._monitor_component.errorString()) - @pyqtProperty(str, notify=printerTypeChanged) - def printerType(self): - return self._printer_type - - @pyqtProperty(str, notify=printerStateChanged) - def printerState(self): - return self._printer_state - - @pyqtProperty(str, notify = jobStateChanged) - def jobState(self): - return self._job_state - - def _updatePrinterType(self, printer_type): - if self._printer_type != printer_type: - self._printer_type = printer_type - self.printerTypeChanged.emit() - - def _updatePrinterState(self, printer_state): - if self._printer_state != printer_state: - self._printer_state = printer_state - self.printerStateChanged.emit() - - def _updateJobState(self, job_state): - if self._job_state != job_state: - self._job_state = job_state - self.jobStateChanged.emit() - - @pyqtSlot(str) - def setJobState(self, job_state): - self._setJobState(job_state) - - def _setJobState(self, job_state): - Logger.log("w", "_setJobState is not implemented by this output device") - - @pyqtSlot() - def startCamera(self): - self._camera_active = True - self._startCamera() - - def _startCamera(self): - Logger.log("w", "_startCamera is not implemented by this output device") - - @pyqtSlot() - def stopCamera(self): - self._camera_active = False - self._stopCamera() - - def _stopCamera(self): - Logger.log("w", "_stopCamera is not implemented by this output device") - - @pyqtProperty(str, notify = jobNameChanged) - def jobName(self): - return self._job_name - - def setJobName(self, name): - if self._job_name != name: - self._job_name = name - self.jobNameChanged.emit() - - ## Gives a human-readable address where the device can be found. - @pyqtProperty(str, constant = True) - def address(self): - Logger.log("w", "address is not implemented by this output device.") - - ## A human-readable name for the device. - @pyqtProperty(str, constant = True) - def name(self): - Logger.log("w", "name is not implemented by this output device.") - return "" - - @pyqtProperty(str, notify = errorTextChanged) - def errorText(self): - return self._error_text - - ## Set the error-text that is shown in the print monitor in case of an error - def setErrorText(self, error_text): - if self._error_text != error_text: - self._error_text = error_text - self.errorTextChanged.emit() - - @pyqtProperty(bool, notify = acceptsCommandsChanged) - def acceptsCommands(self): - return self._accepts_commands - - ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands - def setAcceptsCommands(self, accepts_commands): - if self._accepts_commands != accepts_commands: - self._accepts_commands = accepts_commands - self.acceptsCommandsChanged.emit() - - ## Get the bed temperature of the bed (if any) - # This function is "final" (do not re-implement) - # /sa _getBedTemperature implementation function - @pyqtProperty(float, notify = bedTemperatureChanged) - def bedTemperature(self): - return self._bed_temperature - - ## Set the (target) bed temperature - # This function is "final" (do not re-implement) - # /param temperature new target temperature of the bed (in deg C) - # /sa _setTargetBedTemperature implementation function - @pyqtSlot(int) - def setTargetBedTemperature(self, temperature): - self._setTargetBedTemperature(temperature) - if self._target_bed_temperature != temperature: - self._target_bed_temperature = temperature - self.targetBedTemperatureChanged.emit() - - ## The total duration of the time-out to pre-heat the bed, in seconds. - # - # \return The duration of the time-out to pre-heat the bed, in seconds. - @pyqtProperty(int, constant = True) - def preheatBedTimeout(self): - return self._preheat_bed_timeout - - ## The remaining duration of the pre-heating of the bed. - # - # This is formatted in M:SS format. - # \return The duration of the time-out to pre-heat the bed, formatted. - @pyqtProperty(str, notify = preheatBedRemainingTimeChanged) - def preheatBedRemainingTime(self): - if not self._preheat_bed_timer.isActive(): - return "" - period = self._preheat_bed_timer.remainingTime() - if period <= 0: - return "" - minutes, period = divmod(period, 60000) #60000 milliseconds in a minute. - seconds, _ = divmod(period, 1000) #1000 milliseconds in a second. - if minutes <= 0 and seconds <= 0: - return "" - return "%d:%02d" % (minutes, seconds) - - ## Time the print has been printing. - # Note that timeTotal - timeElapsed should give time remaining. - @pyqtProperty(float, notify = timeElapsedChanged) - def timeElapsed(self): - return self._time_elapsed - - ## Total time of the print - # Note that timeTotal - timeElapsed should give time remaining. - @pyqtProperty(float, notify=timeTotalChanged) - def timeTotal(self): - return self._time_total - - @pyqtSlot(float) - def setTimeTotal(self, new_total): - if self._time_total != new_total: - self._time_total = new_total - self.timeTotalChanged.emit() - - @pyqtSlot(float) - def setTimeElapsed(self, time_elapsed): - if self._time_elapsed != time_elapsed: - self._time_elapsed = time_elapsed - self.timeElapsedChanged.emit() - - ## Home the head of the connected printer - # This function is "final" (do not re-implement) - # /sa _homeHead implementation function - @pyqtSlot() - def homeHead(self): - self._homeHead() - - ## Home the head of the connected printer - # This is an implementation function and should be overriden by children. - def _homeHead(self): - Logger.log("w", "_homeHead is not implemented by this output device") - - ## Home the bed of the connected printer - # This function is "final" (do not re-implement) - # /sa _homeBed implementation function - @pyqtSlot() - def homeBed(self): - self._homeBed() - - ## Home the bed of the connected printer - # This is an implementation function and should be overriden by children. - # /sa homeBed - def _homeBed(self): - Logger.log("w", "_homeBed is not implemented by this output device") - - ## Protected setter for the bed temperature of the connected printer (if any). - # /parameter temperature Temperature bed needs to go to (in deg celsius) - # /sa setTargetBedTemperature - def _setTargetBedTemperature(self, temperature): - Logger.log("w", "_setTargetBedTemperature is not implemented by this output device") - - ## Pre-heats the heated bed of the printer. - # - # \param temperature The temperature to heat the bed to, in degrees - # Celsius. - # \param duration How long the bed should stay warm, in seconds. - @pyqtSlot(float, float) - def preheatBed(self, temperature, duration): - Logger.log("w", "preheatBed is not implemented by this output device.") - - ## Cancels pre-heating the heated bed of the printer. - # - # If the bed is not pre-heated, nothing happens. - @pyqtSlot() - def cancelPreheatBed(self): - Logger.log("w", "cancelPreheatBed is not implemented by this output device.") - - ## Protected setter for the current bed temperature. - # This simply sets the bed temperature, but ensures that a signal is emitted. - # /param temperature temperature of the bed. - def _setBedTemperature(self, temperature): - if self._bed_temperature != temperature: - self._bed_temperature = temperature - self.bedTemperatureChanged.emit() - - ## Get the target bed temperature if connected printer (if any) - @pyqtProperty(int, notify = targetBedTemperatureChanged) - def targetBedTemperature(self): - return self._target_bed_temperature - - ## Set the (target) hotend temperature - # This function is "final" (do not re-implement) - # /param index the index of the hotend that needs to change temperature - # /param temperature The temperature it needs to change to (in deg celsius). - # /sa _setTargetHotendTemperature implementation function - @pyqtSlot(int, int) - def setTargetHotendTemperature(self, index, temperature): - self._setTargetHotendTemperature(index, temperature) - - if self._target_hotend_temperatures[index] != temperature: - self._target_hotend_temperatures[index] = temperature - self.targetHotendTemperaturesChanged.emit() - - ## Implementation function of setTargetHotendTemperature. - # /param index Index of the hotend to set the temperature of - # /param temperature Temperature to set the hotend to (in deg C) - # /sa setTargetHotendTemperature - def _setTargetHotendTemperature(self, index, temperature): - Logger.log("w", "_setTargetHotendTemperature is not implemented by this output device") - - @pyqtProperty("QVariantList", notify = targetHotendTemperaturesChanged) - def targetHotendTemperatures(self): - return self._target_hotend_temperatures - - @pyqtProperty("QVariantList", notify = hotendTemperaturesChanged) - def hotendTemperatures(self): - return self._hotend_temperatures - - ## Protected setter for the current hotend temperature. - # This simply sets the hotend temperature, but ensures that a signal is emitted. - # /param index Index of the hotend - # /param temperature temperature of the hotend (in deg C) - def _setHotendTemperature(self, index, temperature): - if self._hotend_temperatures[index] != temperature: - self._hotend_temperatures[index] = temperature - self.hotendTemperaturesChanged.emit() - - @pyqtProperty("QVariantList", notify = materialIdChanged) - def materialIds(self): - return self._material_ids - - @pyqtProperty("QVariantList", notify = materialIdChanged) - def materialNames(self): - result = [] - for material_id in self._material_ids: - if material_id is None: - result.append(i18n_catalog.i18nc("@item:material", "No material loaded")) - continue - - containers = self._container_registry.findInstanceContainers(type = "material", GUID = material_id) - if containers: - result.append(containers[0].getName()) - else: - result.append(i18n_catalog.i18nc("@item:material", "Unknown material")) - return result - - ## List of the colours of the currently loaded materials. - # - # The list is in order of extruders. If there is no material in an - # extruder, the colour is shown as transparent. - # - # The colours are returned in hex-format AARRGGBB or RRGGBB - # (e.g. #800000ff for transparent blue or #00ff00 for pure green). - @pyqtProperty("QVariantList", notify = materialIdChanged) - def materialColors(self): - result = [] - for material_id in self._material_ids: - if material_id is None: - result.append("#00000000") #No material. - continue - - containers = self._container_registry.findInstanceContainers(type = "material", GUID = material_id) - if containers: - result.append(containers[0].getMetaDataEntry("color_code")) - else: - result.append("#00000000") #Unknown material. - return result - - ## Protected setter for the current material id. - # /param index Index of the extruder - # /param material_id id of the material - def _setMaterialId(self, index, material_id): - if material_id and material_id != "" and material_id != self._material_ids[index]: - Logger.log("d", "Setting material id of hotend %d to %s" % (index, material_id)) - self._material_ids[index] = material_id - self.materialIdChanged.emit(index, material_id) - - @pyqtProperty("QVariantList", notify = hotendIdChanged) - def hotendIds(self): - return self._hotend_ids - - ## Protected setter for the current hotend id. - # /param index Index of the extruder - # /param hotend_id id of the hotend - def _setHotendId(self, index, hotend_id): - if hotend_id and hotend_id != self._hotend_ids[index]: - Logger.log("d", "Setting hotend id of hotend %d to %s" % (index, hotend_id)) - self._hotend_ids[index] = hotend_id - self.hotendIdChanged.emit(index, hotend_id) - elif not hotend_id: - Logger.log("d", "Removing hotend id of hotend %d.", index) - self._hotend_ids[index] = None - self.hotendIdChanged.emit(index, None) - - ## Let the user decide if the hotends and/or material should be synced with the printer - # NB: the UX needs to be implemented by the plugin - def materialHotendChangedMessage(self, callback): - Logger.log("w", "materialHotendChangedMessage needs to be implemented, returning 'Yes'") - callback(QMessageBox.Yes) - ## Attempt to establish connection def connect(self): - raise NotImplementedError("connect needs to be implemented") + self._update_timer.start() ## Attempt to close the connection def close(self): - raise NotImplementedError("close needs to be implemented") - - @pyqtProperty(bool, notify = connectionStateChanged) - def connectionState(self): - return self._connection_state - - ## Set the connection state of this output device. - # /param connection_state ConnectionState enum. - def setConnectionState(self, connection_state): - if self._connection_state != connection_state: - self._connection_state = connection_state - self.connectionStateChanged.emit(self._id) - - @pyqtProperty(str, notify = connectionTextChanged) - def connectionText(self): - return self._connection_text - - ## Set a text that is shown on top of the print monitor tab - def setConnectionText(self, connection_text): - if self._connection_text != connection_text: - self._connection_text = connection_text - self.connectionTextChanged.emit() + self._update_timer.stop() ## Ensure that close gets called when object is destroyed def __del__(self): self.close() - ## Get the x position of the head. - # This function is "final" (do not re-implement) - @pyqtProperty(float, notify = headPositionChanged) - def headX(self): - return self._head_x - - ## Get the y position of the head. - # This function is "final" (do not re-implement) - @pyqtProperty(float, notify = headPositionChanged) - def headY(self): - return self._head_y - - ## Get the z position of the head. - # In some machines it's actually the bed that moves. For convenience sake we simply see it all as head movements. - # This function is "final" (do not re-implement) - @pyqtProperty(float, notify = headPositionChanged) - def headZ(self): - return self._head_z - - ## Update the saved position of the head - # This function should be called when a new position for the head is received. - def _updateHeadPosition(self, x, y ,z): - position_changed = False - if self._head_x != x: - self._head_x = x - position_changed = True - if self._head_y != y: - self._head_y = y - position_changed = True - if self._head_z != z: - self._head_z = z - position_changed = True - - if position_changed: - self.headPositionChanged.emit() - - ## Set the position of the head. - # In some machines it's actually the bed that moves. For convenience sake we simply see it all as head movements. - # This function is "final" (do not re-implement) - # /param x new x location of the head. - # /param y new y location of the head. - # /param z new z location of the head. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _setHeadPosition implementation function - @pyqtSlot("long", "long", "long") - @pyqtSlot("long", "long", "long", "long") - def setHeadPosition(self, x, y, z, speed = 3000): - self._setHeadPosition(x, y , z, speed) - - ## Set the X position of the head. - # This function is "final" (do not re-implement) - # /param x x position head needs to move to. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _setHeadx implementation function - @pyqtSlot("long") - @pyqtSlot("long", "long") - def setHeadX(self, x, speed = 3000): - self._setHeadX(x, speed) - - ## Set the Y position of the head. - # This function is "final" (do not re-implement) - # /param y y position head needs to move to. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _setHeadY implementation function - @pyqtSlot("long") - @pyqtSlot("long", "long") - def setHeadY(self, y, speed = 3000): - self._setHeadY(y, speed) - - ## Set the Z position of the head. - # In some machines it's actually the bed that moves. For convenience sake we simply see it all as head movements. - # This function is "final" (do not re-implement) - # /param z z position head needs to move to. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _setHeadZ implementation function - @pyqtSlot("long") - @pyqtSlot("long", "long") - def setHeadZ(self, z, speed = 3000): - self._setHeadZ(z, speed) - - ## Move the head of the printer. - # Note that this is a relative move. If you want to move the head to a specific position you can use - # setHeadPosition - # This function is "final" (do not re-implement) - # /param x distance in x to move - # /param y distance in y to move - # /param z distance in z to move - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _moveHead implementation function - @pyqtSlot("long", "long", "long") - @pyqtSlot("long", "long", "long", "long") - def moveHead(self, x = 0, y = 0, z = 0, speed = 3000): - self._moveHead(x, y, z, speed) - - ## Implementation function of moveHead. - # /param x distance in x to move - # /param y distance in y to move - # /param z distance in z to move - # /param speed Speed by which it needs to move (in mm/minute) - # /sa moveHead - def _moveHead(self, x, y, z, speed): - Logger.log("w", "_moveHead is not implemented by this output device") - - ## Implementation function of setHeadPosition. - # /param x new x location of the head. - # /param y new y location of the head. - # /param z new z location of the head. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa setHeadPosition - def _setHeadPosition(self, x, y, z, speed): - Logger.log("w", "_setHeadPosition is not implemented by this output device") - - ## Implementation function of setHeadX. - # /param x new x location of the head. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa setHeadX - def _setHeadX(self, x, speed): - Logger.log("w", "_setHeadX is not implemented by this output device") - - ## Implementation function of setHeadY. - # /param y new y location of the head. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _setHeadY - def _setHeadY(self, y, speed): - Logger.log("w", "_setHeadY is not implemented by this output device") - - ## Implementation function of setHeadZ. - # /param z new z location of the head. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _setHeadZ - def _setHeadZ(self, z, speed): - Logger.log("w", "_setHeadZ is not implemented by this output device") - - ## Get the progress of any currently active process. - # This function is "final" (do not re-implement) - # /sa _getProgress - # /returns float progress of the process. -1 indicates that there is no process. - @pyqtProperty(float, notify = progressChanged) - def progress(self): - return self._progress - - ## Set the progress of any currently active process - # /param progress Progress of the process. - def setProgress(self, progress): - if self._progress != progress: - self._progress = progress - self.progressChanged.emit() - ## The current processing state of the backend. class ConnectionState(IntEnum): diff --git a/plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py new file mode 100644 index 0000000000..828fe76b64 --- /dev/null +++ b/plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py @@ -0,0 +1,2 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. \ No newline at end of file From c1dbdc64eec11c8e8119bb388515a6bfd7870f9d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 11:34:24 +0100 Subject: [PATCH 027/551] Added missing () CL-541 --- cura/PrinterOutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 3f12c2f40c..9db0a26e55 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -26,7 +26,7 @@ i18n_catalog = i18nCatalog("cura") # For all other uses it should be used in the same way as a "regular" OutputDevice. @signalemitter class PrinterOutputDevice(QObject, OutputDevice): - printersChanged = pyqtSignal + printersChanged = pyqtSignal() def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) From 9202bb11fe11a873f44b264e2674723b89bcef1d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 13:12:15 +0100 Subject: [PATCH 028/551] Added stubs for cluster & legacy output devices CL-541 --- .../ClusterUM3OutputDevice.py | 5 + .../UM3NetworkPrinting/DiscoverUM3Action.py | 8 +- .../LegacyUM3OutputDevice.py | 5 + .../UM3OutputDevicePlugin.py | 185 ++++++++++++++++++ .../UM3PrinterOutputDevicePlugin.py | 2 - plugins/UM3NetworkPrinting/__init__.py | 4 +- 6 files changed, 202 insertions(+), 7 deletions(-) create mode 100644 plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py create mode 100644 plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py create mode 100644 plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py delete mode 100644 plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py new file mode 100644 index 0000000000..4609e86f20 --- /dev/null +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -0,0 +1,5 @@ +from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice + +class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): + def __init__(self, device_id, address, properties, parent = None): + super().__init__(device_id = device_id, parent = parent) \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py index af1a556892..f199f7cd24 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py @@ -37,7 +37,7 @@ class DiscoverUM3Action(MachineAction): if not self._network_plugin: Logger.log("d", "Starting printer discovery.") self._network_plugin = Application.getInstance().getOutputDeviceManager().getOutputDevicePlugin("UM3NetworkPrinting") - self._network_plugin.printerListChanged.connect(self._onPrinterDiscoveryChanged) + self._network_plugin.discoveredDevicesChanged.connect(self._onPrinterDiscoveryChanged) self.printersChanged.emit() ## Re-filters the list of printers. @@ -87,10 +87,10 @@ class DiscoverUM3Action(MachineAction): else: global_printer_type = "unknown" - printers = list(self._network_plugin.getPrinters().values()) + printers = list(self._network_plugin.getDiscoveredDevices().values()) # TODO; There are still some testing printers that don't have a correct printer type, so don't filter out unkown ones just yet. - printers = [printer for printer in printers if printer.printerType == global_printer_type or printer.printerType == "unknown"] - printers.sort(key = lambda k: k.name) + #printers = [printer for printer in printers if printer.printerType == global_printer_type or printer.printerType == "unknown"] + #printers.sort(key = lambda k: k.name) return printers else: return [] diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py new file mode 100644 index 0000000000..0e19df4c18 --- /dev/null +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -0,0 +1,5 @@ +from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice + +class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): + def __init__(self, device_id, address, properties, parent = None): + super().__init__(device_id = device_id, parent = parent) \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py new file mode 100644 index 0000000000..37425bfef2 --- /dev/null +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -0,0 +1,185 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin +from UM.Logger import Logger +from UM.Application import Application +from UM.Signal import Signal, signalemitter + +from zeroconf import Zeroconf, ServiceBrowser, ServiceStateChange, ServiceInfo +from queue import Queue +from threading import Event, Thread + +from time import time + +from . import ClusterUM3OutputDevice, LegacyUM3OutputDevice + +## This plugin handles the connection detection & creation of output device objects for the UM3 printer. +# Zero-Conf is used to detect printers, which are saved in a dict. +# If we discover a printer that has the same key as the active machine instance a connection is made. +@signalemitter +class UM3OutputDevicePlugin(OutputDevicePlugin): + addDeviceSignal = Signal() + removeDeviceSignal = Signal() + discoveredDevicesChanged = Signal() + + def __init__(self): + super().__init__() + self._zero_conf = None + self._zero_conf_browser = None + + # Because the model needs to be created in the same thread as the QMLEngine, we use a signal. + self.addDeviceSignal.connect(self._onAddDevice) + self.removeDeviceSignal.connect(self._onRemoveDevice) + + self._discovered_devices = {} + + # The zero-conf service changed requests are handled in a separate thread, so we can re-schedule the requests + # which fail to get detailed service info. + # Any new or re-scheduled requests will be appended to the request queue, and the handling thread will pick + # them up and process them. + self._service_changed_request_queue = Queue() + self._service_changed_request_event = Event() + self._service_changed_request_thread = Thread(target=self._handleOnServiceChangedRequests, daemon=True) + self._service_changed_request_thread.start() + + def getDiscoveredDevices(self): + return self._discovered_devices + + ## Start looking for devices on network. + def start(self): + self.startDiscovery() + + def startDiscovery(self): + self.stop() + if self._zero_conf_browser: + self._zero_conf_browser.cancel() + self._zero_conf_browser = None # Force the old ServiceBrowser to be destroyed. + + self._zero_conf = Zeroconf() + self._zero_conf_browser = ServiceBrowser(self._zero_conf, u'_ultimaker._tcp.local.', + [self._appendServiceChangedRequest]) + + def stop(self): + if self._zero_conf is not None: + Logger.log("d", "zeroconf close...") + self._zero_conf.close() + + def _onRemoveDevice(self, name): + device = self._discovered_devices.pop(name, None) + if device: + if device.isConnected(): + device.disconnect() + device.connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) + + self.discoveredDevicesChanged.emit() + '''printer = self._printers.pop(name, None) + if printer: + if printer.isConnected(): + printer.disconnect() + printer.connectionStateChanged.disconnect(self._onPrinterConnectionStateChanged) + Logger.log("d", "removePrinter, disconnecting [%s]..." % name) + self.printerListChanged.emit()''' + + def _onAddDevice(self, name, address, properties): + + # Check what kind of device we need to add; Depending on the firmware we either add a "Connect"/"Cluster" + # or "Legacy" UM3 device. + cluster_size = int(properties.get(b"cluster_size", -1)) + if cluster_size > 0: + device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties) + else: + device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) + + self._discovered_devices[device.getId()] = device + self.discoveredDevicesChanged.emit() + + pass + ''' + self._cluster_printers_seen[ + printer.getKey()] = name # Cluster printers that may be temporary unreachable or is rebooted keep being stored here + global_container_stack = Application.getInstance().getGlobalContainerStack() + if global_container_stack and printer.getKey() == global_container_stack.getMetaDataEntry("um_network_key"): + if printer.getKey() not in self._old_printers: # Was the printer already connected, but a re-scan forced? + Logger.log("d", "addPrinter, connecting [%s]..." % printer.getKey()) + self._printers[printer.getKey()].connect() + printer.connectionStateChanged.connect(self._onPrinterConnectionStateChanged) + self.printerListChanged.emit()''' + + ## Appends a service changed request so later the handling thread will pick it up and processes it. + def _appendServiceChangedRequest(self, zeroconf, service_type, name, state_change): + # append the request and set the event so the event handling thread can pick it up + item = (zeroconf, service_type, name, state_change) + self._service_changed_request_queue.put(item) + self._service_changed_request_event.set() + + def _handleOnServiceChangedRequests(self): + while True: + # Wait for the event to be set + self._service_changed_request_event.wait(timeout = 5.0) + + # Stop if the application is shutting down + if Application.getInstance().isShuttingDown(): + return + + self._service_changed_request_event.clear() + + # Handle all pending requests + reschedule_requests = [] # A list of requests that have failed so later they will get re-scheduled + while not self._service_changed_request_queue.empty(): + request = self._service_changed_request_queue.get() + zeroconf, service_type, name, state_change = request + try: + result = self._onServiceChanged(zeroconf, service_type, name, state_change) + if not result: + reschedule_requests.append(request) + except Exception: + Logger.logException("e", "Failed to get service info for [%s] [%s], the request will be rescheduled", + service_type, name) + reschedule_requests.append(request) + + # Re-schedule the failed requests if any + if reschedule_requests: + for request in reschedule_requests: + self._service_changed_request_queue.put(request) + + ## Handler for zeroConf detection. + # Return True or False indicating if the process succeeded. + # Note that this function can take over 3 seconds to complete. Be carefull calling it from the main thread. + def _onServiceChanged(self, zero_conf, service_type, name, state_change): + if state_change == ServiceStateChange.Added: + Logger.log("d", "Bonjour service added: %s" % name) + + # First try getting info from zero-conf cache + info = ServiceInfo(service_type, name, properties={}) + for record in zero_conf.cache.entries_with_name(name.lower()): + info.update_record(zero_conf, time(), record) + + for record in zero_conf.cache.entries_with_name(info.server): + info.update_record(zero_conf, time(), record) + if info.address: + break + + # Request more data if info is not complete + if not info.address: + Logger.log("d", "Trying to get address of %s", name) + info = zero_conf.get_service_info(service_type, name) + + if info: + type_of_device = info.properties.get(b"type", None) + if type_of_device: + if type_of_device == b"printer": + address = '.'.join(map(lambda n: str(n), info.address)) + self.addDeviceSignal.emit(str(name), address, info.properties) + else: + Logger.log("w", + "The type of the found device is '%s', not 'printer'! Ignoring.." % type_of_device) + else: + Logger.log("w", "Could not get information about %s" % name) + return False + + elif state_change == ServiceStateChange.Removed: + Logger.log("d", "Bonjour service removed: %s" % name) + self.removeDeviceSignal.emit(str(name)) + + return True \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py deleted file mode 100644 index 828fe76b64..0000000000 --- a/plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/__init__.py b/plugins/UM3NetworkPrinting/__init__.py index 37f863bd00..6dd86a16d2 100644 --- a/plugins/UM3NetworkPrinting/__init__.py +++ b/plugins/UM3NetworkPrinting/__init__.py @@ -5,8 +5,10 @@ from . import DiscoverUM3Action from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") +from . import UM3OutputDevicePlugin + def getMetaData(): return {} def register(app): - return { "output_device": NetworkPrinterOutputDevicePlugin.NetworkPrinterOutputDevicePlugin(), "machine_action": DiscoverUM3Action.DiscoverUM3Action()} \ No newline at end of file + return { "output_device": UM3OutputDevicePlugin.UM3OutputDevicePlugin(), "machine_action": DiscoverUM3Action.DiscoverUM3Action()} \ No newline at end of file From 68e80a88bcbd072ed2e1be743b1135f64bf8160b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 13:18:08 +0100 Subject: [PATCH 029/551] Rename usage of printer to more generic device. The usage of "printer" is a bit confusing, as in the case of CuraConnect it's a device that can acces multiple printers. CL-541 --- .../UM3NetworkPrinting/DiscoverUM3Action.py | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py index f199f7cd24..f7afe3e00f 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py @@ -27,24 +27,26 @@ class DiscoverUM3Action(MachineAction): Application.getInstance().engineCreatedSignal.connect(self._createAdditionalComponentsView) - self._last_zeroconf_event_time = time.time() - self._zeroconf_change_grace_period = 0.25 # Time to wait after a zeroconf service change before allowing a zeroconf reset + self._last_zero_conf_event_time = time.time() - printersChanged = pyqtSignal() + # Time to wait after a zero-conf service change before allowing a zeroconf reset + self._zero_conf_change_grace_period = 0.25 + + discoveredDevicesChanged = pyqtSignal() @pyqtSlot() def startDiscovery(self): if not self._network_plugin: - Logger.log("d", "Starting printer discovery.") + Logger.log("d", "Starting device discovery.") self._network_plugin = Application.getInstance().getOutputDeviceManager().getOutputDevicePlugin("UM3NetworkPrinting") - self._network_plugin.discoveredDevicesChanged.connect(self._onPrinterDiscoveryChanged) - self.printersChanged.emit() + self._network_plugin.discoveredDevicesChanged.connect(self._onDeviceDiscoveryChanged) + self.discoveredDevicesChanged.emit() - ## Re-filters the list of printers. + ## Re-filters the list of devices. @pyqtSlot() def reset(self): - Logger.log("d", "Reset the list of found printers.") - self.printersChanged.emit() + Logger.log("d", "Reset the list of found devices.") + self.discoveredDevicesChanged.emit() @pyqtSlot() def restartDiscovery(self): @@ -53,35 +55,36 @@ class DiscoverUM3Action(MachineAction): # It's most likely that the QML engine is still creating delegates, where the python side already deleted or # garbage collected the data. # Whatever the case, waiting a bit ensures that it doesn't crash. - if time.time() - self._last_zeroconf_event_time > self._zeroconf_change_grace_period: + if time.time() - self._last_zero_conf_event_time > self._zero_conf_change_grace_period: if not self._network_plugin: self.startDiscovery() else: self._network_plugin.startDiscovery() @pyqtSlot(str, str) - def removeManualPrinter(self, key, address): + def removeManualDevice(self, key, address): if not self._network_plugin: return - self._network_plugin.removeManualPrinter(key, address) + self._network_plugin.removeManualDevice(key, address) @pyqtSlot(str, str) - def setManualPrinter(self, key, address): + def setManualDevice(self, key, address): if key != "": # This manual printer replaces a current manual printer - self._network_plugin.removeManualPrinter(key) + self._network_plugin.removeManualDevice(key) if address != "": self._network_plugin.addManualPrinter(address) - def _onPrinterDiscoveryChanged(self, *args): - self._last_zeroconf_event_time = time.time() - self.printersChanged.emit() + def _onDeviceDiscoveryChanged(self, *args): + self._last_zero_conf_event_time = time.time() + self.discoveredDevicesChanged.emit() - @pyqtProperty("QVariantList", notify = printersChanged) + @pyqtProperty("QVariantList", notify = discoveredDevicesChanged) def foundDevices(self): if self._network_plugin: + # TODO: Check if this needs to stay. if Application.getInstance().getGlobalContainerStack(): global_printer_type = Application.getInstance().getGlobalContainerStack().getBottom().getId() else: From 1b8caa7a21ec0de6fd8f329796c37c2ae748758e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 13:23:09 +0100 Subject: [PATCH 030/551] NetworkedPrinterOutputDevice now requires address in constructor CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 4 ++-- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 5 ++++- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 7 +++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index dc02fa839d..416efe10a3 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -8,14 +8,14 @@ from time import time from typing import Callable class NetworkedPrinterOutputDevice(PrinterOutputDevice): - def __init__(self, device_id, parent = None): + def __init__(self, device_id, address: str, parent = None): super().__init__(device_id = device_id, parent = parent) self._manager = None self._createNetworkManager() self._last_response_time = time() self._last_request_time = None self._api_prefix = "" - self._address = "" + self._address = address self._user_agent = "%s/%s " % (Application.getInstance().getApplicationName(), Application.getInstance().getVersion()) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 4609e86f20..4a89e35275 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -2,4 +2,7 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutp class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address, properties, parent = None): - super().__init__(device_id = device_id, parent = parent) \ No newline at end of file + super().__init__(device_id = device_id, address = address, parent = parent) + + def _update(self): + pass diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 0e19df4c18..ee8501a070 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -1,5 +1,8 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): - def __init__(self, device_id, address, properties, parent = None): - super().__init__(device_id = device_id, parent = parent) \ No newline at end of file + def __init__(self, device_id, address: str, properties, parent = None): + super().__init__(device_id = device_id, address = address, parent = parent) + + def _update(self): + pass From 4197f18fc15a2b9f48c4ad9142d709db4174da45 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 13:35:08 +0100 Subject: [PATCH 031/551] First steps to ensure that the Discover UM3 action works with new architecture CL-541 --- .../NetworkedPrinterOutputDevice.py | 43 +++++++++++++++++-- .../ClusterUM3OutputDevice.py | 5 ++- .../UM3NetworkPrinting/DiscoverUM3Action.qml | 42 +++++++++--------- .../LegacyUM3OutputDevice.py | 2 +- 4 files changed, 65 insertions(+), 27 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 416efe10a3..67ad968ce8 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -2,13 +2,14 @@ from UM.Application import Application from cura.PrinterOutputDevice import PrinterOutputDevice from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply -from PyQt5.QtCore import QUrl +from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl from time import time from typing import Callable + class NetworkedPrinterOutputDevice(PrinterOutputDevice): - def __init__(self, device_id, address: str, parent = None): + def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, parent = parent) self._manager = None self._createNetworkManager() @@ -16,7 +17,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._last_request_time = None self._api_prefix = "" self._address = address - + self._properties = properties self._user_agent = "%s/%s " % (Application.getInstance().getApplicationName(), Application.getInstance().getVersion()) self._onFinishedCallbacks = {} @@ -68,4 +69,38 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): del self._onFinishedCallbacks[reply.request] # Remove the callback. except Exception as e: print("Something went wrong with callback", e) - pass \ No newline at end of file + pass + + @pyqtSlot(str, result=str) + def getProperty(self, key): + key = key.encode("utf-8") + if key in self._properties: + return self._properties.get(key, b"").decode("utf-8") + else: + return "" + + ## Get the unique key of this machine + # \return key String containing the key of the machine. + @pyqtProperty(str, constant=True) + def key(self): + return self._id + + ## The IP address of the printer. + @pyqtProperty(str, constant=True) + def address(self): + return self._properties.get(b"address", b"").decode("utf-8") + + ## Name of the printer (as returned from the ZeroConf properties) + @pyqtProperty(str, constant=True) + def name(self): + return self._properties.get(b"name", b"").decode("utf-8") + + ## Firmware version (as returned from the ZeroConf properties) + @pyqtProperty(str, constant=True) + def firmwareVersion(self): + return self._properties.get(b"firmware_version", b"").decode("utf-8") + + ## IPadress of this printer + @pyqtProperty(str, constant=True) + def ipAddress(self): + return self._address \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 4a89e35275..f4e60b49e4 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -1,8 +1,11 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice + class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address, properties, parent = None): - super().__init__(device_id = device_id, address = address, parent = parent) + super().__init__(device_id = device_id, address = address, properties=properties, parent = parent) def _update(self): + super()._update() + pass diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index cec2bf0f0f..8131493957 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -10,7 +10,7 @@ Cura.MachineAction { id: base anchors.fill: parent; - property var selectedPrinter: null + property var selectedDevice: null property bool completeProperties: true Connections @@ -31,7 +31,7 @@ Cura.MachineAction { if(base.selectedPrinter && base.completeProperties) { - var printerKey = base.selectedPrinter.getKey() + var printerKey = base.selectedDevice.key if(manager.getStoredKey() != printerKey) { manager.setKey(printerKey); @@ -83,10 +83,10 @@ Cura.MachineAction { id: editButton text: catalog.i18nc("@action:button", "Edit") - enabled: base.selectedPrinter != null && base.selectedPrinter.getProperty("manual") == "true" + enabled: base.selectedDevice != null && base.selectedDevice.getProperty("manual") == "true" onClicked: { - manualPrinterDialog.showDialog(base.selectedPrinter.getKey(), base.selectedPrinter.ipAddress); + manualPrinterDialog.showDialog(base.selectedDevice.key, base.selectedDevice.ipAddress); } } @@ -94,8 +94,8 @@ Cura.MachineAction { id: removeButton text: catalog.i18nc("@action:button", "Remove") - enabled: base.selectedPrinter != null && base.selectedPrinter.getProperty("manual") == "true" - onClicked: manager.removeManualPrinter(base.selectedPrinter.getKey(), base.selectedPrinter.ipAddress) + enabled: base.selectedDevice != null && base.selectedDevice.getProperty("manual") == "true" + onClicked: manager.removeManualPrinter(base.selectedDevice.key, base.selectedDevice.ipAddress) } Button @@ -139,7 +139,7 @@ Cura.MachineAction { var selectedKey = manager.getStoredKey(); for(var i = 0; i < model.length; i++) { - if(model[i].getKey() == selectedKey) + if(model[i].key == selectedKey) { currentIndex = i; return @@ -151,9 +151,9 @@ Cura.MachineAction currentIndex: -1 onCurrentIndexChanged: { - base.selectedPrinter = listview.model[currentIndex]; + base.selectedDevice = listview.model[currentIndex]; // Only allow connecting if the printer has responded to API query since the last refresh - base.completeProperties = base.selectedPrinter != null && base.selectedPrinter.getProperty("incomplete") != "true"; + base.completeProperties = base.selectedDevice != null && base.selectedDevice.getProperty("incomplete") != "true"; } Component.onCompleted: manager.startDiscovery() delegate: Rectangle @@ -199,13 +199,13 @@ Cura.MachineAction Column { width: Math.floor(parent.width * 0.5) - visible: base.selectedPrinter ? true : false + visible: base.selectedDevice ? true : false spacing: UM.Theme.getSize("default_margin").height Label { width: parent.width wrapMode: Text.WordWrap - text: base.selectedPrinter ? base.selectedPrinter.name : "" + text: base.selectedDevice ? base.selectedDevice.name : "" font: UM.Theme.getFont("large") elide: Text.ElideRight } @@ -226,12 +226,12 @@ Cura.MachineAction wrapMode: Text.WordWrap text: { - if(base.selectedPrinter) + if(base.selectedDevice) { - if(base.selectedPrinter.printerType == "ultimaker3") + if(base.selectedDevice.printerType == "ultimaker3") { return catalog.i18nc("@label", "Ultimaker 3") - } else if(base.selectedPrinter.printerType == "ultimaker3_extended") + } else if(base.selectedDevice.printerType == "ultimaker3_extended") { return catalog.i18nc("@label", "Ultimaker 3 Extended") } else @@ -255,7 +255,7 @@ Cura.MachineAction { width: Math.floor(parent.width * 0.5) wrapMode: Text.WordWrap - text: base.selectedPrinter ? base.selectedPrinter.firmwareVersion : "" + text: base.selectedDevice ? base.selectedDevice.firmwareVersion : "" } Label { @@ -267,7 +267,7 @@ Cura.MachineAction { width: Math.floor(parent.width * 0.5) wrapMode: Text.WordWrap - text: base.selectedPrinter ? base.selectedPrinter.ipAddress : "" + text: base.selectedDevice ? base.selectedDevice.ipAddress : "" } } @@ -277,17 +277,17 @@ Cura.MachineAction wrapMode: Text.WordWrap text:{ // The property cluster size does not exist for older UM3 devices. - if(!base.selectedPrinter || base.selectedPrinter.clusterSize == null || base.selectedPrinter.clusterSize == 1) + if(!base.selectedDevice || base.selectedDevice.clusterSize == null || base.selectedDevice.clusterSize == 1) { return ""; } - else if (base.selectedPrinter.clusterSize === 0) + else if (base.selectedDevice.clusterSize === 0) { return catalog.i18nc("@label", "This printer is not set up to host a group of Ultimaker 3 printers."); } else { - return catalog.i18nc("@label", "This printer is the host for a group of %1 Ultimaker 3 printers.".arg(base.selectedPrinter.clusterSize)); + return catalog.i18nc("@label", "This printer is the host for a group of %1 Ultimaker 3 printers.".arg(base.selectedDevice.clusterSize)); } } @@ -296,14 +296,14 @@ Cura.MachineAction { width: parent.width wrapMode: Text.WordWrap - visible: base.selectedPrinter != null && !base.completeProperties + visible: base.selectedDevice != null && !base.completeProperties text: catalog.i18nc("@label", "The printer at this address has not yet responded." ) } Button { text: catalog.i18nc("@action:button", "Connect") - enabled: (base.selectedPrinter && base.completeProperties) ? true : false + enabled: (base.selectedDevice && base.completeProperties) ? true : false onClicked: connectToPrinter() } } diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index ee8501a070..c7ccbe763a 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -2,7 +2,7 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutp class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address: str, properties, parent = None): - super().__init__(device_id = device_id, address = address, parent = parent) + super().__init__(device_id = device_id, address = address, properties = properties, parent = parent) def _update(self): pass From 59e4d1af6306d9d0751fb84d7cf7e19b64fc3131 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 15:11:38 +0100 Subject: [PATCH 032/551] re-added recheck connections CL-541 --- .../UM3OutputDevicePlugin.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 37425bfef2..0d1154e07c 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -60,6 +60,28 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self._zero_conf_browser = ServiceBrowser(self._zero_conf, u'_ultimaker._tcp.local.', [self._appendServiceChangedRequest]) + def reCheckConnections(self): + active_machine = Application.getInstance().getGlobalContainerStack() + if not active_machine: + return + + um_network_key = active_machine.getMetaDataEntry("um_network_key") + + for key in self._discovered_devices: + if key == um_network_key: + if not self._discovered_devices[key].isConnected(): + Logger.log("d", "Attempting to connect with [%s]" % key) + self._discovered_devices[key].connect() + self._discovered_devices[key].connectionStateChanged.connect(self._onDeviceConnectionStateChanged) + else: + if self._discovered_devices[key].isConnected(): + Logger.log("d", "Attempting to close connection with [%s]" % key) + self._printers[key].close() + self._printers[key].connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) + + def _onDeviceConnectionStateChanged(self, key): + pass # TODO + def stop(self): if self._zero_conf is not None: Logger.log("d", "zeroconf close...") From 03304003af90c2d3566eb3e5cc504ca8e22ff96f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 15:12:11 +0100 Subject: [PATCH 033/551] Added connection state property Cl-541 --- cura/PrinterOutputDevice.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 9db0a26e55..573fe63158 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -27,6 +27,7 @@ i18n_catalog = i18nCatalog("cura") @signalemitter class PrinterOutputDevice(QObject, OutputDevice): printersChanged = pyqtSignal() + connectionStateChanged = pyqtSignal() def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) @@ -48,6 +49,11 @@ class PrinterOutputDevice(QObject, OutputDevice): self._update_timer.setSingleShot(False) self._update_timer.timeout.connect(self._update) + self._connection_state = ConnectionState.closed + + def isConnected(self): + return self._connection_state != ConnectionState.closed and self._connection_state != ConnectionState.error + def _update(self): pass From 61753540e405d1b40e27e304c60876242f5749f3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 15:12:29 +0100 Subject: [PATCH 034/551] Callbacks are now handled by url and operation type. It would have been nicer to use the request, but it's unhashable. Cl-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 11 +++++------ plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 -- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 6 ++++++ plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 3 ++- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 67ad968ce8..e33834ffce 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -37,13 +37,13 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def _put(self, target: str, data: str, onFinished: Callable): request = self._createEmptyRequest(target) - self._onFinishedCallbacks[request] = onFinished - self._manager.put(request, data.encode()) + reply = self._manager.put(request, data.encode()) + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished def _get(self, target: str, onFinished: Callable): request = self._createEmptyRequest(target) - self._onFinishedCallbacks[request] = onFinished - self._manager.get(request) + reply = self._manager.get(request) + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished def _delete(self, target: str, onFinished: Callable): pass @@ -65,8 +65,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def __handleOnFinished(self, reply: QNetworkReply): self._last_response_time = time() try: - self._onFinishedCallbacks[reply.request()](reply) - del self._onFinishedCallbacks[reply.request] # Remove the callback. + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) except Exception as e: print("Something went wrong with callback", e) pass diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index f4e60b49e4..8de14fe233 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -7,5 +7,3 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def _update(self): super()._update() - - pass diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index 8131493957..d79bd543e7 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -29,6 +29,12 @@ Cura.MachineAction function connectToPrinter() { + if(base.selectedDevice) + { + var deviceKey = base.selectedDevice.key + manager.setKey(deviceKey); + completed(); + } if(base.selectedPrinter && base.completeProperties) { var printerKey = base.selectedDevice.key diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index c7ccbe763a..86211bddb4 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -1,8 +1,9 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice + class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, address = address, properties = properties, parent = parent) def _update(self): - pass + super()._update() \ No newline at end of file From 1167fa0a89f9e4e2771aaec6ede3c59b7c9133c8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 16:03:54 +0100 Subject: [PATCH 035/551] Added data handling for legacy printer CL-541 --- .../NetworkedPrinterOutputDevice.py | 8 +- cura/PrinterOutput/PrintJobOutputModel.py | 11 +++ cura/PrinterOutput/PrinterOutputModel.py | 13 ++- .../LegacyUM3OutputDevice.py | 79 ++++++++++++++++++- 4 files changed, 104 insertions(+), 7 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index e33834ffce..951b7138f1 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -1,4 +1,6 @@ from UM.Application import Application +from UM.Logger import Logger + from cura.PrinterOutputDevice import PrinterOutputDevice from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply @@ -30,6 +32,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def _createEmptyRequest(self, target): url = QUrl("http://" + self._address + self._api_prefix + target) + print(url) request = QNetworkRequest(url) request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) @@ -66,9 +69,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._last_response_time = time() try: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) - except Exception as e: - print("Something went wrong with callback", e) - pass + except Exception: + Logger.logException("w", "something went wrong with callback") @pyqtSlot(str, result=str) def getProperty(self, key): diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 1e0d82f1b0..407bffcbfe 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -11,6 +11,7 @@ class PrintJobOutputModel(QObject): stateChanged = pyqtSignal() timeTotalChanged = pyqtSignal() timeElapsedChanged = pyqtSignal() + nameChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", parent=None): super().__init__(parent) @@ -18,6 +19,16 @@ class PrintJobOutputModel(QObject): self._state = "" self._time_total = 0 self._time_elapsed = 0 + self._name = "" + + @pyqtProperty(str, notify = nameChanged) + def name(self): + return self._name + + def updateName(self, name: str): + if self._name != name: + self._name = name + self.nameChanged.emit() @pyqtProperty(int, notify = timeTotalChanged) def timeTotal(self): diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 00644980b4..7c10944cfd 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -5,11 +5,11 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot from UM.Logger import Logger from typing import Optional, List from UM.Math.Vector import Vector +from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel - from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel from cura.PrinterOutput.PrinterOutputController import PrinterOutputController @@ -21,17 +21,19 @@ class PrinterOutputModel(QObject): nameChanged = pyqtSignal() headPositionChanged = pyqtSignal() - def __init__(self, output_controller: "PrinterOutputController", extruders: List["ExtruderOutputModel"], parent=None): + def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): super().__init__(parent) self._bed_temperature = 0 self._target_bed_temperature = 0 self._name = "" self._controller = output_controller - self._extruders = extruders + self._extruders = [ExtruderOutputModel(printer=self)] * number_of_extruders self._head_position = Vector(0, 0, 0) self._active_print_job = None # type: Optional[PrintJobOutputModel] + self._printer_state = "unknown" + # Features of the printer; self._can_pause = True self._can_abort = True @@ -135,6 +137,11 @@ class PrinterOutputModel(QObject): self._active_print_job = print_job self.activePrintJobChanged.emit() + def updatePrinterState(self, printer_state): + if self._printer_state != printer_state: + self._printer_state = printer_state + self.printerStateChanged.emit() + @pyqtProperty(QObject, notify = activePrintJobChanged) def activePrintJob(self): return self._active_print_job diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 86211bddb4..b4e7bdf1af 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -1,9 +1,86 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice +from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel +from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + +from UM.Logger import Logger + +from PyQt5.QtNetwork import QNetworkRequest + + +import json class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, address = address, properties = properties, parent = parent) + self._api_prefix = "/api/v1/" + self._number_of_extruders = 2 def _update(self): - super()._update() \ No newline at end of file + super()._update() + self._get("printer", onFinished=self._onGetPrinterDataFinished) + self._get("print_job", onFinished=self._onGetPrintJobFinished) + + def _onGetPrintJobFinished(self, reply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + + if not self._printers: + return # Ignore the data for now, we don't have info about a printer yet. + printer = self._printers[0] + + if status_code == 200: + try: + result = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid print job state message: Not valid JSON.") + return + if printer.activePrintJob is None: + print_job = PrintJobOutputModel(output_controller=None) + printer.updateActivePrintJob(print_job) + else: + print_job = printer.activePrintJob + print_job.updateState(result["state"]) + print_job.updateTimeElapsed(result["time_elapsed"]) + print_job.updateTimeTotal(result["time_total"]) + print_job.updateName(result["name"]) + elif status_code == 404: + # No job found, so delete the active print job (if any!) + printer.updateActivePrintJob(None) + else: + Logger.log("w", + "Got status code {status_code} while trying to get printer data".format(status_code=status_code)) + + def _onGetPrinterDataFinished(self, reply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + if status_code == 200: + try: + result = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid printer state message: Not valid JSON.") + return + + if not self._printers: + self._printers = [PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders)] + + # LegacyUM3 always has a single printer. + printer = self._printers[0] + printer.updateBedTemperature(result["bed"]["temperature"]["current"]) + printer.updateTargetBedTemperature(result["bed"]["temperature"]["target"]) + printer.updatePrinterState(result["status"]) + + for index in range(0, self._number_of_extruders): + temperatures = result["heads"][0]["extruders"][index]["hotend"]["temperature"] + printer.extruders[index].updateTargetHotendTemperature(temperatures["target"]) + printer.extruders[index].updateHotendTemperature(temperatures["current"]) + + # TODO: Set active material + + try: + hotend_id = result["heads"][0]["extruders"][index]["hotend"]["id"] + except KeyError: + hotend_id = "" + printer.extruders[index].updateHotendID(hotend_id) + + else: + Logger.log("w", + "Got status code {status_code} while trying to get printer data".format(status_code = status_code)) From a9f52c2ad642dd468eb90b9a245d3d8596f79229 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 17:00:02 +0100 Subject: [PATCH 036/551] Added data handling for Connect devices CL-541 --- cura/PrinterOutput/PrintJobOutputModel.py | 13 ++++- cura/PrinterOutput/PrinterOutputModel.py | 11 ++++ .../ClusterUM3OutputDevice.py | 57 ++++++++++++++++++- .../LegacyUM3OutputDevice.py | 1 - 4 files changed, 79 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 407bffcbfe..ca04c546d3 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -12,6 +12,7 @@ class PrintJobOutputModel(QObject): timeTotalChanged = pyqtSignal() timeElapsedChanged = pyqtSignal() nameChanged = pyqtSignal() + keyChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", parent=None): super().__init__(parent) @@ -19,7 +20,17 @@ class PrintJobOutputModel(QObject): self._state = "" self._time_total = 0 self._time_elapsed = 0 - self._name = "" + self._name = "" # Human readable name + self._key = "" # Unique identifier + + @pyqtProperty(str, notify=keyChanged) + def key(self): + return self._key + + def updateKey(self, key: str): + if self._key != key: + self._key = key + self.keyChanged.emit() @pyqtProperty(str, notify = nameChanged) def name(self): diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 7c10944cfd..ed20ef1755 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -20,12 +20,14 @@ class PrinterOutputModel(QObject): activePrintJobChanged = pyqtSignal() nameChanged = pyqtSignal() headPositionChanged = pyqtSignal() + keyChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): super().__init__(parent) self._bed_temperature = 0 self._target_bed_temperature = 0 self._name = "" + self._key = "" # Unique identifier self._controller = output_controller self._extruders = [ExtruderOutputModel(printer=self)] * number_of_extruders @@ -40,6 +42,15 @@ class PrinterOutputModel(QObject): self._can_pre_heat_bed = True self._can_control_manually = True + @pyqtProperty(str, notify=keyChanged) + def key(self): + return self._key + + def updateKey(self, key: str): + if self._key != key: + self._key = key + self.keyChanged.emit() + @pyqtSlot() def homeHead(self): self._controller.homeHead(self) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 8de14fe233..a1c4f48e13 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -1,9 +1,64 @@ -from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice +from UM.Logger import Logger +from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice +from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel +from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel +from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel + +import json + +from PyQt5.QtNetwork import QNetworkRequest class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address, properties, parent = None): super().__init__(device_id = device_id, address = address, properties=properties, parent = parent) + self._api_prefix = "/cluster-api/v1/" + + self._number_of_extruders = 2 def _update(self): super()._update() + self._get("printers/", onFinished=self._onGetPrintersDataFinished) + + def _onGetPrintersDataFinished(self, reply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + if status_code == 200: + try: + result = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid printer state message: Not valid JSON.") + return + + for printer_data in result: + uuid = printer_data["uuid"] + + printer = None + for device in self._printers: + if device.key == uuid: + printer = device + break + + if printer is None: + printer = PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders) + self._printers.append(printer) + + printer.updateName(printer_data["friendly_name"]) + printer.updateKey(uuid) + + for index in range(0, self._number_of_extruders): + extruder = printer.extruders[index] + extruder_data = printer_data["configuration"][index] + try: + hotend_id = extruder_data["print_core_id"] + except KeyError: + hotend_id = "" + extruder.updateHotendID(hotend_id) + + material_data = extruder_data["material"] + if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_data["guid"]: + material = MaterialOutputModel(guid = material_data["guid"], type = material_data["material"], brand=material_data["brand"], color=material_data["color"]) + extruder.updateActiveMaterial(material) + + else: + Logger.log("w", + "Got status code {status_code} while trying to get printer data".format(status_code=status_code)) \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index b4e7bdf1af..63ebd055ad 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -6,7 +6,6 @@ from UM.Logger import Logger from PyQt5.QtNetwork import QNetworkRequest - import json From fd548975ccfd62bb308ed37e8aae83d1a07b42be Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 10:19:17 +0100 Subject: [PATCH 037/551] Closing a connection now actually stops the updates CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 4 +++- cura/PrinterOutputDevice.py | 3 +++ plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 951b7138f1..2c33f2e397 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -1,7 +1,7 @@ from UM.Application import Application from UM.Logger import Logger -from cura.PrinterOutputDevice import PrinterOutputDevice +from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl @@ -67,6 +67,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def __handleOnFinished(self, reply: QNetworkReply): self._last_response_time = time() + # TODO: Check if the message is actually correct + self.setConnectionState(ConnectionState.connected) try: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) except Exception: diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 573fe63158..f5afb0da6a 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -54,6 +54,9 @@ class PrinterOutputDevice(QObject, OutputDevice): def isConnected(self): return self._connection_state != ConnectionState.closed and self._connection_state != ConnectionState.error + def setConnectionState(self, new_state): + self._connection_state = new_state + def _update(self): pass diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 0d1154e07c..b4ea1663b6 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -76,8 +76,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): else: if self._discovered_devices[key].isConnected(): Logger.log("d", "Attempting to close connection with [%s]" % key) - self._printers[key].close() - self._printers[key].connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) + self._discovered_devices[key].close() + self._discovered_devices[key].connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) def _onDeviceConnectionStateChanged(self, key): pass # TODO From 10a2dbb134ae0d42dc0cfdc115e65da065a16d2e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 10:24:14 +0100 Subject: [PATCH 038/551] Extended the typing for the calllbacks CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 2c33f2e397..75f5ca6a14 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -38,20 +38,20 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) return request - def _put(self, target: str, data: str, onFinished: Callable): + def _put(self, target: str, data: str, onFinished: Callable[[QNetworkReply], None]): request = self._createEmptyRequest(target) reply = self._manager.put(request, data.encode()) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _get(self, target: str, onFinished: Callable): + def _get(self, target: str, onFinished: Callable[[QNetworkReply], None]): request = self._createEmptyRequest(target) reply = self._manager.get(request) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _delete(self, target: str, onFinished: Callable): + def _delete(self, target: str, onFinished: Callable[[QNetworkReply], None]): pass - def _post(self, target: str, data: str, onFinished: Callable, onProgress: Callable): + def _post(self, target: str, data: str, onFinished: Callable[[QNetworkReply], None], onProgress: Callable): pass def _createNetworkManager(self): From 152f3462ce228825731e35de4c8cc03dcd3bbefb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 11:00:37 +0100 Subject: [PATCH 039/551] Also added any to callable mypy decorator For some reason it also wants to know that it also calls self. Weird. CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 75f5ca6a14..7b74282303 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -7,7 +7,7 @@ from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetwork from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl from time import time -from typing import Callable +from typing import Callable, Any class NetworkedPrinterOutputDevice(PrinterOutputDevice): @@ -38,20 +38,20 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) return request - def _put(self, target: str, data: str, onFinished: Callable[[QNetworkReply], None]): + def _put(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None]): request = self._createEmptyRequest(target) reply = self._manager.put(request, data.encode()) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _get(self, target: str, onFinished: Callable[[QNetworkReply], None]): + def _get(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]): request = self._createEmptyRequest(target) reply = self._manager.get(request) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _delete(self, target: str, onFinished: Callable[[QNetworkReply], None]): + def _delete(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]): pass - def _post(self, target: str, data: str, onFinished: Callable[[QNetworkReply], None], onProgress: Callable): + def _post(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None], onProgress: Callable): pass def _createNetworkManager(self): From b1649f2d38d8f2bbe5c2de4f20743199f55317a6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 11:01:19 +0100 Subject: [PATCH 040/551] Added PrintJob handling to ClusterUM3 CL-541 --- cura/PrinterOutput/PrintJobOutputModel.py | 16 ++++++- cura/PrinterOutput/PrinterOutputModel.py | 4 ++ cura/PrinterOutputDevice.py | 7 +++ .../ClusterUM3OutputDevice.py | 46 +++++++++++++++++-- 4 files changed, 68 insertions(+), 5 deletions(-) diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index ca04c546d3..7c38782788 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -5,6 +5,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant MYPY = False if MYPY: from cura.PrinterOutput.PrinterOutputController import PrinterOutputController + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel class PrintJobOutputModel(QObject): @@ -13,15 +14,26 @@ class PrintJobOutputModel(QObject): timeElapsedChanged = pyqtSignal() nameChanged = pyqtSignal() keyChanged = pyqtSignal() + assignedPrinterChanged = pyqtSignal() - def __init__(self, output_controller: "PrinterOutputController", parent=None): + def __init__(self, output_controller: "PrinterOutputController", key: str = "", name: str = "", parent=None): super().__init__(parent) self._output_controller = output_controller self._state = "" self._time_total = 0 self._time_elapsed = 0 self._name = "" # Human readable name - self._key = "" # Unique identifier + self._key = key # Unique identifier + self._assigned_printer = None + + @pyqtProperty(QObject, notify=assignedPrinterChanged) + def assignedPrinter(self): + return self._assigned_printer + + def updateAssignedPrinter(self, assigned_printer: "PrinterOutputModel"): + if self._assigned_printer != assigned_printer: + self._assigned_printer = assigned_printer + self.assignedPrinterChanged.emit() @pyqtProperty(str, notify=keyChanged) def key(self): diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index ed20ef1755..8a5a9b55be 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -145,6 +145,10 @@ class PrinterOutputModel(QObject): def updateActivePrintJob(self, print_job): if self._active_print_job != print_job: + if self._active_print_job is not None: + self._active_print_job.updateAssignedPrinter(None) + if print_job is not None: + print_job.updateAssignedPrinter(self) self._active_print_job = print_job self.activePrintJobChanged.emit() diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index f5afb0da6a..6de665b67f 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -60,6 +60,13 @@ class PrinterOutputDevice(QObject, OutputDevice): def _update(self): pass + def _getPrinterByKey(self, key): + for printer in self._printers: + if printer.key == key: + return printer + + return None + def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None): raise NotImplementedError("requestWrite needs to be implemented") diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index a1c4f48e13..6e564fef29 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -7,7 +7,7 @@ from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel import json -from PyQt5.QtNetwork import QNetworkRequest +from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address, properties, parent = None): @@ -16,17 +16,57 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._number_of_extruders = 2 + self._print_jobs = [] + def _update(self): super()._update() self._get("printers/", onFinished=self._onGetPrintersDataFinished) + self._get("print_jobs/", onFinished=self._onGetPrintJobsFinished) - def _onGetPrintersDataFinished(self, reply): + def _onGetPrintJobsFinished(self, reply: QNetworkReply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) if status_code == 200: try: result = json.loads(bytes(reply.readAll()).decode("utf-8")) except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid printer state message: Not valid JSON.") + Logger.log("w", "Received an invalid print jobs message: Not valid JSON.") + return + print_jobs_seen = [] + for print_job_data in result: + print_job = None + for job in self._print_jobs: + if job.key == print_job_data["uuid"]: + print_job = job + break + + if print_job is None: + print_job = PrintJobOutputModel(output_controller = None, + key = print_job_data["uuid"], + name = print_job_data["name"]) + print_job.updateTimeTotal(print_job_data["time_total"]) + print_job.updateTimeElapsed(print_job_data["time_elapsed"]) + print_job.updateState(print_job_data["status"]) + if print_job.state == "printing": + # Print job should be assigned to a printer. + printer = self._getPrinterByKey(print_job_data["printer_uuid"]) + if printer: + printer.updateActivePrintJob(print_job) + + print_jobs_seen.append(print_job) + for old_job in self._print_jobs: + if old_job not in print_jobs_seen: + # Print job needs to be removed. + old_job.assignedPrinter.updateActivePrintJob(None) + + self._print_jobs = print_jobs_seen + + def _onGetPrintersDataFinished(self, reply: QNetworkReply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + if status_code == 200: + try: + result = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid printers state message: Not valid JSON.") return for printer_data in result: From a8e71cf50cf04b7fe8ea2cb91a1b3b57f54a4475 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 14:35:17 +0100 Subject: [PATCH 041/551] NetworkManager is now created on demand and re-created after a certain timeout. CL-541 --- .../NetworkedPrinterOutputDevice.py | 52 ++++++++++++++++--- .../ClusterUM3OutputDevice.py | 3 +- .../LegacyUM3OutputDevice.py | 3 +- .../UM3OutputDevicePlugin.py | 8 ++- 4 files changed, 57 insertions(+), 9 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 7b74282303..3330426d0a 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -14,9 +14,13 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, parent = parent) self._manager = None - self._createNetworkManager() - self._last_response_time = time() + self._last_manager_create_time = None + self._recreate_network_manager_time = 30 + self._timeout_time = 10 # After how many seconds of no response should a timeout occur? + + self._last_response_time = None self._last_request_time = None + self._api_prefix = "" self._address = address self._properties = properties @@ -25,10 +29,28 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._onFinishedCallbacks = {} def _update(self): - if not self._manager.networkAccessible(): - pass # TODO: no internet connection. + if self._last_response_time: + time_since_last_response = time() - self._last_response_time + else: + time_since_last_response = 0 - pass + if self._last_request_time: + time_since_last_request = time() - self._last_request_time + else: + time_since_last_request = float("inf") # An irrelevantly large number of seconds + + if time_since_last_response > self._timeout_time >= time_since_last_request: + # Go (or stay) into timeout. + self.setConnectionState(ConnectionState.closed) + # We need to check if the manager needs to be re-created. If we don't, we get some issues when OSX goes to + # sleep. + if time_since_last_response > self._recreate_network_manager_time: + if self._last_manager_create_time is None: + self._createNetworkManager() + if time() - self._last_manager_create_time > self._recreate_network_manager_time: + self._createNetworkManager() + + return True def _createEmptyRequest(self, target): url = QUrl("http://" + self._address + self._api_prefix + target) @@ -39,22 +61,35 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): return request def _put(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None]): + if self._manager is None: + self._createNetworkManager() request = self._createEmptyRequest(target) + self._last_request_time = time() reply = self._manager.put(request, data.encode()) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished def _get(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]): + if self._manager is None: + self._createNetworkManager() request = self._createEmptyRequest(target) + self._last_request_time = time() reply = self._manager.get(request) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished def _delete(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]): + if self._manager is None: + self._createNetworkManager() + self._last_request_time = time() pass def _post(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None], onProgress: Callable): + if self._manager is None: + self._createNetworkManager() + self._last_request_time = time() pass def _createNetworkManager(self): + Logger.log("d", "Creating network manager") if self._manager: self._manager.finished.disconnect(self.__handleOnFinished) #self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged) @@ -62,12 +97,17 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._manager = QNetworkAccessManager() self._manager.finished.connect(self.__handleOnFinished) + self._last_manager_create_time = time() #self._manager.authenticationRequired.connect(self._onAuthenticationRequired) #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes def __handleOnFinished(self, reply: QNetworkReply): + if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) is None: + # No status code means it never even reached remote. + return + self._last_response_time = time() - # TODO: Check if the message is actually correct + self.setConnectionState(ConnectionState.connected) try: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 6e564fef29..8f9a92384f 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -19,7 +19,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._print_jobs = [] def _update(self): - super()._update() + if not super()._update(): + return self._get("printers/", onFinished=self._onGetPrintersDataFinished) self._get("print_jobs/", onFinished=self._onGetPrintJobsFinished) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 63ebd055ad..21b58154a6 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -16,7 +16,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._number_of_extruders = 2 def _update(self): - super()._update() + if not super()._update(): + return self._get("printer", onFinished=self._onGetPrinterDataFinished) self._get("print_job", onFinished=self._onGetPrintJobFinished) diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index b4ea1663b6..1462fb9373 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -80,7 +80,13 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self._discovered_devices[key].connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) def _onDeviceConnectionStateChanged(self, key): - pass # TODO + if key not in self._discovered_devices: + return + + if self._discovered_devices[key].isConnected(): + self.getOutputDeviceManager().addOutputDevice(self._discovered_devices[key]) + else: + self.getOutputDeviceManager().removeOutputDevice(key) def stop(self): if self._zero_conf is not None: From 3f1167a7d2953447b03301427aa380dc92068033 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 14:39:03 +0100 Subject: [PATCH 042/551] Results in printer discovery are sorted again CL-541 --- plugins/UM3NetworkPrinting/DiscoverUM3Action.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py index f7afe3e00f..3c2a37e0a4 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py @@ -93,7 +93,7 @@ class DiscoverUM3Action(MachineAction): printers = list(self._network_plugin.getDiscoveredDevices().values()) # TODO; There are still some testing printers that don't have a correct printer type, so don't filter out unkown ones just yet. #printers = [printer for printer in printers if printer.printerType == global_printer_type or printer.printerType == "unknown"] - #printers.sort(key = lambda k: k.name) + printers.sort(key = lambda k: k.name) return printers else: return [] From 9cfe9769d318ead92c776626c3b6b010582094b6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 14:47:55 +0100 Subject: [PATCH 043/551] Printers now automatically try to connect again CL-541 --- .../NetworkedPrinterOutputDevice.py | 1 - .../UM3OutputDevicePlugin.py | 23 ++++--------------- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 3330426d0a..d2886328de 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -54,7 +54,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def _createEmptyRequest(self, target): url = QUrl("http://" + self._address + self._api_prefix + target) - print(url) request = QNetworkRequest(url) request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 1462fb9373..98fab42a44 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -32,6 +32,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self.addDeviceSignal.connect(self._onAddDevice) self.removeDeviceSignal.connect(self._onRemoveDevice) + Application.getInstance().globalContainerStackChanged.connect(self.reCheckConnections) + self._discovered_devices = {} # The zero-conf service changed requests are handled in a separate thread, so we can re-schedule the requests @@ -101,16 +103,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): device.connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) self.discoveredDevicesChanged.emit() - '''printer = self._printers.pop(name, None) - if printer: - if printer.isConnected(): - printer.disconnect() - printer.connectionStateChanged.disconnect(self._onPrinterConnectionStateChanged) - Logger.log("d", "removePrinter, disconnecting [%s]..." % name) - self.printerListChanged.emit()''' def _onAddDevice(self, name, address, properties): - # Check what kind of device we need to add; Depending on the firmware we either add a "Connect"/"Cluster" # or "Legacy" UM3 device. cluster_size = int(properties.get(b"cluster_size", -1)) @@ -122,17 +116,10 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self._discovered_devices[device.getId()] = device self.discoveredDevicesChanged.emit() - pass - ''' - self._cluster_printers_seen[ - printer.getKey()] = name # Cluster printers that may be temporary unreachable or is rebooted keep being stored here global_container_stack = Application.getInstance().getGlobalContainerStack() - if global_container_stack and printer.getKey() == global_container_stack.getMetaDataEntry("um_network_key"): - if printer.getKey() not in self._old_printers: # Was the printer already connected, but a re-scan forced? - Logger.log("d", "addPrinter, connecting [%s]..." % printer.getKey()) - self._printers[printer.getKey()].connect() - printer.connectionStateChanged.connect(self._onPrinterConnectionStateChanged) - self.printerListChanged.emit()''' + if global_container_stack and device.getId() == global_container_stack.getMetaDataEntry("um_network_key"): + device.connect() + device.connectionStateChanged.connect(self._onDeviceConnectionStateChanged) ## Appends a service changed request so later the handling thread will pick it up and processes it. def _appendServiceChangedRequest(self, zeroconf, service_type, name, state_change): From 0f78b05802b19e259ad7a66fb8500c41b979199b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 15:12:23 +0100 Subject: [PATCH 044/551] Connection states changes are now tied into the UI again CL-541 --- cura/PrinterOutputDevice.py | 8 +++++--- cura/Settings/MachineManager.py | 8 ++++---- plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 12 +++++++----- resources/qml/PrintMonitor.qml | 4 +++- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 6de665b67f..56ac318f20 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -27,7 +27,7 @@ i18n_catalog = i18nCatalog("cura") @signalemitter class PrinterOutputDevice(QObject, OutputDevice): printersChanged = pyqtSignal() - connectionStateChanged = pyqtSignal() + connectionStateChanged = pyqtSignal(str) def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) @@ -54,8 +54,10 @@ class PrinterOutputDevice(QObject, OutputDevice): def isConnected(self): return self._connection_state != ConnectionState.closed and self._connection_state != ConnectionState.error - def setConnectionState(self, new_state): - self._connection_state = new_state + def setConnectionState(self, connection_state): + if self._connection_state != connection_state: + self._connection_state = connection_state + self.connectionStateChanged.emit(self._id) def _update(self): pass diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 0daf54c018..780a2a05ad 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -133,17 +133,17 @@ class MachineManager(QObject): outputDevicesChanged = pyqtSignal() def _onOutputDevicesChanged(self) -> None: - for printer_output_device in self._printer_output_devices: + '''for printer_output_device in self._printer_output_devices: printer_output_device.hotendIdChanged.disconnect(self._onHotendIdChanged) - printer_output_device.materialIdChanged.disconnect(self._onMaterialIdChanged) + printer_output_device.materialIdChanged.disconnect(self._onMaterialIdChanged)''' self._printer_output_devices.clear() for printer_output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): if isinstance(printer_output_device, PrinterOutputDevice): self._printer_output_devices.append(printer_output_device) - printer_output_device.hotendIdChanged.connect(self._onHotendIdChanged) - printer_output_device.materialIdChanged.connect(self._onMaterialIdChanged) + #printer_output_device.hotendIdChanged.connect(self._onHotendIdChanged) + #printer_output_device.materialIdChanged.connect(self._onMaterialIdChanged) self.outputDevicesChanged.emit() diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 98fab42a44..09bff8e7b8 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -84,7 +84,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): def _onDeviceConnectionStateChanged(self, key): if key not in self._discovered_devices: return - + print("STATE CHANGED", key) if self._discovered_devices[key].isConnected(): self.getOutputDeviceManager().addOutputDevice(self._discovered_devices[key]) else: @@ -95,8 +95,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): Logger.log("d", "zeroconf close...") self._zero_conf.close() - def _onRemoveDevice(self, name): - device = self._discovered_devices.pop(name, None) + def _onRemoveDevice(self, device_id): + device = self._discovered_devices.pop(device_id, None) if device: if device.isConnected(): device.disconnect() @@ -108,10 +108,12 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): # Check what kind of device we need to add; Depending on the firmware we either add a "Connect"/"Cluster" # or "Legacy" UM3 device. cluster_size = int(properties.get(b"cluster_size", -1)) - if cluster_size > 0: + # TODO: For debug purposes; force it to be legacy printer. + device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) + '''if cluster_size > 0: device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties) else: - device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) + device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties)''' self._discovered_devices[device.getId()] = device self.discoveredDevicesChanged.emit() diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index e69f7cf4fd..901c8f9fdc 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -12,7 +12,9 @@ import Cura 1.0 as Cura Column { id: printMonitor - property var connectedPrinter: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null + property var connectedDevice: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null + + property var activePrinter: connectedDevice != null ? connectedDevice.activePrinter : null Cura.ExtrudersModel { From e3d07f1806bf546eb1dcfafc7b9e691c52bcbf7d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 16:06:30 +0100 Subject: [PATCH 045/551] Moved ExtruderBox and OutputDeviceHeader to their own files. This makes it a whole lot easier to get an overview. CL-541 --- cura/PrinterOutput/ExtruderOuputModel.py | 2 +- resources/qml/PrintMonitor.qml | 223 +----------------- resources/qml/PrinterOutput/ExtruderBox.qml | 201 ++++++++++++++++ .../qml/PrinterOutput/OutputDeviceHeader.qml | 54 +++++ 4 files changed, 263 insertions(+), 217 deletions(-) create mode 100644 resources/qml/PrinterOutput/ExtruderBox.qml create mode 100644 resources/qml/PrinterOutput/OutputDeviceHeader.qml diff --git a/cura/PrinterOutput/ExtruderOuputModel.py b/cura/PrinterOutput/ExtruderOuputModel.py index 121e9a69d9..f8f8088389 100644 --- a/cura/PrinterOutput/ExtruderOuputModel.py +++ b/cura/PrinterOutput/ExtruderOuputModel.py @@ -58,7 +58,7 @@ class ExtruderOutputModel(QObject): @pyqtProperty(int, notify=hotendTemperatureChanged) def hotendTemperature(self) -> int: - return self._hotendTemperature + return self._hotend_temperature @pyqtProperty(str, notify = hotendIDChanged) def hotendID(self) -> str: diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 901c8f9fdc..6c815827f6 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -9,6 +9,8 @@ import QtQuick.Layouts 1.1 import UM 1.2 as UM import Cura 1.0 as Cura +import "PrinterOutput" + Column { id: printMonitor @@ -22,45 +24,10 @@ Column simpleNames: true } - Rectangle + OutputDeviceHeader { - id: connectedPrinterHeader width: parent.width - height: Math.floor(childrenRect.height + UM.Theme.getSize("default_margin").height * 2) - color: UM.Theme.getColor("setting_category") - - Label - { - id: connectedPrinterNameLabel - font: UM.Theme.getFont("large") - color: UM.Theme.getColor("text") - anchors.left: parent.left - anchors.top: parent.top - anchors.margins: UM.Theme.getSize("default_margin").width - text: connectedPrinter != null ? connectedPrinter.name : catalog.i18nc("@info:status", "No printer connected") - } - Label - { - id: connectedPrinterAddressLabel - text: (connectedPrinter != null && connectedPrinter.address != null) ? connectedPrinter.address : "" - font: UM.Theme.getFont("small") - color: UM.Theme.getColor("text_inactive") - anchors.top: parent.top - anchors.right: parent.right - anchors.margins: UM.Theme.getSize("default_margin").width - } - Label - { - text: connectedPrinter != null ? connectedPrinter.connectionText : catalog.i18nc("@info:status", "The printer is not connected.") - color: connectedPrinter != null && connectedPrinter.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") - font: UM.Theme.getFont("very_small") - wrapMode: Text.WordWrap - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.top: connectedPrinterNameLabel.bottom - } + outputDevice: connectedDevice } Rectangle @@ -78,189 +45,13 @@ Column Repeater { id: extrudersRepeater - model: machineExtruderCount.properties.value + model: activePrinter.extruders - delegate: Rectangle + ExtruderBox { - id: extruderRectangle color: UM.Theme.getColor("sidebar") width: index == machineExtruderCount.properties.value - 1 && index % 2 == 0 ? extrudersGrid.width : Math.floor(extrudersGrid.width / 2 - UM.Theme.getSize("sidebar_lining_thin").width / 2) - height: UM.Theme.getSize("sidebar_extruder_box").height - - Label //Extruder name. - { - text: Cura.ExtruderManager.getExtruderName(index) != "" ? Cura.ExtruderManager.getExtruderName(index) : catalog.i18nc("@label", "Extruder") - color: UM.Theme.getColor("text") - font: UM.Theme.getFont("default") - anchors.left: parent.left - anchors.top: parent.top - anchors.margins: UM.Theme.getSize("default_margin").width - } - - Label //Target temperature. - { - id: extruderTargetTemperature - text: (connectedPrinter != null && connectedPrinter.hotendIds[index] != null && connectedPrinter.targetHotendTemperatures[index] != null) ? Math.round(connectedPrinter.targetHotendTemperatures[index]) + "°C" : "" - font: UM.Theme.getFont("small") - color: UM.Theme.getColor("text_inactive") - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.bottom: extruderTemperature.bottom - - MouseArea //For tooltip. - { - id: extruderTargetTemperatureTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: extruderTargetTemperature.mapToItem(base, 0, -parent.height / 4).y}, - catalog.i18nc("@tooltip", "The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the hotend heating is turned off.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } - Label //Temperature indication. - { - id: extruderTemperature - text: (connectedPrinter != null && connectedPrinter.hotendIds[index] != null && connectedPrinter.hotendTemperatures[index] != null) ? Math.round(connectedPrinter.hotendTemperatures[index]) + "°C" : "" - color: UM.Theme.getColor("text") - font: UM.Theme.getFont("large") - anchors.right: extruderTargetTemperature.left - anchors.top: parent.top - anchors.margins: UM.Theme.getSize("default_margin").width - - MouseArea //For tooltip. - { - id: extruderTemperatureTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: parent.mapToItem(base, 0, -parent.height / 4).y}, - catalog.i18nc("@tooltip", "The current temperature of this extruder.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } - Rectangle //Material colour indication. - { - id: materialColor - width: Math.floor(materialName.height * 0.75) - height: Math.floor(materialName.height * 0.75) - radius: width / 2 - color: (connectedPrinter != null && connectedPrinter.materialColors[index] != null && connectedPrinter.materialIds[index] != "") ? connectedPrinter.materialColors[index] : "#00000000" - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - visible: connectedPrinter != null && connectedPrinter.materialColors[index] != null && connectedPrinter.materialIds[index] != "" - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: materialName.verticalCenter - - MouseArea //For tooltip. - { - id: materialColorTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: parent.mapToItem(base, 0, -parent.height / 2).y}, - catalog.i18nc("@tooltip", "The colour of the material in this extruder.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } - Label //Material name. - { - id: materialName - text: (connectedPrinter != null && connectedPrinter.materialNames[index] != null && connectedPrinter.materialIds[index] != "") ? connectedPrinter.materialNames[index] : "" - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - anchors.left: materialColor.right - anchors.bottom: parent.bottom - anchors.margins: UM.Theme.getSize("default_margin").width - - MouseArea //For tooltip. - { - id: materialNameTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: parent.mapToItem(base, 0, 0).y}, - catalog.i18nc("@tooltip", "The material in this extruder.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } - Label //Variant name. - { - id: variantName - text: (connectedPrinter != null && connectedPrinter.hotendIds[index] != null) ? connectedPrinter.hotendIds[index] : "" - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - anchors.right: parent.right - anchors.bottom: parent.bottom - anchors.margins: UM.Theme.getSize("default_margin").width - - MouseArea //For tooltip. - { - id: variantNameTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: parent.mapToItem(base, 0, -parent.height / 4).y}, - catalog.i18nc("@tooltip", "The nozzle inserted in this extruder.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } + extruderModel: activePrinter.extruders[index] } } } diff --git a/resources/qml/PrinterOutput/ExtruderBox.qml b/resources/qml/PrinterOutput/ExtruderBox.qml new file mode 100644 index 0000000000..2860789dd0 --- /dev/null +++ b/resources/qml/PrinterOutput/ExtruderBox.qml @@ -0,0 +1,201 @@ +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 + + +Item +{ + property alias color: background.color + property var extruderModel + property var position: index + //width: index == machineExtruderCount.properties.value - 1 && index % 2 == 0 ? extrudersGrid.width : Math.floor(extrudersGrid.width / 2 - UM.Theme.getSize("sidebar_lining_thin").width / 2) + implicitWidth: parent.width + implicitHeight: UM.Theme.getSize("sidebar_extruder_box").height + Rectangle + { + id: background + anchors.fill: parent + + Label //Extruder name. + { + text: Cura.ExtruderManager.getExtruderName(position) != "" ? Cura.ExtruderManager.getExtruderName(position) : catalog.i18nc("@label", "Extruder") + color: UM.Theme.getColor("text") + font: UM.Theme.getFont("default") + anchors.left: parent.left + anchors.top: parent.top + anchors.margins: UM.Theme.getSize("default_margin").width + } + + Label //Target temperature. + { + id: extruderTargetTemperature + text: Math.round(extruderModel.targetHotendTemperature) + "°C" + //text: (connectedPrinter != null && connectedPrinter.hotendIds[index] != null && connectedPrinter.targetHotendTemperatures[index] != null) ? Math.round(connectedPrinter.targetHotendTemperatures[index]) + "°C" : "" + font: UM.Theme.getFont("small") + color: UM.Theme.getColor("text_inactive") + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.bottom: extruderTemperature.bottom + + MouseArea //For tooltip. + { + id: extruderTargetTemperatureTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: extruderTargetTemperature.mapToItem(base, 0, -parent.height / 4).y}, + catalog.i18nc("@tooltip", "The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the hotend heating is turned off.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + Label //Temperature indication. + { + id: extruderTemperature + text: Math.round(extruderModel.hotendTemperature) + "°C" + //text: (connectedPrinter != null && connectedPrinter.hotendIds[index] != null && connectedPrinter.hotendTemperatures[index] != null) ? Math.round(connectedPrinter.hotendTemperatures[index]) + "°C" : "" + color: UM.Theme.getColor("text") + font: UM.Theme.getFont("large") + anchors.right: extruderTargetTemperature.left + anchors.top: parent.top + anchors.margins: UM.Theme.getSize("default_margin").width + + MouseArea //For tooltip. + { + id: extruderTemperatureTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: parent.mapToItem(base, 0, -parent.height / 4).y}, + catalog.i18nc("@tooltip", "The current temperature of this extruder.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + + Rectangle //Material colour indication. + { + id: materialColor + width: Math.floor(materialName.height * 0.75) + height: Math.floor(materialName.height * 0.75) + radius: width / 2 + color: extruderModel.activeMaterial ? extruderModel.activeMaterial.color: "#00000000" + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: extruderModel.activeMaterial != null + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.verticalCenter: materialName.verticalCenter + + MouseArea //For tooltip. + { + id: materialColorTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: parent.mapToItem(base, 0, -parent.height / 2).y}, + catalog.i18nc("@tooltip", "The colour of the material in this extruder.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + Label //Material name. + { + id: materialName + text: extruderModel.activeMaterial != null ? extruderModel.activeMaterial.name : "" + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + anchors.left: materialColor.right + anchors.bottom: parent.bottom + anchors.margins: UM.Theme.getSize("default_margin").width + + MouseArea //For tooltip. + { + id: materialNameTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: parent.mapToItem(base, 0, 0).y}, + catalog.i18nc("@tooltip", "The material in this extruder.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + Label //Variant name. + { + id: variantName + text: extruderModel.hotendID + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.margins: UM.Theme.getSize("default_margin").width + + MouseArea //For tooltip. + { + id: variantNameTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: parent.mapToItem(base, 0, -parent.height / 4).y}, + catalog.i18nc("@tooltip", "The nozzle inserted in this extruder.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + } +} \ No newline at end of file diff --git a/resources/qml/PrinterOutput/OutputDeviceHeader.qml b/resources/qml/PrinterOutput/OutputDeviceHeader.qml new file mode 100644 index 0000000000..6553655da0 --- /dev/null +++ b/resources/qml/PrinterOutput/OutputDeviceHeader.qml @@ -0,0 +1,54 @@ +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 + + +Item +{ + implicitWidth: parent.width + implicitHeight: Math.floor(childrenRect.height + UM.Theme.getSize("default_margin").height * 2) + property var outputDevice: null + Rectangle + { + anchors.fill: parent + color: UM.Theme.getColor("setting_category") + + Label + { + id: outputDeviceNameLabel + font: UM.Theme.getFont("large") + color: UM.Theme.getColor("text") + anchors.left: parent.left + anchors.top: parent.top + anchors.margins: UM.Theme.getSize("default_margin").width + text: outputDevice != null ? outputDevice.name : catalog.i18nc("@info:status", "No printer connected") + } + Label + { + id: outputDeviceAddressLabel + text: (outputDevice != null && outputDevice.address != null) ? outputDevice.address : "" + font: UM.Theme.getFont("small") + color: UM.Theme.getColor("text_inactive") + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: UM.Theme.getSize("default_margin").width + } + Label + { + text: outputDevice != null ? outputDevice.connectionText : catalog.i18nc("@info:status", "The printer is not connected.") + color: outputDevice != null && outputDevice.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") + font: UM.Theme.getFont("very_small") + wrapMode: Text.WordWrap + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.top: outputDevice.bottom + } + } +} \ No newline at end of file From d8b12be5e4410228704461b5293c7ba9898cc285 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 16:26:17 +0100 Subject: [PATCH 046/551] LegacyUM3 now correctly gets material set CL-541 --- .../LegacyUM3OutputDevice.py | 26 ++++++++++++++++--- resources/qml/PrinterOutput/ExtruderBox.qml | 2 +- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 21b58154a6..60409ec729 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -1,8 +1,10 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel +from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel from UM.Logger import Logger +from UM.Settings.ContainerRegistry import ContainerRegistry from PyQt5.QtNetwork import QNetworkRequest @@ -70,10 +72,28 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): for index in range(0, self._number_of_extruders): temperatures = result["heads"][0]["extruders"][index]["hotend"]["temperature"] - printer.extruders[index].updateTargetHotendTemperature(temperatures["target"]) - printer.extruders[index].updateHotendTemperature(temperatures["current"]) + extruder = printer.extruders[index] + extruder.updateTargetHotendTemperature(temperatures["target"]) + extruder.updateHotendTemperature(temperatures["current"]) - # TODO: Set active material + material_guid = result["heads"][0]["extruders"][index]["active_material"]["guid"] + + if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_guid: + # Find matching material (as we need to set brand, type & color) + containers = ContainerRegistry.getInstance().findInstanceContainers(type="material", + GUID=material_guid) + if containers: + color = containers[0].getMetaDataEntry("color_code") + brand = containers[0].getMetaDataEntry("brand") + material_type = containers[0].getMetaDataEntry("material") + else: + # Unknown material. + color = "#00000000" + brand = "Unknown" + material_type = "Unknown" + material = MaterialOutputModel(guid=material_guid, type=material_type, + brand=brand, color=color) + extruder.updateActiveMaterial(material) try: hotend_id = result["heads"][0]["extruders"][index]["hotend"]["id"] diff --git a/resources/qml/PrinterOutput/ExtruderBox.qml b/resources/qml/PrinterOutput/ExtruderBox.qml index 2860789dd0..a7141262a9 100644 --- a/resources/qml/PrinterOutput/ExtruderBox.qml +++ b/resources/qml/PrinterOutput/ExtruderBox.qml @@ -136,7 +136,7 @@ Item Label //Material name. { id: materialName - text: extruderModel.activeMaterial != null ? extruderModel.activeMaterial.name : "" + text: extruderModel.activeMaterial != null ? extruderModel.activeMaterial.type : "" font: UM.Theme.getFont("default") color: UM.Theme.getColor("text") anchors.left: materialColor.right From 34e808d585cb1f6e74a74d012430c96850f6efe6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 16:36:51 +0100 Subject: [PATCH 047/551] PrinterOutputModel now has different extruders if it has more than one. It used to just fill the list with references to the first one created. CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 3 +-- resources/qml/PrintMonitor.qml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 8a5a9b55be..9c1040fe1b 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -29,8 +29,7 @@ class PrinterOutputModel(QObject): self._name = "" self._key = "" # Unique identifier self._controller = output_controller - self._extruders = [ExtruderOutputModel(printer=self)] * number_of_extruders - + self._extruders = [ExtruderOutputModel(printer=self) for i in range(number_of_extruders)] self._head_position = Vector(0, 0, 0) self._active_print_job = None # type: Optional[PrintJobOutputModel] diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 6c815827f6..23ab365861 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -51,7 +51,7 @@ Column { color: UM.Theme.getColor("sidebar") width: index == machineExtruderCount.properties.value - 1 && index % 2 == 0 ? extrudersGrid.width : Math.floor(extrudersGrid.width / 2 - UM.Theme.getSize("sidebar_lining_thin").width / 2) - extruderModel: activePrinter.extruders[index] + extruderModel: modelData } } } From 0fe91db6362e3254fa3b7adb5a8084be61e32419 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 16:52:37 +0100 Subject: [PATCH 048/551] Moved HeatedBedBox to own qml file CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 2 +- resources/qml/PrintMonitor.qml | 394 +----------------- resources/qml/PrinterOutput/HeatedBedBox.qml | 399 +++++++++++++++++++ 3 files changed, 409 insertions(+), 386 deletions(-) create mode 100644 resources/qml/PrinterOutput/HeatedBedBox.qml diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 9c1040fe1b..12c2b4fe58 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -24,7 +24,7 @@ class PrinterOutputModel(QObject): def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): super().__init__(parent) - self._bed_temperature = 0 + self._bed_temperature = -1 # Use -1 for no heated bed. self._target_bed_temperature = 0 self._name = "" self._key = "" # Unique identifier diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 23ab365861..f95d829306 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -15,7 +15,6 @@ Column { id: printMonitor property var connectedDevice: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null - property var activePrinter: connectedDevice != null ? connectedDevice.activePrinter : null Cura.ExtrudersModel @@ -51,7 +50,7 @@ Column { color: UM.Theme.getColor("sidebar") width: index == machineExtruderCount.properties.value - 1 && index % 2 == 0 ? extrudersGrid.width : Math.floor(extrudersGrid.width / 2 - UM.Theme.getSize("sidebar_lining_thin").width / 2) - extruderModel: modelData + extruderModel: modelData } } } @@ -64,391 +63,16 @@ Column height: UM.Theme.getSize("sidebar_lining_thin").width } - Rectangle + HeatedBedBox { - color: UM.Theme.getColor("sidebar") - width: parent.width - height: machineHeatedBed.properties.value == "True" ? UM.Theme.getSize("sidebar_extruder_box").height : 0 - visible: machineHeatedBed.properties.value == "True" - - Label //Build plate label. - { - text: catalog.i18nc("@label", "Build plate") - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - anchors.left: parent.left - anchors.top: parent.top - anchors.margins: UM.Theme.getSize("default_margin").width - } - Label //Target temperature. - { - id: bedTargetTemperature - text: connectedPrinter != null ? connectedPrinter.targetBedTemperature + "°C" : "" - font: UM.Theme.getFont("small") - color: UM.Theme.getColor("text_inactive") - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.bottom: bedCurrentTemperature.bottom - - MouseArea //For tooltip. - { - id: bedTargetTemperatureTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: bedTargetTemperature.mapToItem(base, 0, -parent.height / 4).y}, - catalog.i18nc("@tooltip", "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.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } - Label //Current temperature. - { - id: bedCurrentTemperature - text: connectedPrinter != null ? connectedPrinter.bedTemperature + "°C" : "" - font: UM.Theme.getFont("large") - color: UM.Theme.getColor("text") - anchors.right: bedTargetTemperature.left - anchors.top: parent.top - anchors.margins: UM.Theme.getSize("default_margin").width - - MouseArea //For tooltip. - { - id: bedTemperatureTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: bedCurrentTemperature.mapToItem(base, 0, -parent.height / 4).y}, - catalog.i18nc("@tooltip", "The current temperature of the heated bed.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } - Rectangle //Input field for pre-heat temperature. - { - id: preheatTemperatureControl - color: !enabled ? UM.Theme.getColor("setting_control_disabled") : showError ? UM.Theme.getColor("setting_validation_error_background") : UM.Theme.getColor("setting_validation_ok") - property var showError: - { - if(bedTemperature.properties.maximum_value != "None" && bedTemperature.properties.maximum_value < Math.floor(preheatTemperatureInput.text)) - { - return true; - } else - { - return false; - } - } - enabled: - { - if (connectedPrinter == null) - { - return false; //Can't preheat if not connected. - } - if (!connectedPrinter.acceptsCommands) - { - return false; //Not allowed to do anything. - } - if (connectedPrinter.jobState == "printing" || connectedPrinter.jobState == "pre_print" || connectedPrinter.jobState == "resuming" || connectedPrinter.jobState == "pausing" || connectedPrinter.jobState == "paused" || connectedPrinter.jobState == "error" || connectedPrinter.jobState == "offline") - { - return false; //Printer is in a state where it can't react to pre-heating. - } - return true; - } - border.width: UM.Theme.getSize("default_lining").width - border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : preheatTemperatureInputMouseArea.containsMouse ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border") - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.bottom: parent.bottom - anchors.bottomMargin: UM.Theme.getSize("default_margin").height - width: UM.Theme.getSize("setting_control").width - height: UM.Theme.getSize("setting_control").height - visible: connectedPrinter != null ? connectedPrinter.canPreHeatBed: true - Rectangle //Highlight of input field. - { - anchors.fill: parent - anchors.margins: UM.Theme.getSize("default_lining").width - color: UM.Theme.getColor("setting_control_highlight") - opacity: preheatTemperatureControl.hovered ? 1.0 : 0 - } - Label //Maximum temperature indication. - { - text: (bedTemperature.properties.maximum_value != "None" ? bedTemperature.properties.maximum_value : "") + "°C" - color: UM.Theme.getColor("setting_unit") - font: UM.Theme.getFont("default") - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width - anchors.verticalCenter: parent.verticalCenter - } - MouseArea //Change cursor on hovering. - { - id: preheatTemperatureInputMouseArea - hoverEnabled: true - anchors.fill: parent - cursorShape: Qt.IBeamCursor - - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: preheatTemperatureInputMouseArea.mapToItem(base, 0, 0).y}, - catalog.i18nc("@tooltip of temperature input", "The temperature to pre-heat the bed to.") - ); - } - else - { - base.hideTooltip(); - } - } - } - TextInput - { - id: preheatTemperatureInput - font: UM.Theme.getFont("default") - color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") - selectByMouse: true - maximumLength: 10 - enabled: parent.enabled - validator: RegExpValidator { regExp: /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ } //Floating point regex. - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - renderType: Text.NativeRendering - - Component.onCompleted: - { - if (!bedTemperature.properties.value) - { - text = ""; - } - if ((bedTemperature.resolve != "None" && bedTemperature.resolve) && (bedTemperature.stackLevels[0] != 0) && (bedTemperature.stackLevels[0] != 1)) - { - // We have a resolve function. Indicates that the setting is not settable per extruder and that - // we have to choose between the resolved value (default) and the global value - // (if user has explicitly set this). - text = bedTemperature.resolve; - } - else - { - text = bedTemperature.properties.value; - } - } - } - } - - UM.RecolorImage - { - id: preheatCountdownIcon - width: UM.Theme.getSize("save_button_specs_icons").width - height: UM.Theme.getSize("save_button_specs_icons").height - sourceSize.width: width - sourceSize.height: height - color: UM.Theme.getColor("text") - visible: preheatCountdown.visible - source: UM.Theme.getIcon("print_time") - anchors.right: preheatCountdown.left - anchors.rightMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) - anchors.verticalCenter: preheatCountdown.verticalCenter - } - - Timer - { - id: preheatUpdateTimer - interval: 100 //Update every 100ms. You want to update every 1s, but then you have one timer for the updating running out of sync with the actual date timer and you might skip seconds. - running: connectedPrinter != null && connectedPrinter.preheatBedRemainingTime != "" - repeat: true - onTriggered: update() - property var endTime: new Date() //Set initial endTime to be the current date, so that the endTime has initially already passed and the timer text becomes invisible if you were to update. - function update() - { - preheatCountdown.text = "" - if (connectedPrinter != null) - { - preheatCountdown.text = connectedPrinter.preheatBedRemainingTime; - } - if (preheatCountdown.text == "") //Either time elapsed or not connected. - { - stop(); - } - } - } - Label - { - id: preheatCountdown - text: connectedPrinter != null ? connectedPrinter.preheatBedRemainingTime : "" - visible: text != "" //Has no direct effect, but just so that we can link visibility of clock icon to visibility of the countdown text. - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - anchors.right: preheatButton.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: preheatButton.verticalCenter - } - - Button //The pre-heat button. - { - id: preheatButton - height: UM.Theme.getSize("setting_control").height - visible: connectedPrinter != null ? connectedPrinter.canPreHeatBed: true - enabled: - { - if (!preheatTemperatureControl.enabled) - { - return false; //Not connected, not authenticated or printer is busy. - } - if (preheatUpdateTimer.running) - { - return true; //Can always cancel if the timer is running. - } - if (bedTemperature.properties.minimum_value != "None" && Math.floor(preheatTemperatureInput.text) < Math.floor(bedTemperature.properties.minimum_value)) - { - return false; //Target temperature too low. - } - if (bedTemperature.properties.maximum_value != "None" && Math.floor(preheatTemperatureInput.text) > Math.floor(bedTemperature.properties.maximum_value)) - { - return false; //Target temperature too high. - } - if (Math.floor(preheatTemperatureInput.text) == 0) - { - return false; //Setting the temperature to 0 is not allowed (since that cancels the pre-heating). - } - return true; //Preconditions are met. - } - anchors.right: parent.right - anchors.bottom: parent.bottom - anchors.margins: UM.Theme.getSize("default_margin").width - style: ButtonStyle { - background: Rectangle - { - border.width: UM.Theme.getSize("default_lining").width - implicitWidth: actualLabel.contentWidth + (UM.Theme.getSize("default_margin").width * 2) - border.color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled_border"); - } - else if(control.pressed) - { - return UM.Theme.getColor("action_button_active_border"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered_border"); - } - else - { - return UM.Theme.getColor("action_button_border"); - } - } - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled"); - } - else if(control.pressed) - { - return UM.Theme.getColor("action_button_active"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered"); - } - else - { - return UM.Theme.getColor("action_button"); - } - } - Behavior on color - { - ColorAnimation - { - duration: 50 - } - } - - Label - { - id: actualLabel - anchors.centerIn: parent - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled_text"); - } - else if(control.pressed) - { - return UM.Theme.getColor("action_button_active_text"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered_text"); - } - else - { - return UM.Theme.getColor("action_button_text"); - } - } - font: UM.Theme.getFont("action_button") - text: preheatUpdateTimer.running ? catalog.i18nc("@button Cancel pre-heating", "Cancel") : catalog.i18nc("@button", "Pre-heat") - } - } - } - - onClicked: - { - if (!preheatUpdateTimer.running) - { - connectedPrinter.preheatBed(preheatTemperatureInput.text, connectedPrinter.preheatBedTimeout); - preheatUpdateTimer.start(); - preheatUpdateTimer.update(); //Update once before the first timer is triggered. - } - else - { - connectedPrinter.cancelPreheatBed(); - preheatUpdateTimer.update(); - } - } - - onHoveredChanged: - { - if (hovered) - { - base.showTooltip( - base, - {x: 0, y: preheatButton.mapToItem(base, 0, 0).y}, - catalog.i18nc("@tooltip of pre-heat", "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.") - ); - } - else - { - base.hideTooltip(); - } - } + visible: { + if(activePrinter != null && activePrinter.bed_temperature != -1) + { + return true + } + return false } + printerModel: activePrinter } UM.SettingPropertyProvider diff --git a/resources/qml/PrinterOutput/HeatedBedBox.qml b/resources/qml/PrinterOutput/HeatedBedBox.qml new file mode 100644 index 0000000000..6ff48df6a2 --- /dev/null +++ b/resources/qml/PrinterOutput/HeatedBedBox.qml @@ -0,0 +1,399 @@ +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 + +Item +{ + implicitWidth: parent.width + height: visible ? UM.Theme.getSize("sidebar_extruder_box").height : 0 + property var printerModel + Rectangle + { + color: UM.Theme.getColor("sidebar") + anchors.fill: parent + + Label //Build plate label. + { + text: catalog.i18nc("@label", "Build plate") + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + anchors.left: parent.left + anchors.top: parent.top + anchors.margins: UM.Theme.getSize("default_margin").width + } + + Label //Target temperature. + { + id: bedTargetTemperature + text: printerModel != null ? printerModel.targetBedTemperature + "°C" : "" + font: UM.Theme.getFont("small") + color: UM.Theme.getColor("text_inactive") + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.bottom: bedCurrentTemperature.bottom + + MouseArea //For tooltip. + { + id: bedTargetTemperatureTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: bedTargetTemperature.mapToItem(base, 0, -parent.height / 4).y}, + catalog.i18nc("@tooltip", "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.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + Label //Current temperature. + { + id: bedCurrentTemperature + text: printerModel != null ? printerModel.bedTemperature + "°C" : "" + font: UM.Theme.getFont("large") + color: UM.Theme.getColor("text") + anchors.right: bedTargetTemperature.left + anchors.top: parent.top + anchors.margins: UM.Theme.getSize("default_margin").width + + MouseArea //For tooltip. + { + id: bedTemperatureTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: bedCurrentTemperature.mapToItem(base, 0, -parent.height / 4).y}, + catalog.i18nc("@tooltip", "The current temperature of the heated bed.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + Rectangle //Input field for pre-heat temperature. + { + id: preheatTemperatureControl + color: !enabled ? UM.Theme.getColor("setting_control_disabled") : showError ? UM.Theme.getColor("setting_validation_error_background") : UM.Theme.getColor("setting_validation_ok") + property var showError: + { + if(bedTemperature.properties.maximum_value != "None" && bedTemperature.properties.maximum_value < Math.floor(preheatTemperatureInput.text)) + { + return true; + } else + { + return false; + } + } + enabled: + { + if (printerModel == null) + { + return false; //Can't preheat if not connected. + } + if (!connectedPrinter.acceptsCommands) + { + return false; //Not allowed to do anything. + } + if (connectedPrinter.jobState == "printing" || connectedPrinter.jobState == "pre_print" || connectedPrinter.jobState == "resuming" || connectedPrinter.jobState == "pausing" || connectedPrinter.jobState == "paused" || connectedPrinter.jobState == "error" || connectedPrinter.jobState == "offline") + { + return false; //Printer is in a state where it can't react to pre-heating. + } + return true; + } + border.width: UM.Theme.getSize("default_lining").width + border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : preheatTemperatureInputMouseArea.containsMouse ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border") + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.bottom: parent.bottom + anchors.bottomMargin: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("setting_control").width + height: UM.Theme.getSize("setting_control").height + visible: printerModel != null ? printerModel.canPreHeatBed: true + Rectangle //Highlight of input field. + { + anchors.fill: parent + anchors.margins: UM.Theme.getSize("default_lining").width + color: UM.Theme.getColor("setting_control_highlight") + opacity: preheatTemperatureControl.hovered ? 1.0 : 0 + } + Label //Maximum temperature indication. + { + text: (bedTemperature.properties.maximum_value != "None" ? bedTemperature.properties.maximum_value : "") + "°C" + color: UM.Theme.getColor("setting_unit") + font: UM.Theme.getFont("default") + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width + anchors.verticalCenter: parent.verticalCenter + } + MouseArea //Change cursor on hovering. + { + id: preheatTemperatureInputMouseArea + hoverEnabled: true + anchors.fill: parent + cursorShape: Qt.IBeamCursor + + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: preheatTemperatureInputMouseArea.mapToItem(base, 0, 0).y}, + catalog.i18nc("@tooltip of temperature input", "The temperature to pre-heat the bed to.") + ); + } + else + { + base.hideTooltip(); + } + } + } + TextInput + { + id: preheatTemperatureInput + font: UM.Theme.getFont("default") + color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") + selectByMouse: true + maximumLength: 10 + enabled: parent.enabled + validator: RegExpValidator { regExp: /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ } //Floating point regex. + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + renderType: Text.NativeRendering + + Component.onCompleted: + { + if (!bedTemperature.properties.value) + { + text = ""; + } + if ((bedTemperature.resolve != "None" && bedTemperature.resolve) && (bedTemperature.stackLevels[0] != 0) && (bedTemperature.stackLevels[0] != 1)) + { + // We have a resolve function. Indicates that the setting is not settable per extruder and that + // we have to choose between the resolved value (default) and the global value + // (if user has explicitly set this). + text = bedTemperature.resolve; + } + else + { + text = bedTemperature.properties.value; + } + } + } + } + + UM.RecolorImage + { + id: preheatCountdownIcon + width: UM.Theme.getSize("save_button_specs_icons").width + height: UM.Theme.getSize("save_button_specs_icons").height + sourceSize.width: width + sourceSize.height: height + color: UM.Theme.getColor("text") + visible: preheatCountdown.visible + source: UM.Theme.getIcon("print_time") + anchors.right: preheatCountdown.left + anchors.rightMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) + anchors.verticalCenter: preheatCountdown.verticalCenter + } + + Timer + { + id: preheatUpdateTimer + interval: 100 //Update every 100ms. You want to update every 1s, but then you have one timer for the updating running out of sync with the actual date timer and you might skip seconds. + running: printerModel != null && printerModel.preheatBedRemainingTime != "" + repeat: true + onTriggered: update() + property var endTime: new Date() //Set initial endTime to be the current date, so that the endTime has initially already passed and the timer text becomes invisible if you were to update. + function update() + { + preheatCountdown.text = "" + if (printerModel != null) + { + preheatCountdown.text = connectedPrinter.preheatBedRemainingTime; + } + if (preheatCountdown.text == "") //Either time elapsed or not connected. + { + stop(); + } + } + } + Label + { + id: preheatCountdown + text: printerModel != null ? printerModel.preheatBedRemainingTime : "" + visible: text != "" //Has no direct effect, but just so that we can link visibility of clock icon to visibility of the countdown text. + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + anchors.right: preheatButton.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.verticalCenter: preheatButton.verticalCenter + } + + Button //The pre-heat button. + { + id: preheatButton + height: UM.Theme.getSize("setting_control").height + visible: printerModel != null ? printerModel.canPreHeatBed: true + enabled: + { + if (!preheatTemperatureControl.enabled) + { + return false; //Not connected, not authenticated or printer is busy. + } + if (preheatUpdateTimer.running) + { + return true; //Can always cancel if the timer is running. + } + if (bedTemperature.properties.minimum_value != "None" && Math.floor(preheatTemperatureInput.text) < Math.floor(bedTemperature.properties.minimum_value)) + { + return false; //Target temperature too low. + } + if (bedTemperature.properties.maximum_value != "None" && Math.floor(preheatTemperatureInput.text) > Math.floor(bedTemperature.properties.maximum_value)) + { + return false; //Target temperature too high. + } + if (Math.floor(preheatTemperatureInput.text) == 0) + { + return false; //Setting the temperature to 0 is not allowed (since that cancels the pre-heating). + } + return true; //Preconditions are met. + } + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.margins: UM.Theme.getSize("default_margin").width + style: ButtonStyle { + background: Rectangle + { + border.width: UM.Theme.getSize("default_lining").width + implicitWidth: actualLabel.contentWidth + (UM.Theme.getSize("default_margin").width * 2) + border.color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_border"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active_border"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_border"); + } + else + { + return UM.Theme.getColor("action_button_border"); + } + } + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered"); + } + else + { + return UM.Theme.getColor("action_button"); + } + } + Behavior on color + { + ColorAnimation + { + duration: 50 + } + } + + Label + { + id: actualLabel + anchors.centerIn: parent + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_text"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active_text"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_text"); + } + else + { + return UM.Theme.getColor("action_button_text"); + } + } + font: UM.Theme.getFont("action_button") + text: preheatUpdateTimer.running ? catalog.i18nc("@button Cancel pre-heating", "Cancel") : catalog.i18nc("@button", "Pre-heat") + } + } + } + + onClicked: + { + if (!preheatUpdateTimer.running) + { + printerModel.preheatBed(preheatTemperatureInput.text, printerModel.preheatBedTimeout); + preheatUpdateTimer.start(); + preheatUpdateTimer.update(); //Update once before the first timer is triggered. + } + else + { + printerModel.cancelPreheatBed(); + preheatUpdateTimer.update(); + } + } + + onHoveredChanged: + { + if (hovered) + { + base.showTooltip( + base, + {x: 0, y: preheatButton.mapToItem(base, 0, 0).y}, + catalog.i18nc("@tooltip of pre-heat", "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.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } +} \ No newline at end of file From f987e6d977d8108ab6225b6d3a6df401d89a57b8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 16:59:17 +0100 Subject: [PATCH 049/551] Functionality properties (canPause, canPreHeatBed, etc) are now in the Controller. It's actually up to the controller to say something about this, so this location makes more sense CL-541 --- cura/PrinterOutput/PrinterOutputController.py | 5 ++++- cura/PrinterOutput/PrinterOutputModel.py | 22 ++++++++++--------- resources/qml/PrinterOutput/HeatedBedBox.qml | 4 ++++ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index 9f9a26a2a5..525c8db102 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -9,7 +9,10 @@ if MYPY: class PrinterOutputController: def __init__(self): - pass + self.can_pause = True + self.can_abort = True + self.can_pre_heat_bed = True + self.can_control_manually = True def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOuputModel", temperature: int): # TODO: implement diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 12c2b4fe58..97f5c69723 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -35,12 +35,6 @@ class PrinterOutputModel(QObject): self._printer_state = "unknown" - # Features of the printer; - self._can_pause = True - self._can_abort = True - self._can_pre_heat_bed = True - self._can_control_manually = True - @pyqtProperty(str, notify=keyChanged) def key(self): return self._key @@ -175,19 +169,27 @@ class PrinterOutputModel(QObject): # Does the printer support pre-heating the bed at all @pyqtProperty(bool, constant=True) def canPreHeatBed(self): - return self._can_pre_heat_bed + if self._controller: + return self._controller.can_pre_heat_bed + return False # Does the printer support pause at all @pyqtProperty(bool, constant=True) def canPause(self): - return self._can_pause + if self._controller: + return self.can_pause + return False # Does the printer support abort at all @pyqtProperty(bool, constant=True) def canAbort(self): - return self._can_abort + if self._controller: + return self.can_abort + return False # Does the printer support manual control at all @pyqtProperty(bool, constant=True) def canControlManually(self): - return self._can_control_manually + if self._controller: + return self.can_control_manually + return False diff --git a/resources/qml/PrinterOutput/HeatedBedBox.qml b/resources/qml/PrinterOutput/HeatedBedBox.qml index 6ff48df6a2..de34fe5943 100644 --- a/resources/qml/PrinterOutput/HeatedBedBox.qml +++ b/resources/qml/PrinterOutput/HeatedBedBox.qml @@ -229,6 +229,10 @@ Item property var endTime: new Date() //Set initial endTime to be the current date, so that the endTime has initially already passed and the timer text becomes invisible if you were to update. function update() { + if(printerModel != null && !printerModel.canPreHeatBed) + { + return // Nothing to do, printer cant preheat at all! + } preheatCountdown.text = "" if (printerModel != null) { From 7465a6551a7a0f8331237dc2f1bd27c1e9d7c306 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 22 Nov 2017 11:59:07 +0100 Subject: [PATCH 050/551] Setup the authentication stuff for LegacyUM3 CL-541 --- .../NetworkedPrinterOutputDevice.py | 39 ++- cura/PrinterOutputDevice.py | 2 + .../LegacyUM3OutputDevice.py | 249 +++++++++++++++++- 3 files changed, 284 insertions(+), 6 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index d2886328de..b9bd27c129 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -8,9 +8,19 @@ from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, py from time import time from typing import Callable, Any +from enum import IntEnum + + +class AuthState(IntEnum): + NotAuthenticated = 1 + AuthenticationRequested = 2 + Authenticated = 3 + AuthenticationDenied = 4 + AuthenticationReceived = 5 class NetworkedPrinterOutputDevice(PrinterOutputDevice): + authenticationStateChanged = pyqtSignal() def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, parent = parent) self._manager = None @@ -27,6 +37,16 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._user_agent = "%s/%s " % (Application.getInstance().getApplicationName(), Application.getInstance().getVersion()) self._onFinishedCallbacks = {} + self._authentication_state = AuthState.NotAuthenticated + + def setAuthenticationState(self, authentication_state): + if self._authentication_state != authentication_state: + self._authentication_state = authentication_state + self.authenticationStateChanged.emit() + + @pyqtProperty(int, notify=authenticationStateChanged) + def authenticationState(self): + return self._authentication_state def _update(self): if self._last_response_time: @@ -81,23 +101,30 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._last_request_time = time() pass - def _post(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None], onProgress: Callable): + def _post(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() + request = self._createEmptyRequest(target) self._last_request_time = time() - pass + reply = self._manager.post(request, data) + if onProgress is not None: + reply.uploadProgress.connect(onProgress) + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + + def _onAuthenticationRequired(self, reply, authenticator): + Logger.log("w", "Request to {url} required authentication, which was not implemented".format(url = reply.url().toString())) def _createNetworkManager(self): Logger.log("d", "Creating network manager") if self._manager: self._manager.finished.disconnect(self.__handleOnFinished) #self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged) - #self._manager.authenticationRequired.disconnect(self._onAuthenticationRequired) + self._manager.authenticationRequired.disconnect(self._onAuthenticationRequired) self._manager = QNetworkAccessManager() self._manager.finished.connect(self.__handleOnFinished) self._last_manager_create_time = time() - #self._manager.authenticationRequired.connect(self._onAuthenticationRequired) + self._manager.authenticationRequired.connect(self._onAuthenticationRequired) #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes def __handleOnFinished(self, reply: QNetworkReply): @@ -107,7 +134,9 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._last_response_time = time() - self.setConnectionState(ConnectionState.connected) + if self._connection_state == ConnectionState.connecting: + self.setConnectionState(ConnectionState.connected) + try: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) except Exception: diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 56ac318f20..a170037311 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -135,11 +135,13 @@ class PrinterOutputDevice(QObject, OutputDevice): ## Attempt to establish connection def connect(self): + self.setConnectionState(ConnectionState.connecting) self._update_timer.start() ## Attempt to close the connection def close(self): self._update_timer.stop() + self.setConnectionState(ConnectionState.closed) ## Ensure that close gets called when object is destroyed def __del__(self): diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 60409ec729..cb9959ec69 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -1,28 +1,256 @@ -from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice +from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice, AuthState from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel from UM.Logger import Logger from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Application import Application +from UM.i18n import i18nCatalog +from UM.Message import Message from PyQt5.QtNetwork import QNetworkRequest +from PyQt5.QtCore import QTimer import json +import os # To get the username + +i18n_catalog = i18nCatalog("cura") +## This is the output device for the "Legacy" API of the UM3. All firmware before 4.0.1 uses this API. +# Everything after that firmware uses the ClusterUM3Output. +# The Legacy output device can only have one printer (whereas the cluster can have 0 to n). +# +# Authentication is done in a number of steps; +# 1. Request an id / key pair by sending the application & user name. (state = authRequested) +# 2. Machine sends this back and will display an approve / deny message on screen. (state = AuthReceived) +# 3. OutputDevice will poll if the button was pressed. +# 4. At this point the machine either has the state Authenticated or AuthenticationDenied. +# 5. As a final step, we verify the authentication, as this forces the QT manager to setup the authenticator. class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, address = address, properties = properties, parent = parent) self._api_prefix = "/api/v1/" self._number_of_extruders = 2 + self._authentication_id = None + self._authentication_key = None + + self._authentication_counter = 0 + self._max_authentication_counter = 5 * 60 # Number of attempts before authentication timed out (5 min) + + self._authentication_timer = QTimer() + self._authentication_timer.setInterval(1000) # TODO; Add preference for update interval + self._authentication_timer.setSingleShot(False) + + self._authentication_timer.timeout.connect(self._onAuthenticationTimer) + + # The messages are created when connect is called the first time. + # This ensures that the messages are only created for devices that actually want to connect. + self._authentication_requested_message = None + self._authentication_failed_message = None + self._not_authenticated_message = None + + def _setupMessages(self): + self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status", + "Access to the printer requested. Please approve the request on the printer"), + lifetime=0, dismissable=False, progress=0, + title=i18n_catalog.i18nc("@info:title", + "Authentication status")) + + self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", ""), + title=i18n_catalog.i18nc("@info:title", "Authentication Status")) + self._authentication_failed_message.addAction("Retry", i18n_catalog.i18nc("@action:button", "Retry"), None, + i18n_catalog.i18nc("@info:tooltip", "Re-send the access request")) + self._authentication_failed_message.actionTriggered.connect(self._requestAuthentication) + self._authentication_succeeded_message = Message( + i18n_catalog.i18nc("@info:status", "Access to the printer accepted"), + title=i18n_catalog.i18nc("@info:title", "Authentication Status")) + + self._not_authenticated_message = Message( + i18n_catalog.i18nc("@info:status", "No access to print with this printer. Unable to send print job."), + title=i18n_catalog.i18nc("@info:title", "Authentication Status")) + self._not_authenticated_message.addAction("Request", i18n_catalog.i18nc("@action:button", "Request Access"), + None, i18n_catalog.i18nc("@info:tooltip", + "Send access request to the printer")) + self._not_authenticated_message.actionTriggered.connect(self._requestAuthentication) + + def connect(self): + super().connect() + self._setupMessages() + global_container = Application.getInstance().getGlobalContainerStack() + if global_container: + self._authentication_id = global_container.getMetaDataEntry("network_authentication_id", None) + self._authentication_key = global_container.getMetaDataEntry("network_authentication_key", None) + + def close(self): + super().close() + if self._authentication_requested_message: + self._authentication_requested_message.hide() + if self._authentication_failed_message: + self._authentication_failed_message.hide() + if self._authentication_succeeded_message: + self._authentication_succeeded_message.hide() + + self._authentication_timer.stop() + + ## Send all material profiles to the printer. + def sendMaterialProfiles(self): + # TODO + pass + def _update(self): if not super()._update(): return + if self._authentication_state == AuthState.NotAuthenticated: + if self._authentication_id is None and self._authentication_key is None: + # This machine doesn't have any authentication, so request it. + self._requestAuthentication() + elif self._authentication_id is not None and self._authentication_key is not None: + # We have authentication info, but we haven't checked it out yet. Do so now. + self._verifyAuthentication() + elif self._authentication_state == AuthState.AuthenticationReceived: + # We have an authentication, but it's not confirmed yet. + self._checkAuthentication() + + # We don't need authentication for requesting info, so we can go right ahead with requesting this. self._get("printer", onFinished=self._onGetPrinterDataFinished) self._get("print_job", onFinished=self._onGetPrintJobFinished) + def _resetAuthenticationRequestedMessage(self): + if self._authentication_requested_message: + self._authentication_requested_message.hide() + self._authentication_timer.stop() + self._authentication_counter = 0 + + def _onAuthenticationTimer(self): + self._authentication_counter += 1 + self._authentication_requested_message.setProgress( + self._authentication_counter / self._max_authentication_counter * 100) + if self._authentication_counter > self._max_authentication_counter: + self._authentication_timer.stop() + Logger.log("i", "Authentication timer ended. Setting authentication to denied for printer: %s" % self._key) + self.setAuthenticationState(AuthState.AuthenticationDenied) + self._resetAuthenticationRequestedMessage() + self._authentication_failed_message.show() + + def _verifyAuthentication(self): + Logger.log("d", "Attempting to verify authentication") + # This will ensure that the "_onAuthenticationRequired" is triggered, which will setup the authenticator. + self._get("auth/verify", onFinished=self._onVerifyAuthenticationCompleted) + + def _onVerifyAuthenticationCompleted(self, reply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + if status_code == 401: + # Something went wrong; We somehow tried to verify authentication without having one. + Logger.log("d", "Attempted to verify auth without having one.") + self._authentication_id = None + self._authentication_key = None + self.setAuthenticationState(AuthState.NotAuthenticated) + elif status_code == 403: + Logger.log("d", + "While trying to verify the authentication state, we got a forbidden response. Our own auth state was %s", + self._authentication_state) + self.setAuthenticationState(AuthState.AuthenticationDenied) + self._authentication_failed_message.show() + elif status_code == 200: + self.setAuthenticationState(AuthState.Authenticated) + # Now we know for sure that we are authenticated, send the material profiles to the machine. + self.sendMaterialProfiles() + + def _checkAuthentication(self): + Logger.log("d", "Checking if authentication is correct for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) + self._get("auth/check/" + str(self._authentication_id), onFinished=self._onCheckAuthenticationFinished) + + def _onCheckAuthenticationFinished(self, reply): + if str(self._authentication_id) not in reply.url().toString(): + Logger.log("w", "Got an old id response.") + # Got response for old authentication ID. + return + try: + data = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid authentication check from printer: Not valid JSON.") + return + + if data.get("message", "") == "authorized": + Logger.log("i", "Authentication was approved") + self.setAuthenticationState(AuthState.Authenticated) + self._saveAuthentication() + + # Double check that everything went well. + self._verifyAuthentication() + + # Notify the user. + self._resetAuthenticationRequestedMessage() + self._authentication_succeeded_message.show() + elif data.get("message", "") == "unauthorized": + Logger.log("i", "Authentication was denied.") + self.setAuthenticationState(AuthState.AuthenticationDenied) + self._authentication_failed_message.show() + + def _saveAuthentication(self): + global_container_stack = Application.getInstance().getGlobalContainerStack() + if global_container_stack: + if "network_authentication_key" in global_container_stack.getMetaData(): + global_container_stack.setMetaDataEntry("network_authentication_key", self._authentication_key) + else: + global_container_stack.addMetaDataEntry("network_authentication_key", self._authentication_key) + + if "network_authentication_id" in global_container_stack.getMetaData(): + global_container_stack.setMetaDataEntry("network_authentication_id", self._authentication_id) + else: + global_container_stack.addMetaDataEntry("network_authentication_id", self._authentication_id) + + # Force save so we are sure the data is not lost. + Application.getInstance().saveStack(global_container_stack) + Logger.log("i", "Authentication succeeded for id %s and key %s", self._authentication_id, + self._getSafeAuthKey()) + else: + Logger.log("e", "Unable to save authentication for id %s and key %s", self._authentication_id, + self._getSafeAuthKey()) + + def _onRequestAuthenticationFinished(self, reply): + try: + data = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid authentication request reply from printer: Not valid JSON.") + self.setAuthenticationState(AuthState.NotAuthenticated) + return + + self.setAuthenticationState(AuthState.AuthenticationReceived) + self._authentication_id = data["id"] + self._authentication_key = data["key"] + Logger.log("i", "Got a new authentication ID (%s) and KEY (%s). Waiting for authorization.", + self._authentication_id, self._getSafeAuthKey()) + + def _requestAuthentication(self): + self._authentication_requested_message.show() + self._authentication_timer.start() + + # Reset any previous authentication info. If this isn't done, the "Retry" action on the failed message might + # give issues. + self._authentication_key = None + self._authentication_id = None + + self._post("auth/request", + json.dumps({"application": "Cura-" + Application.getInstance().getVersion(), + "user": self._getUserName()}).encode(), + onFinished=self._onRequestAuthenticationFinished) + + self.setAuthenticationState(AuthState.AuthenticationRequested) + + def _onAuthenticationRequired(self, reply, authenticator): + if self._authentication_id is not None and self._authentication_key is not None: + Logger.log("d", + "Authentication was required for printer: %s. Setting up authenticator with ID %s and key %s", + self._id, self._authentication_id, self._getSafeAuthKey()) + authenticator.setUser(self._authentication_id) + authenticator.setPassword(self._authentication_key) + else: + Logger.log("d", "No authentication is available to use for %s, but we did got a request for it.", self._key) + def _onGetPrintJobFinished(self, reply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) @@ -104,3 +332,22 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): else: Logger.log("w", "Got status code {status_code} while trying to get printer data".format(status_code = status_code)) + + ## Convenience function to "blur" out all but the last 5 characters of the auth key. + # This can be used to debug print the key, without it compromising the security. + def _getSafeAuthKey(self): + if self._authentication_key is not None: + result = self._authentication_key[-5:] + result = "********" + result + return result + + return self._authentication_key + + ## Convenience function to get the username from the OS. + # The code was copied from the getpass module, as we try to use as little dependencies as possible. + def _getUserName(self): + for name in ("LOGNAME", "USER", "LNAME", "USERNAME"): + user = os.environ.get(name) + if user: + return user + return "Unknown User" # Couldn't find out username. \ No newline at end of file From 96d5c7152b2a3a742b42d2062dd97710e182da90 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 10:31:39 +0100 Subject: [PATCH 051/551] Added sending material profiles to LegacyUM3 CL-541 --- .../NetworkedPrinterOutputDevice.py | 57 ++++++++++++++++--- .../LegacyUM3OutputDevice.py | 25 ++++++++ 2 files changed, 73 insertions(+), 9 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index b9bd27c129..395771b833 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -7,7 +7,7 @@ from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetwork from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl from time import time -from typing import Callable, Any +from typing import Callable, Any, Optional from enum import IntEnum @@ -39,6 +39,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._onFinishedCallbacks = {} self._authentication_state = AuthState.NotAuthenticated + self._cached_multiparts = {} + def setAuthenticationState(self, authentication_state): if self._authentication_state != authentication_state: self._authentication_state = authentication_state @@ -79,29 +81,35 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) return request - def _put(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None]): + def _clearCachedMultiPart(self, reply): + if id(reply) in self._cached_multiparts: + del self._cached_multiparts[id(reply)] + + def _put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) self._last_request_time = time() reply = self._manager.put(request, data.encode()) - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + if onFinished is not None: + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _get(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]): + def _get(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) self._last_request_time = time() reply = self._manager.get(request) - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + if onFinished is not None: + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _delete(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]): + def _delete(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): if self._manager is None: self._createNetworkManager() self._last_request_time = time() pass - def _post(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None], onProgress: Callable = None): + def _post(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -109,7 +117,31 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): reply = self._manager.post(request, data) if onProgress is not None: reply.uploadProgress.connect(onProgress) - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + if onFinished is not None: + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + + def _postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + if self._manager is None: + self._createNetworkManager() + request = self._createEmptyRequest(target) + + multi_post_part = QHttpMultiPart() + post_part = QHttpPart() + post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data) + post_part.setBody(body_data) + multi_post_part.append(post_part) + + self._last_request_time = time() + + reply = self._manager.post(request, multi_post_part) + + # Due to garbage collection on python doing some weird stuff, we need to keep hold of a reference + self._cached_multiparts[id(reply)] = (post_part, multi_post_part, reply) + + if onProgress is not None: + reply.uploadProgress.connect(onProgress) + if onFinished is not None: + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished def _onAuthenticationRequired(self, reply, authenticator): Logger.log("w", "Request to {url} required authentication, which was not implemented".format(url = reply.url().toString())) @@ -128,6 +160,11 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes def __handleOnFinished(self, reply: QNetworkReply): + # Due to garbage collection, we need to cache certain bits of post operations. + # As we don't want to keep them around forever, delete them if we get a reply. + if reply.operation() == QNetworkAccessManager.PostOperation: + self._clearCachedMultiPart(reply) + if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) is None: # No status code means it never even reached remote. return @@ -137,8 +174,10 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if self._connection_state == ConnectionState.connecting: self.setConnectionState(ConnectionState.connected) + callback_key = reply.url().toString() + str(reply.operation()) try: - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) + if callback_key in self._onFinishedCallbacks: + self._onFinishedCallbacks[callback_key](reply) except Exception: Logger.logException("w", "something went wrong with callback") diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index cb9959ec69..1cd5a19fe4 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -3,6 +3,8 @@ from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel +from cura.Settings.ContainerManager import ContainerManager + from UM.Logger import Logger from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Application import Application @@ -97,6 +99,29 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): ## Send all material profiles to the printer. def sendMaterialProfiles(self): + Logger.log("i", "Sending material profiles to printer") + + # TODO: Might want to move this to a job... + for container in ContainerRegistry.getInstance().findInstanceContainers(type="material"): + try: + xml_data = container.serialize() + if xml_data == "" or xml_data is None: + continue + + names = ContainerManager.getInstance().getLinkedMaterials(container.getId()) + if names: + # There are other materials that share this GUID. + if not container.isReadOnly(): + continue # If it's not readonly, it's created by user, so skip it. + + file_name = "none.xml" + self._postForm("materials", "form-data; name=\"file\";filename=\"%s\"" % file_name, xml_data.encode(), onFinished=None) + + except NotImplementedError: + # If the material container is not the most "generic" one it can't be serialized an will raise a + # NotImplementedError. We can simply ignore these. + pass + # TODO pass From 8b8d67b3a83bac74e366a8afaacc9ddfc0a1e41a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 13:37:59 +0100 Subject: [PATCH 052/551] LegacyUM3 now handles warnings & errors again CL-541 --- cura/PrinterOutput/MaterialOutputModel.py | 9 +- .../NetworkedPrinterOutputDevice.py | 4 + cura/PrinterOutput/PrinterOutputModel.py | 1 + cura/PrinterOutputDevice.py | 17 +- .../LegacyUM3OutputDevice.py | 146 +++++++++++++++++- 5 files changed, 166 insertions(+), 11 deletions(-) diff --git a/cura/PrinterOutput/MaterialOutputModel.py b/cura/PrinterOutput/MaterialOutputModel.py index 0471b85db8..64ebd3c94c 100644 --- a/cura/PrinterOutput/MaterialOutputModel.py +++ b/cura/PrinterOutput/MaterialOutputModel.py @@ -5,12 +5,13 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot class MaterialOutputModel(QObject): - def __init__(self, guid, type, color, brand, parent = None): + def __init__(self, guid, type, color, brand, name, parent = None): super().__init__(parent) self._guid = guid self._type = type self._color = color self._brand = brand + self._name = name @pyqtProperty(str, constant = True) def guid(self): @@ -26,4 +27,8 @@ class MaterialOutputModel(QObject): @pyqtProperty(str, constant=True) def color(self): - return self._color \ No newline at end of file + return self._color + + @pyqtProperty(str, constant=True) + def name(self): + return self._name \ No newline at end of file diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 395771b833..97960db1f3 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -21,6 +21,7 @@ class AuthState(IntEnum): class NetworkedPrinterOutputDevice(PrinterOutputDevice): authenticationStateChanged = pyqtSignal() + def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, parent = parent) self._manager = None @@ -41,6 +42,9 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._cached_multiparts = {} + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): + raise NotImplementedError("requestWrite needs to be implemented") + def setAuthenticationState(self, authentication_state): if self._authentication_state != authentication_state: self._authentication_state = authentication_state diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 97f5c69723..23423609f7 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -11,6 +11,7 @@ MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.PrinterOutputController import PrinterOutputController + from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel class PrinterOutputModel(QObject): diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index a170037311..9744f352fd 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -5,13 +5,19 @@ from UM.i18n import i18nCatalog from UM.OutputDevice.OutputDevice import OutputDevice from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl from PyQt5.QtQml import QQmlComponent, QQmlContext -from enum import IntEnum # For the connection state tracking. + from UM.Logger import Logger from UM.Signal import signalemitter from UM.Application import Application import os +from enum import IntEnum # For the connection state tracking. +from typing import List, Optional + +MYPY = False +if MYPY: + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel i18n_catalog = i18nCatalog("cura") @@ -32,7 +38,7 @@ class PrinterOutputDevice(QObject, OutputDevice): def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) - self._printers = [] + self._printers = [] # type: List[PrinterOutputModel] self._monitor_view_qml_path = "" self._monitor_component = None @@ -62,20 +68,19 @@ class PrinterOutputDevice(QObject, OutputDevice): def _update(self): pass - def _getPrinterByKey(self, key): + def _getPrinterByKey(self, key) -> Optional["PrinterOutputModel"]: for printer in self._printers: if printer.key == key: return printer return None - def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None): + def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs): raise NotImplementedError("requestWrite needs to be implemented") @pyqtProperty(QObject, notify = printersChanged) - def activePrinter(self): + def activePrinter(self) -> Optional["PrinterOutputModel"]: if len(self._printers): - return self._printers[0] return None diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 1cd5a19fe4..37d02013b9 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -4,6 +4,7 @@ from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel from cura.Settings.ContainerManager import ContainerManager +from cura.Settings.ExtruderManager import ExtruderManager from UM.Logger import Logger from UM.Settings.ContainerRegistry import ContainerRegistry @@ -13,6 +14,7 @@ from UM.Message import Message from PyQt5.QtNetwork import QNetworkRequest from PyQt5.QtCore import QTimer +from PyQt5.QtWidgets import QMessageBox import json import os # To get the username @@ -122,8 +124,144 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): # NotImplementedError. We can simply ignore these. pass - # TODO - pass + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): + if not self.activePrinter: + # No active printer. Unable to write + return + + if self.activePrinter.printerState not in ["idle", ""]: + # Printer is not able to accept commands. + return + + if self._authentication_state != AuthState.Authenticated: + # Not authenticated, so unable to send job. + return + + # Notify the UI that a switch to the print monitor should happen + Application.getInstance().showPrintMonitor.emit(True) + self.writeStarted.emit(self) + + gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", None) + if gcode is None: + # Unable to find g-code. Nothing to send + return + + errors = self._checkForErrors() + if errors: + text = i18n_catalog.i18nc("@label", "Unable to start a new print job.") + informative_text = i18n_catalog.i18nc("@label", + "There is an issue with the configuration of your Ultimaker, which makes it impossible to start the print. " + "Please resolve this issues before continuing.") + detailed_text = "" + for error in errors: + detailed_text += error + "\n" + + Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Mismatched configuration"), + text, + informative_text, + detailed_text, + buttons=QMessageBox.Ok, + icon=QMessageBox.Critical, + callback = self._messageBoxCallback + ) + return # Don't continue; Errors must block sending the job to the printer. + + # There might be multiple things wrong with the configuration. Check these before starting. + warnings = self._checkForWarnings() + + if warnings: + text = i18n_catalog.i18nc("@label", "Are you sure you wish to print with the selected configuration?") + informative_text = i18n_catalog.i18nc("@label", + "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.") + detailed_text = "" + for warning in warnings: + detailed_text += warning + "\n" + + Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Mismatched configuration"), + text, + informative_text, + detailed_text, + buttons=QMessageBox.Yes + QMessageBox.No, + icon=QMessageBox.Question, + callback=self._messageBoxCallback + ) + return + + # No warnings or errors, so we're good to go. + self._startPrint() + + def _startPrint(self): + # TODO: Implement + Logger.log("i", "Sending print job to printer.") + return + + def _messageBoxCallback(self, button): + def delayedCallback(): + if button == QMessageBox.Yes: + self._startPrint() + else: + Application.getInstance().showPrintMonitor.emit(False) + # For some unknown reason Cura on OSX will hang if we do the call back code + # immediately without first returning and leaving QML's event system. + + QTimer.singleShot(100, delayedCallback) + + def _checkForErrors(self): + errors = [] + print_information = Application.getInstance().getPrintInformation() + if not print_information.materialLengths: + Logger.log("w", "There is no material length information. Unable to check for errors.") + return errors + + for index, extruder in enumerate(self.activePrinter.extruders): + # Due to airflow issues, both slots must be loaded, regardless if they are actually used or not. + if extruder.hotendID == "": + # No Printcore loaded. + errors.append(i18n_catalog.i18nc("@info:status", "No Printcore loaded in slot {slot_number}".format(slot_number=index + 1))) + + if index < len(print_information.materialLengths) and print_information.materialLengths[index] != 0: + # The extruder is by this print. + if extruder.activeMaterial is None: + # No active material + errors.append(i18n_catalog.i18nc("@info:status", "No material loaded in slot {slot_number}".format(slot_number=index + 1))) + return errors + + def _checkForWarnings(self): + warnings = [] + print_information = Application.getInstance().getPrintInformation() + + if not print_information.materialLengths: + Logger.log("w", "There is no material length information. Unable to check for warnings.") + return warnings + + extruder_manager = ExtruderManager.getInstance() + + for index, extruder in enumerate(self.activePrinter.extruders): + if index < len(print_information.materialLengths) and print_information.materialLengths[index] != 0: + # The extruder is by this print. + + # TODO: material length check + + # Check if the right Printcore is active. + variant = extruder_manager.getExtruderStack(index).findContainer({"type": "variant"}) + if variant: + if variant.getName() != extruder.hotendID: + warnings.append(i18n_catalog.i18nc("@label", "Different PrintCore (Cura: {cura_printcore_name}, Printer: {remote_printcore_name}) selected for extruder {extruder_id}".format(cura_printcore_name = variant.getName(), remote_printcore_name = extruder.hotendID, extruder_id = index + 1))) + else: + Logger.log("w", "Unable to find variant.") + + # Check if the right material is loaded. + local_material = extruder_manager.getExtruderStack(index).findContainer({"type": "material"}) + if local_material: + if extruder.activeMaterial.guid != local_material.getMetaDataEntry("GUID"): + Logger.log("w", "Extruder %s has a different material (%s) as Cura (%s)", index + 1, extruder.activeMaterial.guid, local_material.getMetaDataEntry("GUID")) + warnings.append(i18n_catalog.i18nc("@label", "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}").format(local_material.getName(), extruder.activeMaterial.name, index + 1)) + else: + Logger.log("w", "Unable to find material.") + + return warnings + def _update(self): if not super()._update(): @@ -339,13 +477,15 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): color = containers[0].getMetaDataEntry("color_code") brand = containers[0].getMetaDataEntry("brand") material_type = containers[0].getMetaDataEntry("material") + name = containers[0].getName() else: # Unknown material. color = "#00000000" brand = "Unknown" material_type = "Unknown" + name = "Unknown" material = MaterialOutputModel(guid=material_guid, type=material_type, - brand=brand, color=color) + brand=brand, color=color, name = name) extruder.updateActiveMaterial(material) try: From f03a9787817674faea1f0601acfedcbed2abcf00 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 14:19:54 +0100 Subject: [PATCH 053/551] Sending & compressing g-codes re-added to LegacyUM3 CL-541 --- .../LegacyUM3OutputDevice.py | 107 +++++++++++++++++- 1 file changed, 102 insertions(+), 5 deletions(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 37d02013b9..e9963c678b 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -13,11 +13,15 @@ from UM.i18n import i18nCatalog from UM.Message import Message from PyQt5.QtNetwork import QNetworkRequest -from PyQt5.QtCore import QTimer +from PyQt5.QtCore import QTimer, QCoreApplication from PyQt5.QtWidgets import QMessageBox +from time import time + import json import os # To get the username +import gzip + i18n_catalog = i18nCatalog("cura") @@ -56,6 +60,10 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_failed_message = None self._not_authenticated_message = None + self._sending_gcode = False + self._compressing_gcode = False + self._gcode = [] + def _setupMessages(self): self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status", "Access to the printer requested. Please approve the request on the printer"), @@ -96,7 +104,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_failed_message.hide() if self._authentication_succeeded_message: self._authentication_succeeded_message.hide() - + self._sending_gcode = False + self._compressing_gcode = False self._authentication_timer.stop() ## Send all material profiles to the printer. @@ -141,8 +150,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): Application.getInstance().showPrintMonitor.emit(True) self.writeStarted.emit(self) - gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", None) - if gcode is None: + self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", []) + if not self._gcode: # Unable to find g-code. Nothing to send return @@ -192,10 +201,98 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._startPrint() def _startPrint(self): - # TODO: Implement Logger.log("i", "Sending print job to printer.") + if self._sending_gcode: + self._error_message = Message( + i18n_catalog.i18nc("@info:status", + "Sending new jobs (temporarily) blocked, still sending the previous print job.")) + self._error_message.show() + return + + self._sending_gcode = True + + self._send_gcode_start = time() + self._progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to printer"), 0, False, -1, + i18n_catalog.i18nc("@info:title", "Sending Data")) + self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "") + self._progress_message.actionTriggered.connect(self._progressMessageActionTriggered) + + self._progress_message.show() + compressed_gcode = self._compressGCode() + if compressed_gcode is None: + # Abort was called. + return + + file_name = "%s.gcode.gz" % Application.getInstance().getPrintInformation().jobName + self._postForm("print_job", "form-data; name=\"file\";filename=\"%s\"" % file_name, compressed_gcode, + onFinished=self._onPostPrintJobFinished) + return + def _progressMessageActionTriggered(self, message_id=None, action_id=None): + if action_id == "Abort": + Logger.log("d", "User aborted sending print to remote.") + self._progress_message.hide() + self._compressing_gcode = False + self._sending_gcode = False + Application.getInstance().showPrintMonitor.emit(False) + + def _onPostPrintJobFinished(self, reply): + self._progress_message.hide() + self._sending_gcode = False + + def __compressDataAndNotifyQt(self, data_to_append): + compressed_data = gzip.compress(data_to_append.encode("utf-8")) + self._progress_message.setProgress(-1) # Tickle the message so that it's clear that it's still being used. + QCoreApplication.processEvents() # Ensure that the GUI does not freeze. + + # Pretend that this is a response, as zipping might take a bit of time. + # If we don't do this, the device might trigger a timeout. + self._last_response_time = time() + return compressed_data + + def _onUploadPrintJobProgress(self, bytes_sent, bytes_total): + if bytes_total > 0: + new_progress = bytes_sent / bytes_total * 100 + # Treat upload progress as response. Uploading can take more than 10 seconds, so if we don't, we can get + # timeout responses if this happens. + self._last_response_time = time() + if new_progress > self._progress_message.getProgress(): + self._progress_message.show() # Ensure that the message is visible. + self._progress_message.setProgress(bytes_sent / bytes_total * 100) + else: + self._progress_message.setProgress(0) + + self._progress_message.hide() + + def _compressGCode(self): + self._compressing_gcode = True + + ## Mash the data into single string + max_chars_per_line = 1024 * 1024 / 4 # 1/4 MB per line. + byte_array_file_data = b"" + batched_line = "" + + for line in self._gcode: + if not self._compressing_gcode: + self._progress_message.hide() + # Stop trying to zip / send as abort was called. + return + batched_line += line + # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. + # Compressing line by line in this case is extremely slow, so we need to batch them. + if len(batched_line) < max_chars_per_line: + continue + byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) + batched_line = "" + + # Don't miss the last batch (If any) + if batched_line: + byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) + + self._compressing_gcode = False + return byte_array_file_data + def _messageBoxCallback(self, button): def delayedCallback(): if button == QMessageBox.Yes: From d0c7352be6b9b42a1ce14c415aab9c1b3d87bae3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 16:16:57 +0100 Subject: [PATCH 054/551] Added missing authentication_succeeded_message attribute to constructor CL-541 --- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index e9963c678b..7c76811fd2 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -58,6 +58,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): # This ensures that the messages are only created for devices that actually want to connect. self._authentication_requested_message = None self._authentication_failed_message = None + self._authentication_succeeded_message = None self._not_authenticated_message = None self._sending_gcode = False From 0b91112d72fb63e3c0f3de92392a7e3d77b1e12f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 16:43:52 +0100 Subject: [PATCH 055/551] Fixed postForm Setting the type of the request to json messed up the multi-part stuff. CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 97960db1f3..dcd6b5ca70 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -78,6 +78,12 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): return True + def _createEmptyFormRequest(self, target): + url = QUrl("http://" + self._address + self._api_prefix + target) + request = QNetworkRequest(url) + request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) + return request + def _createEmptyRequest(self, target): url = QUrl("http://" + self._address + self._api_prefix + target) request = QNetworkRequest(url) @@ -127,9 +133,9 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def _postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() - request = self._createEmptyRequest(target) + request = self._createEmptyFormRequest(target) - multi_post_part = QHttpMultiPart() + multi_post_part = QHttpMultiPart(QHttpMultiPart.FormDataType) post_part = QHttpPart() post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data) post_part.setBody(body_data) From 1c2c4d4163e4546a7a57c983fa2f64ce0f0e8ea2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 17:07:24 +0100 Subject: [PATCH 056/551] Added property to indicate if output device accepts commands Instead of how this was previously done, it's now tied to the auth state. CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 3 +++ cura/PrinterOutputDevice.py | 13 +++++++++++++ plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 9 +++++++++ 3 files changed, 25 insertions(+) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index dcd6b5ca70..f8d2ec66e2 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -1,3 +1,6 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + from UM.Application import Application from UM.Logger import Logger diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 9744f352fd..5b747d19bf 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -34,6 +34,7 @@ i18n_catalog = i18nCatalog("cura") class PrinterOutputDevice(QObject, OutputDevice): printersChanged = pyqtSignal() connectionStateChanged = pyqtSignal(str) + acceptsCommandsChanged = pyqtSignal() def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) @@ -49,6 +50,7 @@ class PrinterOutputDevice(QObject, OutputDevice): self._control_item = None self._qml_context = None + self._accepts_commands = False self._update_timer = QTimer() self._update_timer.setInterval(2000) # TODO; Add preference for update interval @@ -152,6 +154,17 @@ class PrinterOutputDevice(QObject, OutputDevice): def __del__(self): self.close() + @pyqtProperty(bool, notify=acceptsCommandsChanged) + def acceptsCommands(self): + return self._accepts_commands + + ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands + def setAcceptsCommands(self, accepts_commands): + if self._accepts_commands != accepts_commands: + self._accepts_commands = accepts_commands + + self.acceptsCommandsChanged.emit() + ## The current processing state of the backend. class ConnectionState(IntEnum): diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 7c76811fd2..67db519c9e 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -65,6 +65,15 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._compressing_gcode = False self._gcode = [] + self.authenticationStateChanged.connect(self._onAuthenticationStateChanged) + + def _onAuthenticationStateChanged(self): + # We only accept commands if we are authenticated. + if self._authentication_state == AuthState.Authenticated: + self.setAcceptsCommands(True) + else: + self.setAcceptsCommands(False) + def _setupMessages(self): self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status", "Access to the printer requested. Please approve the request on the printer"), From 4597bb09ed2bc88eec12dfb037fe98078b35780c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 17:08:22 +0100 Subject: [PATCH 057/551] Added (short) description & priority to legacy output device. CL-541 --- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 67db519c9e..b7736d675b 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -67,6 +67,13 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self.authenticationStateChanged.connect(self._onAuthenticationStateChanged) + self.setPriority(3) # Make sure the output device gets selected above local file output + self.setName(self._id) + self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) + self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network")) + + self.setIconName("print") + def _onAuthenticationStateChanged(self): # We only accept commands if we are authenticated. if self._authentication_state == AuthState.Authenticated: From c523a6ddf6f8c88071eae51b2c4d30e46e01433e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 24 Nov 2017 09:22:50 +0100 Subject: [PATCH 058/551] Progress is now shown for LegacyPrinter while printing CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 1 - .../LegacyUM3OutputDevice.py | 1 + .../UM3NetworkPrinting/UM3InfoComponents.qml | 8 +- .../UM3OutputDevicePlugin.py | 1 - resources/qml/MonitorButton.qml | 74 +++++++++++++++---- 5 files changed, 64 insertions(+), 21 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 23423609f7..97f5c69723 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -11,7 +11,6 @@ MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.PrinterOutputController import PrinterOutputController - from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel class PrinterOutputModel(QObject): diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index b7736d675b..67b2032e6a 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -568,6 +568,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): if not self._printers: self._printers = [PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders)] + self.printersChanged.emit() # LegacyUM3 always has a single printer. printer = self._printers[0] diff --git a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml index d0c95e1524..939c6bcb39 100644 --- a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml +++ b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml @@ -13,7 +13,7 @@ Item property bool isUM3: Cura.MachineManager.activeQualityDefinitionId == "ultimaker3" property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands - property bool authenticationRequested: printerConnected && Cura.MachineManager.printerOutputDevices[0].authenticationState == 2 // AuthState.AuthenticationRequested + property bool authenticationRequested: printerConnected && (Cura.MachineManager.printerOutputDevices[0].authenticationState == 2 || Cura.MachineManager.printerOutputDevices[0].authenticationState == 5) // AuthState.AuthenticationRequested or AuthenticationReceived. Row { @@ -119,7 +119,9 @@ Item onClicked: manager.loadConfigurationFromPrinter() function isClusterPrinter() { - if(Cura.MachineManager.printerOutputDevices.length == 0) + return false + //TODO: Hardcoded this for the moment now. These info components might also need to move. + /*if(Cura.MachineManager.printerOutputDevices.length == 0) { return false; } @@ -129,7 +131,7 @@ Item { return false; } - return true; + return true;*/ } } } diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 09bff8e7b8..aecbc1717c 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -84,7 +84,6 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): def _onDeviceConnectionStateChanged(self, key): if key not in self._discovered_devices: return - print("STATE CHANGED", key) if self._discovered_devices[key].isConnected(): self.getOutputDeviceManager().addOutputDevice(self._discovered_devices[key]) else: diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 29b00f50e6..07a9e1913b 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -17,16 +17,39 @@ Item property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands - property real progress: printerConnected ? Cura.MachineManager.printerOutputDevices[0].progress : 0 + property var activePrinter: printerConnected ? Cura.MachineManager.printerOutputDevices[0].activePrinter : null + property var activePrintJob: activePrinter ? activePrinter.activePrintJob: null + property real progress: + { + if(!printerConnected) + { + return 0 + } + if(activePrinter == null) + { + return 0 + } + if(activePrintJob == null) + { + return 0 + } + if(activePrintJob.timeTotal == 0) + { + return 0 // Prevent devision by 0 + } + return activePrintJob.timeElapsed / activePrintJob.timeTotal * 100 + } + property int backendState: UM.Backend.state property bool showProgress: { // determine if we need to show the progress bar + percentage - if(!printerConnected || !printerAcceptsCommands) { + if(activePrintJob == null) + { return false; } - switch(Cura.MachineManager.printerOutputDevices[0].jobState) + switch(base.activePrintJob.state) { case "printing": case "paused": @@ -50,7 +73,7 @@ Item if(!printerConnected || !printerAcceptsCommands) return UM.Theme.getColor("text"); - switch(Cura.MachineManager.printerOutputDevices[0].printerState) + switch(activePrinter.printerState) { case "maintenance": return UM.Theme.getColor("status_busy"); @@ -58,7 +81,7 @@ Item return UM.Theme.getColor("status_stopped"); } - switch(Cura.MachineManager.printerOutputDevices[0].jobState) + switch(base.activePrintJob.state) { case "printing": case "pre_print": @@ -85,17 +108,27 @@ Item property string statusText: { if(!printerConnected) + { return catalog.i18nc("@label:MonitorStatus", "Not connected to a printer"); + } if(!printerAcceptsCommands) + { return catalog.i18nc("@label:MonitorStatus", "Printer does not accept commands"); + } var printerOutputDevice = Cura.MachineManager.printerOutputDevices[0] - if(printerOutputDevice.printerState == "maintenance") + if(activePrinter.printerState == "maintenance") { return catalog.i18nc("@label:MonitorStatus", "In maintenance. Please check the printer"); } - switch(printerOutputDevice.jobState) + + if(base.activePrintJob == null) + { + return " " + } + + switch(base.activePrintJob.state) { case "offline": return catalog.i18nc("@label:MonitorStatus", "Lost connection with the printer"); @@ -163,7 +196,11 @@ Item { return false; } - switch(Cura.MachineManager.printerOutputDevices[0].jobState) + if(base.activePrintJob == null) + { + return false + } + switch(base.activePrintJob.state) { case "pausing": case "resuming": @@ -185,7 +222,8 @@ Item anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width; } - Row { + Row + { id: buttonsRow height: abortButton.height anchors.top: progressBar.bottom @@ -194,17 +232,21 @@ Item anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width spacing: UM.Theme.getSize("default_margin").width - Row { + Row + { id: additionalComponentsRow spacing: UM.Theme.getSize("default_margin").width } - Connections { + Connections + { target: Printer onAdditionalComponentsChanged: { - if(areaId == "monitorButtons") { - for (var component in CuraApplication.additionalComponents["monitorButtons"]) { + if(areaId == "monitorButtons") + { + for (var component in CuraApplication.additionalComponents["monitorButtons"]) + { CuraApplication.additionalComponents["monitorButtons"][component].parent = additionalComponentsRow } } @@ -220,7 +262,7 @@ Item property bool userClicked: false property string lastJobState: "" - visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].canPause + visible: printerConnected && activePrinter.canPause enabled: (!userClicked) && printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands && (["paused", "printing"].indexOf(Cura.MachineManager.printerOutputDevices[0].jobState) >= 0) @@ -261,8 +303,8 @@ Item { id: abortButton - visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].canAbort - enabled: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands && + visible: printerConnected && activePrinter.canAbort + enabled: printerConnected && activePrinter.acceptsCommands && (["paused", "printing", "pre_print"].indexOf(Cura.MachineManager.printerOutputDevices[0].jobState) >= 0) height: UM.Theme.getSize("save_button_save_to_button").height From 9d7cd726915e563c169dcd9d68e88e03f35c2a13 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 24 Nov 2017 09:38:10 +0100 Subject: [PATCH 059/551] JobData is now shown in monitor screen again CL-541 --- resources/qml/PrintMonitor.qml | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index f95d829306..172adc21c1 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -16,6 +16,7 @@ Column id: printMonitor property var connectedDevice: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null property var activePrinter: connectedDevice != null ? connectedDevice.activePrinter : null + property var activePrintJob: activePrinter != null ? activePrinter.activePrintJob: null Cura.ExtrudersModel { @@ -438,20 +439,33 @@ Column { sourceComponent: monitorItem property string label: catalog.i18nc("@label", "Job Name") - property string value: connectedPrinter != null ? connectedPrinter.jobName : "" + property string value: activePrintJob != null ? activePrintJob.name : "" } + Loader { sourceComponent: monitorItem property string label: catalog.i18nc("@label", "Printing Time") - property string value: connectedPrinter != null ? getPrettyTime(connectedPrinter.timeTotal) : "" + property string value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal) : "" } + Loader { sourceComponent: monitorItem property string label: catalog.i18nc("@label", "Estimated time left") - property string value: connectedPrinter != null ? getPrettyTime(connectedPrinter.timeTotal - connectedPrinter.timeElapsed) : "" - visible: connectedPrinter != null && (connectedPrinter.jobState == "printing" || connectedPrinter.jobState == "resuming" || connectedPrinter.jobState == "pausing" || connectedPrinter.jobState == "paused") + property string value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal - activePrintJob.timeElapsed) : "" + visible: + { + if(activePrintJob == null) + { + return false + } + + return (activePrintJob.state == "printing" || + activePrintJob.state == "resuming" || + activePrintJob.state == "pausing" || + activePrintJob.state == "paused") + } } Component @@ -485,6 +499,7 @@ Column } } } + Component { id: monitorSection From 57406100ef5355d6093514e931a472a89716dc5f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 24 Nov 2017 10:55:24 +0100 Subject: [PATCH 060/551] Fixed status icon in monitor tab CL-541 --- resources/qml/PrintMonitor.qml | 6 +++--- resources/qml/Topbar.qml | 13 +++++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 172adc21c1..5b6f96dfc1 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -100,15 +100,15 @@ Column visible: connectedPrinter != null ? connectedPrinter.canControlManually : false enabled: { - if (connectedPrinter == null) + if (connectedPrinter == null || activePrintJob == null) { - return false; //Can't control the printer if not connected. + return false; //Can't control the printer if not connected or if there is no print job. } if (!connectedPrinter.acceptsCommands) { return false; //Not allowed to do anything. } - if (connectedPrinter.jobState == "printing" || connectedPrinter.jobState == "resuming" || connectedPrinter.jobState == "pausing" || connectedPrinter.jobState == "error" || connectedPrinter.jobState == "offline") + if (activePrintJob.state == "printing" || activePrintJob.state == "resuming" || activePrintJob.state == "pausing" || activePrintJob.state == "error" || activePrintJob.state == "offline") { return false; //Printer is in a state where it can't react to manual control } diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 6085c6fe7e..63d0981830 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -124,13 +124,22 @@ Rectangle { 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) + if(Cura.MachineManager.printerOutputDevices[0].activePrinter == null) + { + return UM.Theme.getIcon("tab_status_connected") + } + + if(Cura.MachineManager.printerOutputDevices[0].activePrinter.activePrintJob == null) + { + return UM.Theme.getIcon("tab_status_connected") + } + + switch (Cura.MachineManager.printerOutputDevices[0].activePrinter.activePrintJob.state) { case "printing": case "pre_print": From 57de0286081477ff77dd00f20a131237d0df4993 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 24 Nov 2017 11:26:30 +0100 Subject: [PATCH 061/551] re-implemented abort & pause for legacy um3 CL-541 --- .../NetworkedPrinterOutputDevice.py | 10 +++---- cura/PrinterOutput/PrintJobOutputModel.py | 3 +- cura/PrinterOutput/PrinterOutputController.py | 7 +++-- cura/PrinterOutput/PrinterOutputModel.py | 6 ++-- .../ClusterUM3OutputDevice.py | 4 +-- .../LegacyUM3OutputDevice.py | 28 +++++++++++-------- .../LegacyUM3PrinterOutputController.py | 13 +++++++++ resources/qml/MonitorButton.qml | 28 ++++++++++--------- 8 files changed, 61 insertions(+), 38 deletions(-) create mode 100644 plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index f8d2ec66e2..58c82b6c38 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -98,7 +98,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if id(reply) in self._cached_multiparts: del self._cached_multiparts[id(reply)] - def _put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): + def put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -107,7 +107,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _get(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): + def get(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -116,13 +116,13 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _delete(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): + def delete(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): if self._manager is None: self._createNetworkManager() self._last_request_time = time() pass - def _post(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + def post(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -133,7 +133,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() request = self._createEmptyFormRequest(target) diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 7c38782788..00641ab89a 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -1,7 +1,7 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot MYPY = False if MYPY: from cura.PrinterOutput.PrinterOutputController import PrinterOutputController @@ -80,5 +80,6 @@ class PrintJobOutputModel(QObject): self._state = new_state self.stateChanged.emit() + @pyqtSlot(str) def setState(self, state): self._output_controller.setJobState(self, state) \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index 525c8db102..982c41f293 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -1,4 +1,5 @@ - +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. MYPY = False if MYPY: @@ -8,11 +9,13 @@ if MYPY: class PrinterOutputController: - def __init__(self): + def __init__(self, output_device): self.can_pause = True self.can_abort = True self.can_pre_heat_bed = True self.can_control_manually = True + self._output_device = output_device + def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOuputModel", temperature: int): # TODO: implement diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 97f5c69723..d4b9d9c99a 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -177,19 +177,19 @@ class PrinterOutputModel(QObject): @pyqtProperty(bool, constant=True) def canPause(self): if self._controller: - return self.can_pause + return self._controller.can_pause return False # Does the printer support abort at all @pyqtProperty(bool, constant=True) def canAbort(self): if self._controller: - return self.can_abort + return self._controller.can_abort return False # Does the printer support manual control at all @pyqtProperty(bool, constant=True) def canControlManually(self): if self._controller: - return self.can_control_manually + return self._controller.can_control_manually return False diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 8f9a92384f..91acdc28af 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -21,8 +21,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def _update(self): if not super()._update(): return - self._get("printers/", onFinished=self._onGetPrintersDataFinished) - self._get("print_jobs/", onFinished=self._onGetPrintJobsFinished) + self.get("printers/", onFinished=self._onGetPrintersDataFinished) + self.get("print_jobs/", onFinished=self._onGetPrintJobsFinished) def _onGetPrintJobsFinished(self, reply: QNetworkReply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 67b2032e6a..de0a8d6eff 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -16,6 +16,8 @@ from PyQt5.QtNetwork import QNetworkRequest from PyQt5.QtCore import QTimer, QCoreApplication from PyQt5.QtWidgets import QMessageBox +from .LegacyUM3PrinterOutputController import LegacyUM3PrinterOutputController + from time import time import json @@ -74,6 +76,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self.setIconName("print") + self._output_controller = LegacyUM3PrinterOutputController(self) + def _onAuthenticationStateChanged(self): # We only accept commands if we are authenticated. if self._authentication_state == AuthState.Authenticated: @@ -143,7 +147,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): continue # If it's not readonly, it's created by user, so skip it. file_name = "none.xml" - self._postForm("materials", "form-data; name=\"file\";filename=\"%s\"" % file_name, xml_data.encode(), onFinished=None) + self.postForm("materials", "form-data; name=\"file\";filename=\"%s\"" % file_name, xml_data.encode(), onFinished=None) except NotImplementedError: # If the material container is not the most "generic" one it can't be serialized an will raise a @@ -241,8 +245,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): return file_name = "%s.gcode.gz" % Application.getInstance().getPrintInformation().jobName - self._postForm("print_job", "form-data; name=\"file\";filename=\"%s\"" % file_name, compressed_gcode, - onFinished=self._onPostPrintJobFinished) + self.postForm("print_job", "form-data; name=\"file\";filename=\"%s\"" % file_name, compressed_gcode, + onFinished=self._onPostPrintJobFinished) return @@ -392,8 +396,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._checkAuthentication() # We don't need authentication for requesting info, so we can go right ahead with requesting this. - self._get("printer", onFinished=self._onGetPrinterDataFinished) - self._get("print_job", onFinished=self._onGetPrintJobFinished) + self.get("printer", onFinished=self._onGetPrinterDataFinished) + self.get("print_job", onFinished=self._onGetPrintJobFinished) def _resetAuthenticationRequestedMessage(self): if self._authentication_requested_message: @@ -415,7 +419,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def _verifyAuthentication(self): Logger.log("d", "Attempting to verify authentication") # This will ensure that the "_onAuthenticationRequired" is triggered, which will setup the authenticator. - self._get("auth/verify", onFinished=self._onVerifyAuthenticationCompleted) + self.get("auth/verify", onFinished=self._onVerifyAuthenticationCompleted) def _onVerifyAuthenticationCompleted(self, reply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) @@ -438,7 +442,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def _checkAuthentication(self): Logger.log("d", "Checking if authentication is correct for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) - self._get("auth/check/" + str(self._authentication_id), onFinished=self._onCheckAuthenticationFinished) + self.get("auth/check/" + str(self._authentication_id), onFinished=self._onCheckAuthenticationFinished) def _onCheckAuthenticationFinished(self, reply): if str(self._authentication_id) not in reply.url().toString(): @@ -511,10 +515,10 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_key = None self._authentication_id = None - self._post("auth/request", - json.dumps({"application": "Cura-" + Application.getInstance().getVersion(), + self.post("auth/request", + json.dumps({"application": "Cura-" + Application.getInstance().getVersion(), "user": self._getUserName()}).encode(), - onFinished=self._onRequestAuthenticationFinished) + onFinished=self._onRequestAuthenticationFinished) self.setAuthenticationState(AuthState.AuthenticationRequested) @@ -542,7 +546,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): Logger.log("w", "Received an invalid print job state message: Not valid JSON.") return if printer.activePrintJob is None: - print_job = PrintJobOutputModel(output_controller=None) + print_job = PrintJobOutputModel(output_controller=self._output_controller) printer.updateActivePrintJob(print_job) else: print_job = printer.activePrintJob @@ -567,7 +571,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): return if not self._printers: - self._printers = [PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders)] + self._printers = [PrinterOutputModel(output_controller=self._output_controller, number_of_extruders=self._number_of_extruders)] self.printersChanged.emit() # LegacyUM3 always has a single printer. diff --git a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py new file mode 100644 index 0000000000..e303d237ce --- /dev/null +++ b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py @@ -0,0 +1,13 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from cura.PrinterOutput.PrinterOutputController import PrinterOutputController + + +class LegacyUM3PrinterOutputController(PrinterOutputController): + def __init__(self, output_device): + super().__init__(output_device) + + def setJobState(self, job: "PrintJobOutputModel", state: str): + data = "{\"target\": \"%s\"}" % state + self._output_device.put("print_job/state", data, onFinished=None) diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 07a9e1913b..6166f9b62f 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -263,18 +263,17 @@ Item property string lastJobState: "" visible: printerConnected && activePrinter.canPause - enabled: (!userClicked) && printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands && - (["paused", "printing"].indexOf(Cura.MachineManager.printerOutputDevices[0].jobState) >= 0) + enabled: (!userClicked) && printerConnected && printerAcceptsCommands && activePrintJob != null && + (["paused", "printing"].indexOf(activePrintJob.state) >= 0) text: { var result = ""; - if (!printerConnected) + if (!printerConnected || activePrintJob == null) { return ""; } - var jobState = Cura.MachineManager.printerOutputDevices[0].jobState; - if (jobState == "paused") + if (activePrintJob.state == "paused") { return catalog.i18nc("@label:", "Resume"); } @@ -285,14 +284,17 @@ Item } onClicked: { - var current_job_state = Cura.MachineManager.printerOutputDevices[0].jobState - if(current_job_state == "paused") + if(activePrintJob == null) { - Cura.MachineManager.printerOutputDevices[0].setJobState("print"); + return // Do nothing! } - else if(current_job_state == "printing") + if(activePrintJob.state == "paused") { - Cura.MachineManager.printerOutputDevices[0].setJobState("pause"); + activePrintJob.setState("print"); + } + else if(activePrintJob.state == "printing") + { + activePrintJob.setState("pause"); } } @@ -304,8 +306,8 @@ Item id: abortButton visible: printerConnected && activePrinter.canAbort - enabled: printerConnected && activePrinter.acceptsCommands && - (["paused", "printing", "pre_print"].indexOf(Cura.MachineManager.printerOutputDevices[0].jobState) >= 0) + enabled: printerConnected && printerAcceptsCommands && activePrintJob != null && + (["paused", "printing", "pre_print"].indexOf(activePrintJob.state) >= 0) height: UM.Theme.getSize("save_button_save_to_button").height @@ -324,7 +326,7 @@ Item text: catalog.i18nc("@label", "Are you sure you want to abort the print?") standardButtons: StandardButton.Yes | StandardButton.No Component.onCompleted: visible = false - onYes: Cura.MachineManager.printerOutputDevices[0].setJobState("abort") + onYes: activePrintJob.setState("abort") } } } From 5036eccd32ffff186b8a11ac2bd4cc773845226c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 10:15:28 +0100 Subject: [PATCH 062/551] Moved multiple components to their own files CL-541 --- resources/qml/PrintMonitor.qml | 506 +----------------- resources/qml/PrinterOutput/HeatedBedBox.qml | 2 +- .../PrinterOutput/ManualPrinterControl.qml | 442 +++++++++++++++ resources/qml/PrinterOutput/MonitorItem.qml | 44 ++ .../qml/PrinterOutput/MonitorSection.qml | 33 ++ 5 files changed, 542 insertions(+), 485 deletions(-) create mode 100644 resources/qml/PrinterOutput/ManualPrinterControl.qml create mode 100644 resources/qml/PrinterOutput/MonitorItem.qml create mode 100644 resources/qml/PrinterOutput/MonitorSection.qml diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 5b6f96dfc1..830093cd2b 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -95,365 +95,38 @@ Column watchedProperties: ["value"] } - Column + ManualPrinterControl { - visible: connectedPrinter != null ? connectedPrinter.canControlManually : false - enabled: - { - if (connectedPrinter == null || activePrintJob == null) - { - return false; //Can't control the printer if not connected or if there is no print job. - } - if (!connectedPrinter.acceptsCommands) - { - return false; //Not allowed to do anything. - } - if (activePrintJob.state == "printing" || activePrintJob.state == "resuming" || activePrintJob.state == "pausing" || activePrintJob.state == "error" || activePrintJob.state == "offline") - { - return false; //Printer is in a state where it can't react to manual control - } - return true; - } - - Loader - { - sourceComponent: monitorSection - property string label: catalog.i18nc("@label", "Printer control") - } - - Row - { - width: base.width - 2 * UM.Theme.getSize("default_margin").width - height: childrenRect.height + UM.Theme.getSize("default_margin").width - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - - spacing: UM.Theme.getSize("default_margin").width - - Label - { - text: catalog.i18nc("@label", "Jog Position") - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - - width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width - height: UM.Theme.getSize("setting_control").height - verticalAlignment: Text.AlignVCenter - } - - GridLayout - { - columns: 3 - rows: 4 - rowSpacing: UM.Theme.getSize("default_lining").width - columnSpacing: UM.Theme.getSize("default_lining").height - - Label - { - text: catalog.i18nc("@label", "X/Y") - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - width: height - height: UM.Theme.getSize("setting_control").height - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignHCenter - - Layout.row: 1 - Layout.column: 2 - Layout.preferredWidth: width - Layout.preferredHeight: height - } - - Button - { - Layout.row: 2 - Layout.column: 2 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("arrow_top"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(0, distancesRow.currentDistance, 0) - } - } - - Button - { - Layout.row: 3 - Layout.column: 1 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("arrow_left"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(-distancesRow.currentDistance, 0, 0) - } - } - - Button - { - Layout.row: 3 - Layout.column: 3 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("arrow_right"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(distancesRow.currentDistance, 0, 0) - } - } - - Button - { - Layout.row: 4 - Layout.column: 2 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("arrow_bottom"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(0, -distancesRow.currentDistance, 0) - } - } - - Button - { - Layout.row: 3 - Layout.column: 2 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("home"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.homeHead() - } - } - } - - - Column - { - spacing: UM.Theme.getSize("default_lining").height - - Label - { - text: catalog.i18nc("@label", "Z") - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - width: UM.Theme.getSize("section").height - height: UM.Theme.getSize("setting_control").height - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignHCenter - } - - Button - { - iconSource: UM.Theme.getIcon("arrow_top"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(0, 0, distancesRow.currentDistance) - } - } - - Button - { - iconSource: UM.Theme.getIcon("home"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.homeBed() - } - } - - Button - { - iconSource: UM.Theme.getIcon("arrow_bottom"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(0, 0, -distancesRow.currentDistance) - } - } - } - } - - Row - { - id: distancesRow - - width: base.width - 2 * UM.Theme.getSize("default_margin").width - height: childrenRect.height + UM.Theme.getSize("default_margin").width - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - - spacing: UM.Theme.getSize("default_margin").width - - property real currentDistance: 10 - - Label - { - text: catalog.i18nc("@label", "Jog Distance") - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - - width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width - height: UM.Theme.getSize("setting_control").height - verticalAlignment: Text.AlignVCenter - } - - Row - { - Repeater - { - model: distancesModel - delegate: Button - { - height: UM.Theme.getSize("setting_control").height - width: height + UM.Theme.getSize("default_margin").width - - text: model.label - exclusiveGroup: distanceGroup - checkable: true - checked: distancesRow.currentDistance == model.value - onClicked: distancesRow.currentDistance = model.value - - style: ButtonStyle { - background: Rectangle { - border.width: control.checked ? UM.Theme.getSize("default_lining").width * 2 : UM.Theme.getSize("default_lining").width - border.color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled_border"); - } - else if (control.checked || control.pressed) - { - return UM.Theme.getColor("action_button_active_border"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered_border"); - } - return UM.Theme.getColor("action_button_border"); - } - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled"); - } - else if (control.checked || control.pressed) - { - return UM.Theme.getColor("action_button_active"); - } - else if (control.hovered) - { - return UM.Theme.getColor("action_button_hovered"); - } - return UM.Theme.getColor("action_button"); - } - Behavior on color { ColorAnimation { duration: 50; } } - Label { - anchors.left: parent.left - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: UM.Theme.getSize("default_lining").width * 2 - anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled_text"); - } - else if (control.checked || control.pressed) - { - return UM.Theme.getColor("action_button_active_text"); - } - else if (control.hovered) - { - return UM.Theme.getColor("action_button_hovered_text"); - } - return UM.Theme.getColor("action_button_text"); - } - font: UM.Theme.getFont("default") - text: control.text - horizontalAlignment: Text.AlignHCenter - elide: Text.ElideMiddle - } - } - label: Item { } - } - } - } - } - } - - ListModel - { - id: distancesModel - ListElement { label: "0.1"; value: 0.1 } - ListElement { label: "1"; value: 1 } - ListElement { label: "10"; value: 10 } - ListElement { label: "100"; value: 100 } - } - ExclusiveGroup { id: distanceGroup } + printerModel: activePrinter + visible: activePrinter != null ? activePrinter.canControlManually : false } - Loader + MonitorSection { - sourceComponent: monitorSection - property string label: catalog.i18nc("@label", "Active print") - } - Loader - { - sourceComponent: monitorItem - property string label: catalog.i18nc("@label", "Job Name") - property string value: activePrintJob != null ? activePrintJob.name : "" + label: catalog.i18nc("@label", "Active print") + width: base.width } - Loader + + MonitorItem { - sourceComponent: monitorItem - property string label: catalog.i18nc("@label", "Printing Time") - property string value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal) : "" + label: catalog.i18nc("@label", "Job Name") + value: activePrintJob != null ? activePrintJob.name : "" + width: base.width } - Loader + MonitorItem { - sourceComponent: monitorItem - property string label: catalog.i18nc("@label", "Estimated time left") - property string value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal - activePrintJob.timeElapsed) : "" + label: catalog.i18nc("@label", "Printing Time") + value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal) : "" + width:base.width + } + + MonitorItem + { + label: catalog.i18nc("@label", "Estimated time left") + value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal - activePrintJob.timeElapsed) : "" visible: { if(activePrintJob == null) @@ -466,141 +139,6 @@ Column activePrintJob.state == "pausing" || activePrintJob.state == "paused") } - } - - Component - { - id: monitorItem - - Row - { - height: UM.Theme.getSize("setting_control").height - width: Math.floor(base.width - 2 * UM.Theme.getSize("default_margin").width) - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - - Label - { - width: Math.floor(parent.width * 0.4) - anchors.verticalCenter: parent.verticalCenter - text: label - color: connectedPrinter != null && connectedPrinter.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") - font: UM.Theme.getFont("default") - elide: Text.ElideRight - } - Label - { - width: Math.floor(parent.width * 0.6) - anchors.verticalCenter: parent.verticalCenter - text: value - color: connectedPrinter != null && connectedPrinter.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") - font: UM.Theme.getFont("default") - elide: Text.ElideRight - } - } - } - - Component - { - id: monitorSection - - Rectangle - { - color: UM.Theme.getColor("setting_category") - width: base.width - height: UM.Theme.getSize("section").height - - Label - { - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - text: label - font: UM.Theme.getFont("setting_category") - color: UM.Theme.getColor("setting_category_text") - } - } - } - - Component - { - id: monitorButtonStyle - - ButtonStyle - { - background: Rectangle - { - border.width: UM.Theme.getSize("default_lining").width - border.color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled_border"); - } - else if(control.pressed) - { - return UM.Theme.getColor("action_button_active_border"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered_border"); - } - return UM.Theme.getColor("action_button_border"); - } - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled"); - } - else if(control.pressed) - { - return UM.Theme.getColor("action_button_active"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered"); - } - return UM.Theme.getColor("action_button"); - } - Behavior on color - { - ColorAnimation - { - duration: 50 - } - } - } - - label: Item - { - UM.RecolorImage - { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - width: Math.floor(control.width / 2) - height: Math.floor(control.height / 2) - sourceSize.width: width - sourceSize.height: width - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled_text"); - } - else if(control.pressed) - { - return UM.Theme.getColor("action_button_active_text"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered_text"); - } - return UM.Theme.getColor("action_button_text"); - } - source: control.iconSource - } - } - } + width: base.width } } \ No newline at end of file diff --git a/resources/qml/PrinterOutput/HeatedBedBox.qml b/resources/qml/PrinterOutput/HeatedBedBox.qml index de34fe5943..5f09160708 100644 --- a/resources/qml/PrinterOutput/HeatedBedBox.qml +++ b/resources/qml/PrinterOutput/HeatedBedBox.qml @@ -234,7 +234,7 @@ Item return // Nothing to do, printer cant preheat at all! } preheatCountdown.text = "" - if (printerModel != null) + if (printerModel != null && connectedPrinter.preheatBedRemainingTime != null) { preheatCountdown.text = connectedPrinter.preheatBedRemainingTime; } diff --git a/resources/qml/PrinterOutput/ManualPrinterControl.qml b/resources/qml/PrinterOutput/ManualPrinterControl.qml new file mode 100644 index 0000000000..35cefe053f --- /dev/null +++ b/resources/qml/PrinterOutput/ManualPrinterControl.qml @@ -0,0 +1,442 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 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 + + +Item +{ + property var printerModel + property var activePrintJob: printerModel != null ? printerModel.activePrintJob : null + implicitWidth: parent.width + implicitHeight: childrenRect.height + + Component + { + id: monitorButtonStyle + + ButtonStyle + { + background: Rectangle + { + border.width: UM.Theme.getSize("default_lining").width + border.color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_border"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active_border"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_border"); + } + return UM.Theme.getColor("action_button_border"); + } + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered"); + } + return UM.Theme.getColor("action_button"); + } + Behavior on color + { + ColorAnimation + { + duration: 50 + } + } + } + + label: Item + { + UM.RecolorImage + { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: Math.floor(control.width / 2) + height: Math.floor(control.height / 2) + sourceSize.width: width + sourceSize.height: width + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_text"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active_text"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_text"); + } + return UM.Theme.getColor("action_button_text"); + } + source: control.iconSource + } + } + } + } + + Column + { + enabled: + { + if (printerModel == null) + { + return false; //Can't control the printer if not connected + } + + if (!connectedPrinter.acceptsCommands) + { + return false; //Not allowed to do anything. + } + + if(activePrintJob == null) + { + return true + } + + if (activePrintJob.state == "printing" || activePrintJob.state == "resuming" || activePrintJob.state == "pausing" || activePrintJob.state == "error" || activePrintJob.state == "offline") + { + return false; //Printer is in a state where it can't react to manual control + } + return true; + } + + + MonitorSection + { + label: catalog.i18nc("@label", "Printer control") + width: base.width + } + + Row + { + width: base.width - 2 * UM.Theme.getSize("default_margin").width + height: childrenRect.height + UM.Theme.getSize("default_margin").width + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + + spacing: UM.Theme.getSize("default_margin").width + + Label + { + text: catalog.i18nc("@label", "Jog Position") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width + height: UM.Theme.getSize("setting_control").height + verticalAlignment: Text.AlignVCenter + } + + GridLayout + { + columns: 3 + rows: 4 + rowSpacing: UM.Theme.getSize("default_lining").width + columnSpacing: UM.Theme.getSize("default_lining").height + + Label + { + text: catalog.i18nc("@label", "X/Y") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + width: height + height: UM.Theme.getSize("setting_control").height + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + + Layout.row: 1 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + } + + Button + { + Layout.row: 2 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_top"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, distancesRow.currentDistance, 0) + } + } + + Button + { + Layout.row: 3 + Layout.column: 1 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_left"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(-distancesRow.currentDistance, 0, 0) + } + } + + Button + { + Layout.row: 3 + Layout.column: 3 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_right"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(distancesRow.currentDistance, 0, 0) + } + } + + Button + { + Layout.row: 4 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_bottom"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, -distancesRow.currentDistance, 0) + } + } + + Button + { + Layout.row: 3 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("home"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.homeHead() + } + } + } + + + Column + { + spacing: UM.Theme.getSize("default_lining").height + + Label + { + text: catalog.i18nc("@label", "Z") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + width: UM.Theme.getSize("section").height + height: UM.Theme.getSize("setting_control").height + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + + Button + { + iconSource: UM.Theme.getIcon("arrow_top"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, 0, distancesRow.currentDistance) + } + } + + Button + { + iconSource: UM.Theme.getIcon("home"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.homeBed() + } + } + + Button + { + iconSource: UM.Theme.getIcon("arrow_bottom"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, 0, -distancesRow.currentDistance) + } + } + } + } + + Row + { + id: distancesRow + + width: base.width - 2 * UM.Theme.getSize("default_margin").width + height: childrenRect.height + UM.Theme.getSize("default_margin").width + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + + spacing: UM.Theme.getSize("default_margin").width + + property real currentDistance: 10 + + Label + { + text: catalog.i18nc("@label", "Jog Distance") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width + height: UM.Theme.getSize("setting_control").height + verticalAlignment: Text.AlignVCenter + } + + Row + { + Repeater + { + model: distancesModel + delegate: Button + { + height: UM.Theme.getSize("setting_control").height + width: height + UM.Theme.getSize("default_margin").width + + text: model.label + exclusiveGroup: distanceGroup + checkable: true + checked: distancesRow.currentDistance == model.value + onClicked: distancesRow.currentDistance = model.value + + style: ButtonStyle { + background: Rectangle { + border.width: control.checked ? UM.Theme.getSize("default_lining").width * 2 : UM.Theme.getSize("default_lining").width + border.color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_border"); + } + else if (control.checked || control.pressed) + { + return UM.Theme.getColor("action_button_active_border"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_border"); + } + return UM.Theme.getColor("action_button_border"); + } + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled"); + } + else if (control.checked || control.pressed) + { + return UM.Theme.getColor("action_button_active"); + } + else if (control.hovered) + { + return UM.Theme.getColor("action_button_hovered"); + } + return UM.Theme.getColor("action_button"); + } + Behavior on color { ColorAnimation { duration: 50; } } + Label { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: UM.Theme.getSize("default_lining").width * 2 + anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_text"); + } + else if (control.checked || control.pressed) + { + return UM.Theme.getColor("action_button_active_text"); + } + else if (control.hovered) + { + return UM.Theme.getColor("action_button_hovered_text"); + } + return UM.Theme.getColor("action_button_text"); + } + font: UM.Theme.getFont("default") + text: control.text + horizontalAlignment: Text.AlignHCenter + elide: Text.ElideMiddle + } + } + label: Item { } + } + } + } + } + } + + ListModel + { + id: distancesModel + ListElement { label: "0.1"; value: 0.1 } + ListElement { label: "1"; value: 1 } + ListElement { label: "10"; value: 10 } + ListElement { label: "100"; value: 100 } + } + ExclusiveGroup { id: distanceGroup } + } +} \ No newline at end of file diff --git a/resources/qml/PrinterOutput/MonitorItem.qml b/resources/qml/PrinterOutput/MonitorItem.qml new file mode 100644 index 0000000000..cad8d2f7f3 --- /dev/null +++ b/resources/qml/PrinterOutput/MonitorItem.qml @@ -0,0 +1,44 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 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 + +Item +{ + property string label: "" + property string value: "" + height: childrenRect.height; + + Row + { + height: UM.Theme.getSize("setting_control").height + width: Math.floor(base.width - 2 * UM.Theme.getSize("default_margin").width) + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + + Label + { + width: Math.floor(parent.width * 0.4) + anchors.verticalCenter: parent.verticalCenter + text: label + color: connectedPrinter != null && connectedPrinter.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") + font: UM.Theme.getFont("default") + elide: Text.ElideRight + } + Label + { + width: Math.floor(parent.width * 0.6) + anchors.verticalCenter: parent.verticalCenter + text: value + color: connectedPrinter != null && connectedPrinter.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") + font: UM.Theme.getFont("default") + elide: Text.ElideRight + } + } +} \ No newline at end of file diff --git a/resources/qml/PrinterOutput/MonitorSection.qml b/resources/qml/PrinterOutput/MonitorSection.qml new file mode 100644 index 0000000000..6ed762362d --- /dev/null +++ b/resources/qml/PrinterOutput/MonitorSection.qml @@ -0,0 +1,33 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 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 + +Item +{ + id: base + property string label + height: childrenRect.height; + Rectangle + { + color: UM.Theme.getColor("setting_category") + width: base.width + height: UM.Theme.getSize("section").height + + Label + { + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + text: label + font: UM.Theme.getFont("setting_category") + color: UM.Theme.getColor("setting_category_text") + } + } +} \ No newline at end of file From 00eeb835ac35e0718f39aaa605adf718908e790e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 10:22:30 +0100 Subject: [PATCH 063/551] ManualPrinterControl uses correct functions again CL-541 --- cura/PrinterOutput/PrinterOutputController.py | 22 +++++++++---------- .../LegacyUM3PrinterOutputController.py | 4 ++++ .../PrinterOutput/ManualPrinterControl.qml | 18 +++++++-------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index 982c41f293..86ca10e2d3 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -1,6 +1,8 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from UM.Logger import Logger + MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel @@ -16,31 +18,29 @@ class PrinterOutputController: self.can_control_manually = True self._output_device = output_device - def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOuputModel", temperature: int): - # TODO: implement - pass + Logger.log("w", "Set target hotend temperature not implemented in controller") def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int): - pass + Logger.log("w", "Set target bed temperature not implemented in controller") def setJobState(self, job: "PrintJobOutputModel", state: str): - pass + Logger.log("w", "Set job state not implemented in controller") def cancelPreheatBed(self, printer: "PrinterOutputModel"): - pass + Logger.log("w", "Cancel preheat bed not implemented in controller") def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): - pass + Logger.log("w", "Preheat bed not implemented in controller") def setHeadPosition(self, printer: "PrinterOutputModel", x, y, z, speed): - pass + Logger.log("w", "Set head position not implemented in controller") def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): - pass + Logger.log("w", "Move head not implemented in controller") def homeBed(self, printer): - pass + Logger.log("w", "Home bed not implemented in controller") def homeHead(self, printer): - pass \ No newline at end of file + Logger.log("w", "Home head not implemented in controller") \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py index e303d237ce..ae8c989643 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py @@ -3,6 +3,10 @@ from cura.PrinterOutput.PrinterOutputController import PrinterOutputController +MYPY = False +if MYPY: + from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + class LegacyUM3PrinterOutputController(PrinterOutputController): def __init__(self, output_device): diff --git a/resources/qml/PrinterOutput/ManualPrinterControl.qml b/resources/qml/PrinterOutput/ManualPrinterControl.qml index 35cefe053f..43fa769fb5 100644 --- a/resources/qml/PrinterOutput/ManualPrinterControl.qml +++ b/resources/qml/PrinterOutput/ManualPrinterControl.qml @@ -108,7 +108,7 @@ Item return false; //Can't control the printer if not connected } - if (!connectedPrinter.acceptsCommands) + if (!connectedDevice.acceptsCommands) { return false; //Not allowed to do anything. } @@ -188,7 +188,7 @@ Item onClicked: { - connectedPrinter.moveHead(0, distancesRow.currentDistance, 0) + printerModel.moveHead(0, distancesRow.currentDistance, 0) } } @@ -205,7 +205,7 @@ Item onClicked: { - connectedPrinter.moveHead(-distancesRow.currentDistance, 0, 0) + printerModel.moveHead(-distancesRow.currentDistance, 0, 0) } } @@ -222,7 +222,7 @@ Item onClicked: { - connectedPrinter.moveHead(distancesRow.currentDistance, 0, 0) + printerModel.moveHead(distancesRow.currentDistance, 0, 0) } } @@ -239,7 +239,7 @@ Item onClicked: { - connectedPrinter.moveHead(0, -distancesRow.currentDistance, 0) + printerModel.moveHead(0, -distancesRow.currentDistance, 0) } } @@ -256,7 +256,7 @@ Item onClicked: { - connectedPrinter.homeHead() + printerModel.homeHead() } } } @@ -286,7 +286,7 @@ Item onClicked: { - connectedPrinter.moveHead(0, 0, distancesRow.currentDistance) + printerModel.moveHead(0, 0, distancesRow.currentDistance) } } @@ -299,7 +299,7 @@ Item onClicked: { - connectedPrinter.homeBed() + printerModel.homeBed() } } @@ -312,7 +312,7 @@ Item onClicked: { - connectedPrinter.moveHead(0, 0, -distancesRow.currentDistance) + printerModel.moveHead(0, 0, -distancesRow.currentDistance) } } } From f570ba046bcc77a73220a909be84181701fbdd1a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 11:02:56 +0100 Subject: [PATCH 064/551] Added rudimentary jogging controls for UM3 This needs a bit more love; The machine is a bit stupid when it comes to moving outside of build area. CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 6 +++++- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 7 +++++-- .../LegacyUM3PrinterOutputController.py | 12 ++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index d4b9d9c99a..1571be453c 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -68,21 +68,25 @@ class PrinterOutputModel(QObject): @pyqtProperty("long", "long", "long") @pyqtProperty("long", "long", "long", "long") def setHeadPosition(self, x, y, z, speed = 3000): + self.updateHeadPosition(x, y, z) self._controller.setHeadPosition(self, x, y, z, speed) @pyqtProperty("long") @pyqtProperty("long", "long") def setHeadX(self, x, speed = 3000): + self.updateHeadPosition(x, self._head_position.y, self._head_position.z) self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed) @pyqtProperty("long") @pyqtProperty("long", "long") def setHeadY(self, y, speed = 3000): + self.updateHeadPosition(self._head_position.x, y, self._head_position.z) self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed) @pyqtProperty("long") @pyqtProperty("long", "long") - def setHeadY(self, z, speed = 3000): + def setHeadZ(self, z, speed = 3000): + self.updateHeadPosition(self._head_position.x, self._head_position.y, z) self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed) @pyqtSlot("long", "long", "long") diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index de0a8d6eff..f830e28764 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -411,7 +411,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_counter / self._max_authentication_counter * 100) if self._authentication_counter > self._max_authentication_counter: self._authentication_timer.stop() - Logger.log("i", "Authentication timer ended. Setting authentication to denied for printer: %s" % self._key) + Logger.log("i", "Authentication timer ended. Setting authentication to denied for printer: %s" % self._id) self.setAuthenticationState(AuthState.AuthenticationDenied) self._resetAuthenticationRequestedMessage() self._authentication_failed_message.show() @@ -530,7 +530,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): authenticator.setUser(self._authentication_id) authenticator.setPassword(self._authentication_key) else: - Logger.log("d", "No authentication is available to use for %s, but we did got a request for it.", self._key) + Logger.log("d", "No authentication is available to use for %s, but we did got a request for it.", self._id) def _onGetPrintJobFinished(self, reply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) @@ -580,6 +580,9 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): printer.updateTargetBedTemperature(result["bed"]["temperature"]["target"]) printer.updatePrinterState(result["status"]) + head_position = result["heads"][0]["position"] + printer.updateHeadPosition(head_position["x"], head_position["y"], head_position["z"]) + for index in range(0, self._number_of_extruders): temperatures = result["heads"][0]["extruders"][index]["hotend"]["temperature"] extruder = printer.extruders[index] diff --git a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py index ae8c989643..54c126e5cc 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py @@ -6,6 +6,7 @@ from cura.PrinterOutput.PrinterOutputController import PrinterOutputController MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel class LegacyUM3PrinterOutputController(PrinterOutputController): @@ -15,3 +16,14 @@ class LegacyUM3PrinterOutputController(PrinterOutputController): def setJobState(self, job: "PrintJobOutputModel", state: str): data = "{\"target\": \"%s\"}" % state self._output_device.put("print_job/state", data, onFinished=None) + + def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): + head_pos = printer._head_position + new_x = head_pos.x + x + new_y = head_pos.y + y + new_z = head_pos.z + z + data = "{\n\"x\":%s,\n\"y\":%s,\n\"z\":%s\n}" %(new_x, new_y, new_z) + self._output_device.put("printer/heads/0/position", data, onFinished=None) + + def homeBed(self, printer): + self._output_device.put("printer/heads/0/position/z", "0", onFinished=None) From f791b53ad85f95164f33c55c73726fed42974d6e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 13:54:34 +0100 Subject: [PATCH 065/551] Enabled monitor items for ClusterOutputDevice again CL-541 --- cura/PrinterOutputDevice.py | 28 ++----------------- .../ClusterUM3OutputDevice.py | 12 ++++++-- .../UM3OutputDevicePlugin.py | 6 ++-- 3 files changed, 15 insertions(+), 31 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 5b747d19bf..cc41123f77 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -106,39 +106,15 @@ class PrinterOutputDevice(QObject, OutputDevice): def _createControlViewFromQML(self): if not self._control_view_qml_path: return - - 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) - - # 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()) + self._control_item = Application.getInstance().createQmlComponent(self._control_view_qml_path, {"OutputDevice": self}) def _createMonitorViewFromQML(self): if not self._monitor_view_qml_path: return - path = QUrl.fromLocalFile(self._monitor_view_qml_path) - # Because of garbage collection we need to keep this referenced by python. - self._monitor_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._monitor_item = self._monitor_component.create(self._qml_context) if self._monitor_item is None: - Logger.log("e", "QQmlComponent status %s", self._monitor_component.status()) - Logger.log("e", "QQmlComponent error string %s", self._monitor_component.errorString()) + self._monitor_item = Application.getInstance().createQmlComponent(self._monitor_view_qml_path, {"OutputDevice": self}) ## Attempt to establish connection def connect(self): diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 91acdc28af..73ac25f2f1 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -1,3 +1,6 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + from UM.Logger import Logger from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice @@ -5,10 +8,12 @@ from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel -import json - from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply +import json +import os + + class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address, properties, parent = None): super().__init__(device_id = device_id, address = address, properties=properties, parent = parent) @@ -18,6 +23,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._print_jobs = [] + self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterMonitorItem.qml") + self._control_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterControlItem.qml") + def _update(self): if not super()._update(): return diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index aecbc1717c..13ab774577 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -108,11 +108,11 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): # or "Legacy" UM3 device. cluster_size = int(properties.get(b"cluster_size", -1)) # TODO: For debug purposes; force it to be legacy printer. - device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) - '''if cluster_size > 0: + #device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) + if cluster_size > 0: device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties) else: - device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties)''' + device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) self._discovered_devices[device.getId()] = device self.discoveredDevicesChanged.emit() From cdfdaec492e31c808d8ccf7628ce55448cfa0278 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 14:03:53 +0100 Subject: [PATCH 066/551] ClusterUM3 now uses local material data as first source CL-541 --- .../ClusterUM3OutputDevice.py | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 73ac25f2f1..c98d17911c 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -3,6 +3,8 @@ from UM.Logger import Logger +from UM.Settings.ContainerRegistry import ContainerRegistry + from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel @@ -105,7 +107,26 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): material_data = extruder_data["material"] if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_data["guid"]: - material = MaterialOutputModel(guid = material_data["guid"], type = material_data["material"], brand=material_data["brand"], color=material_data["color"]) + containers = ContainerRegistry.getInstance().findInstanceContainers(type="material", + GUID=material_data["guid"]) + if containers: + color = containers[0].getMetaDataEntry("color_code") + brand = containers[0].getMetaDataEntry("brand") + material_type = containers[0].getMetaDataEntry("material") + name = containers[0].getName() + else: + Logger.log("w", "Unable to find material with guid {guid}. Using data as provided by cluster".format(guid = material_data["guid"])) + # Unknown material. + color = material_data["color"] + brand = material_data["brand"] + material_type = material_data["material"] + name = "Unknown" + + material = MaterialOutputModel(guid = material_data["guid"], + type = material_type, + brand = brand, + color = color, + name = name) extruder.updateActiveMaterial(material) else: From 7d9af8e3451c044acc242a27d4841ae3c5f5bf12 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 14:13:30 +0100 Subject: [PATCH 067/551] Added Opencontrol panel functions CL-541 --- plugins/UM3NetworkPrinting/ClusterMonitorItem.qml | 5 +++-- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml index e78c7d1cc9..ec18b19119 100644 --- a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml @@ -16,6 +16,7 @@ Component property var emphasisColor: UM.Theme.getColor("setting_control_border_highlight") property var lineColor: "#DCDCDC" // TODO: Should be linked to theme. property var cornerRadius: 4 * screenScaleFactor // TODO: Should be linked to theme. + UM.I18nCatalog { id: catalog @@ -93,10 +94,10 @@ Component } } - PrinterVideoStream + /*PrinterVideoStream { visible: OutputDevice.selectedPrinterName != "" anchors.fill:parent - } + }*/ } } diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index c98d17911c..db7bb68976 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -11,6 +11,8 @@ from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply +from PyQt5.QtGui import QDesktopServices +from PyQt5.QtCore import pyqtSlot, QUrl import json import os @@ -28,6 +30,16 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterMonitorItem.qml") self._control_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterControlItem.qml") + @pyqtSlot() + def openPrintJobControlPanel(self): + Logger.log("d", "Opening print job control panel...") + QDesktopServices.openUrl(QUrl("http://" + self._address + "/print_jobs")) + + @pyqtSlot() + def openPrinterControlPanel(self): + Logger.log("d", "Opening printer control panel...") + QDesktopServices.openUrl(QUrl("http://" + self._address + "/printers")) + def _update(self): if not super()._update(): return From 52a137a68cc7716bec3863707bea757be3cc0852 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 14:42:45 +0100 Subject: [PATCH 068/551] Ensured that sidebar has the right properties to show again CL-541 --- cura/PrinterOutput/PrintJobOutputModel.py | 2 +- cura/PrinterOutput/PrinterOutputModel.py | 12 +++++++ .../UM3NetworkPrinting/ClusterControlItem.qml | 9 +++--- .../ClusterUM3OutputDevice.py | 32 ++++++++++++++++++- 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 00641ab89a..9c96c45ca8 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -22,7 +22,7 @@ class PrintJobOutputModel(QObject): self._state = "" self._time_total = 0 self._time_elapsed = 0 - self._name = "" # Human readable name + self._name = name # Human readable name self._key = key # Unique identifier self._assigned_printer = None diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 1571be453c..8a6585469b 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -21,6 +21,7 @@ class PrinterOutputModel(QObject): nameChanged = pyqtSignal() headPositionChanged = pyqtSignal() keyChanged = pyqtSignal() + typeChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): super().__init__(parent) @@ -35,6 +36,17 @@ class PrinterOutputModel(QObject): self._printer_state = "unknown" + self._type = "" + + @pyqtProperty(str, notify = typeChanged) + def type(self): + return self._type + + def updateType(self, type): + if self._type != type: + self._type = type + self.typeChanged.emit() + @pyqtProperty(str, notify=keyChanged) def key(self): return self._key diff --git a/plugins/UM3NetworkPrinting/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/ClusterControlItem.qml index 8ba7156da8..b42515de51 100644 --- a/plugins/UM3NetworkPrinting/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterControlItem.qml @@ -10,13 +10,12 @@ Component { id: base property var manager: Cura.MachineManager.printerOutputDevices[0] - anchors.fill: parent - color: UM.Theme.getColor("viewport_background") - property var lineColor: "#DCDCDC" // TODO: Should be linked to theme. property var cornerRadius: 4 * screenScaleFactor // TODO: Should be linked to theme. visible: manager != null + anchors.fill: parent + color: UM.Theme.getColor("viewport_background") UM.I18nCatalog { @@ -97,7 +96,7 @@ Component } Label { - text: manager.numJobsPrinting + text: manager.activePrintJobs.length font: UM.Theme.getFont("small") anchors.right: parent.right } @@ -114,7 +113,7 @@ Component } Label { - text: manager.numJobsQueued + text: manager.queuedPrintJobs.length font: UM.Theme.getFont("small") anchors.right: parent.right } diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index db7bb68976..8b3f065576 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -12,13 +12,15 @@ from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from PyQt5.QtGui import QDesktopServices -from PyQt5.QtCore import pyqtSlot, QUrl +from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty import json import os class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): + printJobsChanged = pyqtSignal() + printersChanged = pyqtSignal() def __init__(self, device_id, address, properties, parent = None): super().__init__(device_id = device_id, address = address, properties=properties, parent = parent) self._api_prefix = "/cluster-api/v1/" @@ -40,6 +42,31 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): Logger.log("d", "Opening printer control panel...") QDesktopServices.openUrl(QUrl("http://" + self._address + "/printers")) + @pyqtProperty("QVariantList", notify=printJobsChanged) + def printJobs(self): + return self._print_jobs + + @pyqtProperty("QVariantList", notify=printJobsChanged) + def queuedPrintJobs(self): + return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is None] + + @pyqtProperty("QVariantList", notify=printJobsChanged) + def activePrintJobs(self): + return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is not None] + + @pyqtProperty("QVariantList", notify=printersChanged) + def connectedPrintersTypeCount(self): + printer_count = {} + for printer in self._printers: + if printer.type in printer_count: + printer_count[printer.type] += 1 + else: + printer_count[printer.type] = 1 + result = [] + for machine_type in printer_count: + result.append({"machine_type": machine_type, "count": printer_count[machine_type]}) + return result + def _update(self): if not super()._update(): return @@ -82,6 +109,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): old_job.assignedPrinter.updateActivePrintJob(None) self._print_jobs = print_jobs_seen + self.printJobsChanged.emit() def _onGetPrintersDataFinished(self, reply: QNetworkReply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) @@ -92,6 +120,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): Logger.log("w", "Received an invalid printers state message: Not valid JSON.") return + # TODO: Ensure that printers that have been removed are also removed locally. for printer_data in result: uuid = printer_data["uuid"] @@ -107,6 +136,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): printer.updateName(printer_data["friendly_name"]) printer.updateKey(uuid) + printer.updateType(printer_data["machine_variant"]) for index in range(0, self._number_of_extruders): extruder = printer.extruders[index] From 5d3779da261642f7cc4d83e0bf2597bf5af58344 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 15:54:44 +0100 Subject: [PATCH 069/551] Update cluster view components CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 10 ++-- cura/PrinterOutputDevice.py | 4 ++ .../UM3NetworkPrinting/ClusterMonitorItem.qml | 9 ++-- .../ClusterUM3OutputDevice.py | 20 +++++-- .../LegacyUM3OutputDevice.py | 4 +- .../PrintCoreConfiguration.qml | 4 +- .../UM3NetworkPrinting/PrinterInfoBlock.qml | 52 ++++++++----------- resources/qml/MonitorButton.qml | 4 +- resources/qml/Topbar.qml | 2 +- 9 files changed, 59 insertions(+), 50 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 8a6585469b..cb2dc15ea0 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -16,7 +16,7 @@ if MYPY: class PrinterOutputModel(QObject): bedTemperatureChanged = pyqtSignal() targetBedTemperatureChanged = pyqtSignal() - printerStateChanged = pyqtSignal() + stateChanged = pyqtSignal() activePrintJobChanged = pyqtSignal() nameChanged = pyqtSignal() headPositionChanged = pyqtSignal() @@ -161,17 +161,17 @@ class PrinterOutputModel(QObject): self._active_print_job = print_job self.activePrintJobChanged.emit() - def updatePrinterState(self, printer_state): + def updateState(self, printer_state): if self._printer_state != printer_state: self._printer_state = printer_state - self.printerStateChanged.emit() + self.stateChanged.emit() @pyqtProperty(QObject, notify = activePrintJobChanged) def activePrintJob(self): return self._active_print_job - @pyqtProperty(str, notify=printerStateChanged) - def printerState(self): + @pyqtProperty(str, notify=stateChanged) + def state(self): return self._printer_state @pyqtProperty(int, notify = bedTemperatureChanged) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index cc41123f77..3ce9782355 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -86,6 +86,10 @@ class PrinterOutputDevice(QObject, OutputDevice): return self._printers[0] return None + @pyqtProperty("QVariantList", notify = printersChanged) + def printers(self): + return self._printers + @pyqtProperty(QObject, constant=True) def monitorItem(self): # Note that we specifically only check if the monitor component is created. diff --git a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml index ec18b19119..5d819d9450 100644 --- a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml @@ -12,7 +12,6 @@ Component width: maximumWidth height: maximumHeight color: UM.Theme.getColor("viewport_background") - property var emphasisColor: UM.Theme.getColor("setting_control_border_highlight") property var lineColor: "#DCDCDC" // TODO: Should be linked to theme. property var cornerRadius: 4 * screenScaleFactor // TODO: Should be linked to theme. @@ -34,9 +33,9 @@ Component horizontalCenter: parent.horizontalCenter } - text: OutputDevice.connectedPrinters.length == 0 ? catalog.i18nc("@label: arg 1 is group name", "%1 is not set up to host a group of connected Ultimaker 3 printers").arg(Cura.MachineManager.printerOutputDevices[0].name) : "" + text: OutputDevice.printers.length == 0 ? catalog.i18nc("@label: arg 1 is group name", "%1 is not set up to host a group of connected Ultimaker 3 printers").arg(Cura.MachineManager.printerOutputDevices[0].name) : "" - visible: OutputDevice.connectedPrinters.length == 0 + visible: OutputDevice.printers.length == 0 } Item @@ -47,7 +46,7 @@ Component width: Math.min(800 * screenScaleFactor, maximumWidth) height: children.height - visible: OutputDevice.connectedPrinters.length != 0 + visible: OutputDevice.printers.length != 0 Label { @@ -80,7 +79,7 @@ Component anchors.fill: parent spacing: -UM.Theme.getSize("default_lining").height - model: OutputDevice.connectedPrinters + model: OutputDevice.printers delegate: PrinterInfoBlock { diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 8b3f065576..c43855ce61 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -20,7 +20,11 @@ import os class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): printJobsChanged = pyqtSignal() - printersChanged = pyqtSignal() + + # This is a bit of a hack, as the notify can only use signals that are defined by the class that they are in. + # Inheritance doesn't seem to work. Tying them together does work, but i'm open for better suggestions. + clusterPrintersChanged = pyqtSignal() + def __init__(self, device_id, address, properties, parent = None): super().__init__(device_id = device_id, address = address, properties=properties, parent = parent) self._api_prefix = "/cluster-api/v1/" @@ -32,6 +36,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterMonitorItem.qml") self._control_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterControlItem.qml") + # See comments about this hack with the clusterPrintersChanged signal + self.printersChanged.connect(self.clusterPrintersChanged) + @pyqtSlot() def openPrintJobControlPanel(self): Logger.log("d", "Opening print job control panel...") @@ -54,7 +61,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def activePrintJobs(self): return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is not None] - @pyqtProperty("QVariantList", notify=printersChanged) + @pyqtProperty("QVariantList", notify=clusterPrintersChanged) def connectedPrintersTypeCount(self): printer_count = {} for printer in self._printers: @@ -119,7 +126,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): except json.decoder.JSONDecodeError: Logger.log("w", "Received an invalid printers state message: Not valid JSON.") return - + printer_list_changed = False # TODO: Ensure that printers that have been removed are also removed locally. for printer_data in result: uuid = printer_data["uuid"] @@ -133,10 +140,15 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): if printer is None: printer = PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders) self._printers.append(printer) + printer_list_changed = True printer.updateName(printer_data["friendly_name"]) printer.updateKey(uuid) printer.updateType(printer_data["machine_variant"]) + if not printer_data["enabled"]: + printer.updateState("disabled") + else: + printer.updateState(printer_data["status"]) for index in range(0, self._number_of_extruders): extruder = printer.extruders[index] @@ -171,6 +183,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): name = name) extruder.updateActiveMaterial(material) + if printer_list_changed: + self.printersChanged.emit() else: Logger.log("w", "Got status code {status_code} while trying to get printer data".format(status_code=status_code)) \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index f830e28764..e1acd1bede 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -159,7 +159,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): # No active printer. Unable to write return - if self.activePrinter.printerState not in ["idle", ""]: + if self.activePrinter.state not in ["idle", ""]: # Printer is not able to accept commands. return @@ -578,7 +578,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): printer = self._printers[0] printer.updateBedTemperature(result["bed"]["temperature"]["current"]) printer.updateTargetBedTemperature(result["bed"]["temperature"]["target"]) - printer.updatePrinterState(result["status"]) + printer.updateState(result["status"]) head_position = result["heads"][0]["position"] printer.updateHeadPosition(head_position["x"], head_position["y"], head_position["z"]) diff --git a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml index 03ff4542e1..abebca2eb8 100644 --- a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml +++ b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml @@ -15,7 +15,7 @@ Item Label { id: materialLabel - text: printCoreConfiguration.material.material + " (" + printCoreConfiguration.material.color + ")" + text: printCoreConfiguration.activeMaterial.type + " (" + printCoreConfiguration.activeMaterial.color + ")" elide: Text.ElideRight width: parent.width font: UM.Theme.getFont("very_small") @@ -23,7 +23,7 @@ Item Label { id: printCoreLabel - text: printCoreConfiguration.print_core_id + text: printCoreConfiguration.hotendID anchors.top: materialLabel.bottom elide: Text.ElideRight width: parent.width diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index c253ebae89..a879ff7491 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -31,7 +31,7 @@ Rectangle function printerStatusText(printer) { - switch (printer.status) + switch (printer.state) { case "pre_print": return catalog.i18nc("@label", "Preparing to print") @@ -49,22 +49,14 @@ Rectangle } id: printerDelegate - property var printer + + property var printer: null + property var printJob: printer != null ? printer.activePrintJob: null border.width: UM.Theme.getSize("default_lining").width border.color: mouse.containsMouse ? emphasisColor : lineColor z: mouse.containsMouse ? 1 : 0 // Push this item up a bit on mouse over to ensure that the highlighted bottom border is visible. - property var printJob: - { - if (printer.reserved_by != null) - { - // Look in another list. - return OutputDevice.printJobsByUUID[printer.reserved_by] - } - return OutputDevice.printJobsByPrinterUUID[printer.uuid] - } - MouseArea { id: mouse @@ -73,7 +65,7 @@ Rectangle hoverEnabled: true; // Only clickable if no printer is selected - enabled: OutputDevice.selectedPrinterName == "" && printer.status !== "unreachable" + enabled: OutputDevice.selectedPrinterName == "" && printer.state !== "unreachable" } Row @@ -166,7 +158,7 @@ Rectangle anchors.right: printProgressArea.left anchors.rightMargin: UM.Theme.getSize("default_margin").width color: emphasisColor - opacity: printer != null && printer.status === "unreachable" ? 0.3 : 1 + opacity: printer != null && printer.state === "unreachable" ? 0.3 : 1 Image { @@ -192,7 +184,7 @@ Rectangle { id: leftExtruderInfo width: Math.floor((parent.width - extruderSeperator.width) / 2) - printCoreConfiguration: printer.configuration[0] + printCoreConfiguration: printer.extruders[0] } Rectangle @@ -207,7 +199,7 @@ Rectangle { id: rightExtruderInfo width: Math.floor((parent.width - extruderSeperator.width) / 2) - printCoreConfiguration: printer.configuration[1] + printCoreConfiguration: printer.extruders[1] } } @@ -225,9 +217,9 @@ Rectangle if(printJob != null) { var extendStates = ["sent_to_printer", "wait_for_configuration", "printing", "pre_print", "post_print", "wait_cleanup", "queued"]; - return extendStates.indexOf(printJob.status) !== -1; + return extendStates.indexOf(printJob.state) !== -1; } - return !printer.enabled; + return printer.state == "disabled" } Item // Status and Percent @@ -235,7 +227,7 @@ Rectangle id: printProgressTitleBar property var showPercent: { - return printJob != null && (["printing", "post_print", "pre_print", "sent_to_printer"].indexOf(printJob.status) !== -1); + return printJob != null && (["printing", "post_print", "pre_print", "sent_to_printer"].indexOf(printJob.state) !== -1); } width: parent.width @@ -252,19 +244,19 @@ Rectangle anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter text: { - if (!printer.enabled) + if (printer.state == "disabled") { return catalog.i18nc("@label:status", "Disabled"); } - if (printer.status === "unreachable") + if (printer.state === "unreachable") { return printerStatusText(printer); } if (printJob != null) { - switch (printJob.status) + switch (printJob.state) { case "printing": case "post_print": @@ -328,26 +320,26 @@ Rectangle visible: !printProgressTitleBar.showPercent source: { - if (!printer.enabled) + if (printer.state == "disabled") { return "blocked-icon.svg"; } - if (printer.status === "unreachable") + if (printer.state === "unreachable") { return ""; } if (printJob != null) { - if(printJob.status === "queued") + if(printJob.state === "queued") { if (printJob.configuration_changes_required != null && printJob.configuration_changes_required.length !== 0) { return "action-required-icon.svg"; } } - else if (printJob.status === "wait_cleanup") + else if (printJob.state === "wait_cleanup") { return "checkmark-icon.svg"; } @@ -384,19 +376,19 @@ Rectangle { text: { - if (!printer.enabled) + if (printer.state == "disabled") { return catalog.i18nc("@label", "Not accepting print jobs"); } - if (printer.status === "unreachable") + if (printer.state === "unreachable") { return ""; } if(printJob != null) { - switch (printJob.status) + switch (printJob.state) { case "printing": case "post_print": @@ -432,7 +424,7 @@ Rectangle text: { if(printJob != null) { - if(printJob.status == "printing" || printJob.status == "post_print") + if(printJob.state == "printing" || printJob.state == "post_print") { return OutputDevice.getDateCompleted(printJob.time_total - printJob.time_elapsed) } diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 6166f9b62f..a60eb0b3f3 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -73,7 +73,7 @@ Item if(!printerConnected || !printerAcceptsCommands) return UM.Theme.getColor("text"); - switch(activePrinter.printerState) + switch(activePrinter.state) { case "maintenance": return UM.Theme.getColor("status_busy"); @@ -118,7 +118,7 @@ Item var printerOutputDevice = Cura.MachineManager.printerOutputDevices[0] - if(activePrinter.printerState == "maintenance") + if(activePrinter.state == "maintenance") { return catalog.i18nc("@label:MonitorStatus", "In maintenance. Please check the printer"); } diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 63d0981830..4b5008c43e 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -124,7 +124,7 @@ Rectangle { return UM.Theme.getIcon("tab_status_unknown"); } - if (Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") + if (Cura.MachineManager.printerOutputDevices[0].state == "maintenance") { return UM.Theme.getIcon("tab_status_busy"); } From 6f495f2d8b1cadbc0848e8e241e59cb625fa5641 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 16:00:57 +0100 Subject: [PATCH 070/551] Cluster monitor now uses material name This matches better with what Cura does. CL-541 --- plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml index abebca2eb8..f0aeebd217 100644 --- a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml +++ b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml @@ -15,7 +15,7 @@ Item Label { id: materialLabel - text: printCoreConfiguration.activeMaterial.type + " (" + printCoreConfiguration.activeMaterial.color + ")" + text: printCoreConfiguration.activeMaterial.name elide: Text.ElideRight width: parent.width font: UM.Theme.getFont("very_small") From c6f2e167e20c96fece8e83b1adedf0aea3cfd748 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 16:02:55 +0100 Subject: [PATCH 071/551] Renamed some missed properties CL-541 --- plugins/UM3NetworkPrinting/PrinterInfoBlock.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index a879ff7491..b6b4f2e8c4 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -132,7 +132,7 @@ Rectangle anchors.top: parent.top anchors.left: parent.left width: Math.floor(parent.width / 2 - UM.Theme.getSize("default_margin").width - showCameraIcon.width) - text: printer.friendly_name + text: printer.name font: UM.Theme.getFont("default_bold") elide: Text.ElideRight } @@ -142,7 +142,7 @@ Rectangle id: printerTypeLabel anchors.top: printerNameLabel.bottom width: Math.floor(parent.width / 2 - UM.Theme.getSize("default_margin").width) - text: printer.machine_variant + text: printer.type anchors.left: parent.left elide: Text.ElideRight font: UM.Theme.getFont("very_small") From 83b13546fbb72584cc075eb42f1e4060a93e6bdf Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 17:12:36 +0100 Subject: [PATCH 072/551] Moved compressing of GCode to one class higher CL-541 --- .../NetworkedPrinterOutputDevice.py | 32 ++++++++++++ cura/PrinterOutputDevice.py | 2 +- .../ClusterUM3OutputDevice.py | 51 ++++++++++++++++++- .../LegacyUM3OutputDevice.py | 32 ------------ 4 files changed, 82 insertions(+), 35 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 58c82b6c38..e38338172a 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -45,6 +45,10 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._cached_multiparts = {} + self._sending_gcode = False + self._compressing_gcode = False + self._gcode = [] + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): raise NotImplementedError("requestWrite needs to be implemented") @@ -57,6 +61,34 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def authenticationState(self): return self._authentication_state + def _compressGCode(self): + self._compressing_gcode = True + + ## Mash the data into single string + max_chars_per_line = int(1024 * 1024 / 4) # 1/4 MB per line. + byte_array_file_data = b"" + batched_line = "" + + for line in self._gcode: + if not self._compressing_gcode: + self._progress_message.hide() + # Stop trying to zip / send as abort was called. + return + batched_line += line + # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. + # Compressing line by line in this case is extremely slow, so we need to batch them. + if len(batched_line) < max_chars_per_line: + continue + byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) + batched_line = "" + + # Don't miss the last batch (If any) + if batched_line: + byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) + + self._compressing_gcode = False + return byte_array_file_data + def _update(self): if self._last_response_time: time_since_last_response = time() - self._last_response_time diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 3ce9782355..bf912ad4a5 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -138,7 +138,7 @@ class PrinterOutputDevice(QObject, OutputDevice): def acceptsCommands(self): return self._accepts_commands - ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands + ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands def setAcceptsCommands(self, accepts_commands): if self._accepts_commands != accepts_commands: self._accepts_commands = accepts_commands diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index c43855ce61..7d95acc920 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -2,10 +2,12 @@ # Cura is released under the terms of the LGPLv3 or higher. from UM.Logger import Logger - +from UM.Application import Application from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.i18n import i18nCatalog +from UM.Message import Message -from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice +from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice, AuthState from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel @@ -17,6 +19,8 @@ from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty import json import os +i18n_catalog = i18nCatalog("cura") + class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): printJobsChanged = pyqtSignal() @@ -39,6 +43,49 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # See comments about this hack with the clusterPrintersChanged signal self.printersChanged.connect(self.clusterPrintersChanged) + self._accepts_commands = True + + # Cluster does not have authentication, so default to authenticated + self._authentication_state = AuthState.Authenticated + + self._error_message = None + self._progress_message = None + + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): + # Notify the UI that a switch to the print monitor should happen + Application.getInstance().showPrintMonitor.emit(True) + self.writeStarted.emit(self) + + self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", []) + if not self._gcode: + # Unable to find g-code. Nothing to send + return + + @pyqtSlot() + def sendPrintJob(self): + Logger.log("i", "Sending print job to printer.") + if self._sending_gcode: + self._error_message = Message( + i18n_catalog.i18nc("@info:status", + "Sending new jobs (temporarily) blocked, still sending the previous print job.")) + self._error_message.show() + return + + self._sending_gcode = True + + self._progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to printer"), 0, False, -1, + i18n_catalog.i18nc("@info:title", "Sending Data")) + self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "") + self._progress_message.actionTriggered.connect(self._progressMessageActionTriggered) + + compressed_gcode = self._compressGCode() + if compressed_gcode is None: + # Abort was called. + return + + + + @pyqtSlot() def openPrintJobControlPanel(self): Logger.log("d", "Opening print job control panel...") diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index e1acd1bede..642a67d729 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -63,10 +63,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_succeeded_message = None self._not_authenticated_message = None - self._sending_gcode = False - self._compressing_gcode = False - self._gcode = [] - self.authenticationStateChanged.connect(self._onAuthenticationStateChanged) self.setPriority(3) # Make sure the output device gets selected above local file output @@ -286,34 +282,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._progress_message.hide() - def _compressGCode(self): - self._compressing_gcode = True - - ## Mash the data into single string - max_chars_per_line = 1024 * 1024 / 4 # 1/4 MB per line. - byte_array_file_data = b"" - batched_line = "" - - for line in self._gcode: - if not self._compressing_gcode: - self._progress_message.hide() - # Stop trying to zip / send as abort was called. - return - batched_line += line - # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. - # Compressing line by line in this case is extremely slow, so we need to batch them. - if len(batched_line) < max_chars_per_line: - continue - byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) - batched_line = "" - - # Don't miss the last batch (If any) - if batched_line: - byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) - - self._compressing_gcode = False - return byte_array_file_data - def _messageBoxCallback(self, button): def delayedCallback(): if button == QMessageBox.Yes: From c1c59925ded42732d6d0e63a9ce9811c6d494dfc Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 17:14:30 +0100 Subject: [PATCH 073/551] Removed duplicated code CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index e38338172a..91da01d9cb 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -113,16 +113,11 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): return True - def _createEmptyFormRequest(self, target): + def _createEmptyRequest(self, target, content_type: Optional[str] = "application/json"): url = QUrl("http://" + self._address + self._api_prefix + target) request = QNetworkRequest(url) - request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) - return request - - def _createEmptyRequest(self, target): - url = QUrl("http://" + self._address + self._api_prefix + target) - request = QNetworkRequest(url) - request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") + if content_type is not None: + request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) return request @@ -168,7 +163,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() - request = self._createEmptyFormRequest(target) + request = self._createEmptyRequest(target, content_type=None) multi_post_part = QHttpMultiPart(QHttpMultiPart.FormDataType) post_part = QHttpPart() From cfc6a3ad484658ffeae1be5849aa567a7519a763 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 28 Nov 2017 12:43:49 +0100 Subject: [PATCH 074/551] Added some convenience functions to NetworkedPrinterOutputdevice This also moves the getUser from legacy to networked printer CL-541 --- .../NetworkedPrinterOutputDevice.py | 43 +++++++++++++++---- .../LegacyUM3OutputDevice.py | 12 +----- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 91da01d9cb..8d6e39bf35 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -12,7 +12,9 @@ from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, py from time import time from typing import Callable, Any, Optional from enum import IntEnum +from typing import List +import os class AuthState(IntEnum): NotAuthenticated = 1 @@ -121,6 +123,28 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) return request + def _createFormPart(self, content_header, data, content_type = None): + part = QHttpPart() + + if not content_header.startswith("form-data;"): + content_header = "form_data; " + content_header + part.setHeader(QNetworkRequest.ContentDispositionHeader, content_header) + + if content_type is not None: + part.setHeader(QNetworkRequest.ContentTypeHeader, content_type) + + part.setBody(data) + return part + + ## Convenience function to get the username from the OS. + # The code was copied from the getpass module, as we try to use as little dependencies as possible. + def _getUserName(self): + for name in ("LOGNAME", "USER", "LNAME", "USERNAME"): + user = os.environ.get(name) + if user: + return user + return "Unknown User" # Couldn't find out username. + def _clearCachedMultiPart(self, reply): if id(reply) in self._cached_multiparts: del self._cached_multiparts[id(reply)] @@ -160,29 +184,32 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target, content_type=None) - multi_post_part = QHttpMultiPart(QHttpMultiPart.FormDataType) - post_part = QHttpPart() - post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data) - post_part.setBody(body_data) - multi_post_part.append(post_part) + for part in parts: + multi_post_part.append(part) self._last_request_time = time() reply = self._manager.post(request, multi_post_part) - # Due to garbage collection on python doing some weird stuff, we need to keep hold of a reference - self._cached_multiparts[id(reply)] = (post_part, multi_post_part, reply) + self._cached_multiparts[id(reply)] = (multi_post_part, reply) if onProgress is not None: reply.uploadProgress.connect(onProgress) if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + post_part = QHttpPart() + post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data) + post_part.setBody(body_data) + + self.postFormWithParts(target, [post_part], onFinished, onProgress) + def _onAuthenticationRequired(self, reply, authenticator): Logger.log("w", "Request to {url} required authentication, which was not implemented".format(url = reply.url().toString())) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 642a67d729..35e7f1890d 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -143,6 +143,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): continue # If it's not readonly, it's created by user, so skip it. file_name = "none.xml" + self.postForm("materials", "form-data; name=\"file\";filename=\"%s\"" % file_name, xml_data.encode(), onFinished=None) except NotImplementedError: @@ -596,13 +597,4 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): result = "********" + result return result - return self._authentication_key - - ## Convenience function to get the username from the OS. - # The code was copied from the getpass module, as we try to use as little dependencies as possible. - def _getUserName(self): - for name in ("LOGNAME", "USER", "LNAME", "USERNAME"): - user = os.environ.get(name) - if user: - return user - return "Unknown User" # Couldn't find out username. \ No newline at end of file + return self._authentication_key \ No newline at end of file From 9084dfd6bd3545e57618b1300d7e19b593f4db6b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 28 Nov 2017 12:59:54 +0100 Subject: [PATCH 075/551] It's now possible to send print jobs to cluster again CL-541 --- .../NetworkedPrinterOutputDevice.py | 20 ++++++--- .../ClusterUM3OutputDevice.py | 43 +++++++++++++++++++ .../LegacyUM3OutputDevice.py | 13 +----- 3 files changed, 59 insertions(+), 17 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 8d6e39bf35..3585aee5ea 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -7,14 +7,14 @@ from UM.Logger import Logger from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply -from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl - +from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, pyqtSignal, QUrl, QCoreApplication from time import time from typing import Callable, Any, Optional from enum import IntEnum from typing import List -import os +import os # To get the username +import gzip class AuthState(IntEnum): NotAuthenticated = 1 @@ -63,6 +63,16 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def authenticationState(self): return self._authentication_state + def _compressDataAndNotifyQt(self, data_to_append): + compressed_data = gzip.compress(data_to_append.encode("utf-8")) + self._progress_message.setProgress(-1) # Tickle the message so that it's clear that it's still being used. + QCoreApplication.processEvents() # Ensure that the GUI does not freeze. + + # Pretend that this is a response, as zipping might take a bit of time. + # If we don't do this, the device might trigger a timeout. + self._last_response_time = time() + return compressed_data + def _compressGCode(self): self._compressing_gcode = True @@ -81,12 +91,12 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): # Compressing line by line in this case is extremely slow, so we need to batch them. if len(batched_line) < max_chars_per_line: continue - byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) + byte_array_file_data += self._compressDataAndNotifyQt(batched_line) batched_line = "" # Don't miss the last batch (If any) if batched_line: - byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) + byte_array_file_data += self._compressDataAndNotifyQt(batched_line) self._compressing_gcode = False return byte_array_file_data diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 7d95acc920..ec6c94adb7 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -16,6 +16,8 @@ from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from PyQt5.QtGui import QDesktopServices from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty +from time import time + import json import os @@ -61,6 +63,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # Unable to find g-code. Nothing to send return + # TODO; DEBUG + self.sendPrintJob() + @pyqtSlot() def sendPrintJob(self): Logger.log("i", "Sending print job to printer.") @@ -83,8 +88,46 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # Abort was called. return + parts = [] + # If a specific printer was selected, it should be printed with that machine. + require_printer_name = "" # Todo; actually needs to be set + if require_printer_name: + parts.append(self._createFormPart("name=require_printer_name", bytes(require_printer_name, "utf-8"), "text/plain")) + # Add user name to the print_job + parts.append(self._createFormPart("name=owner", bytes(self._getUserName(), "utf-8"), "text/plain")) + + file_name = "%s.gcode.gz" % Application.getInstance().getPrintInformation().jobName + + parts.append(self._createFormPart("name=\"file\"; filename=\"%s\"" % file_name, compressed_gcode)) + + self.postFormWithParts("print_jobs/", parts, onFinished=self._onPostPrintJobFinished, onProgress=self._onUploadPrintJobProgress) + + def _onPostPrintJobFinished(self, reply): + print("POST PRINTJOB DONE! YAY!", reply.readAll()) + pass + + def _onUploadPrintJobProgress(self, bytes_sent, bytes_total): + if bytes_total > 0: + new_progress = bytes_sent / bytes_total * 100 + # Treat upload progress as response. Uploading can take more than 10 seconds, so if we don't, we can get + # timeout responses if this happens. + self._last_response_time = time() + if new_progress > self._progress_message.getProgress(): + self._progress_message.show() # Ensure that the message is visible. + self._progress_message.setProgress(bytes_sent / bytes_total * 100) + else: + self._progress_message.setProgress(0) + self._progress_message.hide() + + def _progressMessageActionTriggered(self, message_id=None, action_id=None): + if action_id == "Abort": + Logger.log("d", "User aborted sending print to remote.") + self._progress_message.hide() + self._compressing_gcode = False + self._sending_gcode = False + Application.getInstance().showPrintMonitor.emit(False) @pyqtSlot() def openPrintJobControlPanel(self): diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 35e7f1890d..d89efc2acc 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -21,8 +21,7 @@ from .LegacyUM3PrinterOutputController import LegacyUM3PrinterOutputController from time import time import json -import os # To get the username -import gzip + i18n_catalog = i18nCatalog("cura") @@ -259,16 +258,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._progress_message.hide() self._sending_gcode = False - def __compressDataAndNotifyQt(self, data_to_append): - compressed_data = gzip.compress(data_to_append.encode("utf-8")) - self._progress_message.setProgress(-1) # Tickle the message so that it's clear that it's still being used. - QCoreApplication.processEvents() # Ensure that the GUI does not freeze. - - # Pretend that this is a response, as zipping might take a bit of time. - # If we don't do this, the device might trigger a timeout. - self._last_response_time = time() - return compressed_data - def _onUploadPrintJobProgress(self, bytes_sent, bytes_total): if bytes_total > 0: new_progress = bytes_sent / bytes_total * 100 From e8418960903aa68a06a19e17490a358c48debda6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 28 Nov 2017 13:04:58 +0100 Subject: [PATCH 076/551] PrintJobs are now assigned if they are not queued It used to just do it if it was printing, but jobs can also be in other states such as paused, pre_print, etc CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index ec6c94adb7..c8462e34d5 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -193,7 +193,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job.updateTimeTotal(print_job_data["time_total"]) print_job.updateTimeElapsed(print_job_data["time_elapsed"]) print_job.updateState(print_job_data["status"]) - if print_job.state == "printing": + if print_job.state != "queued": # Print job should be assigned to a printer. printer = self._getPrinterByKey(print_job_data["printer_uuid"]) if printer: From 3d3b140526191126b3a7e2cf45fd1180861c6bcb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 10:53:38 +0100 Subject: [PATCH 077/551] Times are correctly displayed for Cluster again CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 7 ++++++- plugins/UM3NetworkPrinting/PrinterInfoBlock.qml | 6 +++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index c8462e34d5..ce96627296 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -6,6 +6,7 @@ from UM.Application import Application from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog from UM.Message import Message +from UM.Qt.Duration import Duration, DurationFormat from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice, AuthState from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel @@ -164,6 +165,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): result.append({"machine_type": machine_type, "count": printer_count[machine_type]}) return result + @pyqtSlot(int, result=str) + def formatDuration(self, seconds): + return Duration(seconds).getDisplayString(DurationFormat.Format.Short) + def _update(self): if not super()._update(): return @@ -201,7 +206,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_jobs_seen.append(print_job) for old_job in self._print_jobs: - if old_job not in print_jobs_seen: + if old_job not in print_jobs_seen and old_job.assignedPrinter: # Print job needs to be removed. old_job.assignedPrinter.updateActivePrintJob(None) diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index b6b4f2e8c4..5c0963a390 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -22,11 +22,11 @@ Rectangle { return ""; } - if (printJob.time_total === 0) + if (printJob.timeTotal === 0) { return ""; } - return Math.min(100, Math.round(printJob.time_elapsed / printJob.time_total * 100)) + "%"; + return Math.min(100, Math.round(printJob.timeElapsed / printJob.timeTotal * 100)) + "%"; } function printerStatusText(printer) @@ -114,7 +114,7 @@ Rectangle anchors.left: parent.left anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width - text: printJob != null ? getPrettyTime(printJob.time_total) : "" + text: printJob != null ? getPrettyTime(printJob.timeTotal) : "" opacity: 0.65 font: UM.Theme.getFont("default") elide: Text.ElideRight From f30f0a7194366d02492d472069f6783bef3a65d0 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 11:04:13 +0100 Subject: [PATCH 078/551] Mismatched configuration is now shown correctly again CL-541 --- cura/PrinterOutput/PrintJobOutputModel.py | 14 +++++++++++++- .../ClusterUM3OutputDevice.py | 10 ++++++++-- plugins/UM3NetworkPrinting/PrinterInfoBlock.qml | 17 ++--------------- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 9c96c45ca8..fa8bbe8673 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot +from typing import Optional MYPY = False if MYPY: from cura.PrinterOutput.PrinterOutputController import PrinterOutputController @@ -15,6 +16,7 @@ class PrintJobOutputModel(QObject): nameChanged = pyqtSignal() keyChanged = pyqtSignal() assignedPrinterChanged = pyqtSignal() + ownerChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", key: str = "", name: str = "", parent=None): super().__init__(parent) @@ -24,7 +26,17 @@ class PrintJobOutputModel(QObject): self._time_elapsed = 0 self._name = name # Human readable name self._key = key # Unique identifier - self._assigned_printer = None + self._assigned_printer = None # type: Optional[PrinterOutputModel] + self._owner = "" # Who started/owns the print job? + + @pyqtProperty(str, notify=ownerChanged) + def owner(self): + return self._owner + + def updateOwner(self, owner): + if self._owner != owner: + self._owner = owner + self.ownerChanged.emit() @pyqtProperty(QObject, notify=assignedPrinterChanged) def assignedPrinter(self): diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index ce96627296..362dc344d4 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -198,11 +198,17 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job.updateTimeTotal(print_job_data["time_total"]) print_job.updateTimeElapsed(print_job_data["time_elapsed"]) print_job.updateState(print_job_data["status"]) + print_job.updateOwner(print_job_data["owner"]) + printer = None if print_job.state != "queued": # Print job should be assigned to a printer. printer = self._getPrinterByKey(print_job_data["printer_uuid"]) - if printer: - printer.updateActivePrintJob(print_job) + else: # Status is queued + # The job can "reserve" a printer if some changes are required. + printer = self._getPrinterByKey(print_job_data["assigned_to"]) + + if printer: + printer.updateActivePrintJob(print_job) print_jobs_seen.append(print_job) for old_job in self._print_jobs: diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index 5c0963a390..29fe8882f9 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -269,14 +269,7 @@ Rectangle case "sent_to_printer": return catalog.i18nc("@label", "Preparing to print") case "queued": - if (printJob.configuration_changes_required != null && printJob.configuration_changes_required.length !== 0) - { return catalog.i18nc("@label:status", "Action required"); - } - else - { - return ""; - } case "pausing": case "paused": return catalog.i18nc("@label:status", "Paused"); @@ -334,10 +327,7 @@ Rectangle { if(printJob.state === "queued") { - if (printJob.configuration_changes_required != null && printJob.configuration_changes_required.length !== 0) - { - return "action-required-icon.svg"; - } + return "action-required-icon.svg"; } else if (printJob.state === "wait_cleanup") { @@ -401,10 +391,7 @@ Rectangle case "wait_for_configuration": return catalog.i18nc("@label", "Not accepting print jobs") case "queued": - if (printJob.configuration_changes_required != undefined) - { - return catalog.i18nc("@label", "Waiting for configuration change"); - } + return catalog.i18nc("@label", "Waiting for configuration change"); default: return ""; } From 70cfbf01809abb1d25132d19364ca1f2dda39a25 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 11:44:18 +0100 Subject: [PATCH 079/551] PostPrintjobFinished now hides messages & resets state CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 6 ++++-- plugins/UM3NetworkPrinting/PrinterInfoBlock.qml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 362dc344d4..7d459abf4c 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -106,8 +106,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self.postFormWithParts("print_jobs/", parts, onFinished=self._onPostPrintJobFinished, onProgress=self._onUploadPrintJobProgress) def _onPostPrintJobFinished(self, reply): - print("POST PRINTJOB DONE! YAY!", reply.readAll()) - pass + self._progress_message.hide() + self._compressing_gcode = False + self._sending_gcode = False + Application.getInstance().showPrintMonitor.emit(False) def _onUploadPrintJobProgress(self, bytes_sent, bytes_total): if bytes_total > 0: diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index 29fe8882f9..3a7fd1fc74 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -382,7 +382,7 @@ Rectangle { case "printing": case "post_print": - return catalog.i18nc("@label", "Finishes at: ") + OutputDevice.getTimeCompleted(printJob.time_total - printJob.time_elapsed) + return catalog.i18nc("@label", "Finishes at: ") + OutputDevice.getTimeCompleted(printJob.timeTotal - printJob.timeElapsed) case "wait_cleanup": return catalog.i18nc("@label", "Clear build plate") case "sent_to_printer": From a49d3dbd8ec654834d86d4e7bdba6aca0c7775b3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 11:57:14 +0100 Subject: [PATCH 080/551] Added missing time/date completed CL-541 --- .../UM3NetworkPrinting/ClusterUM3OutputDevice.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 7d459abf4c..76d4c70752 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -18,7 +18,7 @@ from PyQt5.QtGui import QDesktopServices from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty from time import time - +from datetime import datetime import json import os @@ -171,6 +171,19 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def formatDuration(self, seconds): return Duration(seconds).getDisplayString(DurationFormat.Format.Short) + @pyqtSlot(int, result=str) + def getTimeCompleted(self, time_remaining): + current_time = time() + datetime_completed = datetime.fromtimestamp(current_time + time_remaining) + return "{hour:02d}:{minute:02d}".format(hour=datetime_completed.hour, minute=datetime_completed.minute) + + @pyqtSlot(int, result=str) + def getDateCompleted(self, time_remaining): + current_time = time() + datetime_completed = datetime.fromtimestamp(current_time + time_remaining) + + return (datetime_completed.strftime("%a %b ") + "{day}".format(day=datetime_completed.day)).upper() + def _update(self): if not super()._update(): return From dea13899b321825fe22e0809cb7b8bdd260f1b09 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 13:07:01 +0100 Subject: [PATCH 081/551] Cluster can now "target" one of it's printers for display CL-541 --- .../UM3NetworkPrinting/ClusterMonitorItem.qml | 7 +++---- .../ClusterUM3OutputDevice.py | 18 ++++++++++++++++-- .../UM3NetworkPrinting/PrinterInfoBlock.qml | 4 ++-- .../UM3NetworkPrinting/PrinterVideoStream.qml | 2 +- resources/qml/MonitorButton.qml | 13 +++++++++---- 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml index 5d819d9450..df102915ff 100644 --- a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml @@ -62,7 +62,6 @@ Component } } - ScrollView { id: printerScrollView @@ -93,10 +92,10 @@ Component } } - /*PrinterVideoStream + PrinterVideoStream { - visible: OutputDevice.selectedPrinterName != "" + visible: OutputDevice.activePrinter != null anchors.fill:parent - }*/ + } } } diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 76d4c70752..3cee20a54f 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -15,10 +15,12 @@ from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from PyQt5.QtGui import QDesktopServices -from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty +from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QObject from time import time from datetime import datetime +from typing import Optional + import json import os @@ -27,6 +29,7 @@ i18n_catalog = i18nCatalog("cura") class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): printJobsChanged = pyqtSignal() + activePrinterChanged = pyqtSignal() # This is a bit of a hack, as the notify can only use signals that are defined by the class that they are in. # Inheritance doesn't seem to work. Tying them together does work, but i'm open for better suggestions. @@ -54,6 +57,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._error_message = None self._progress_message = None + self._active_printer = None # type: Optional[PrinterOutputModel] + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): # Notify the UI that a switch to the print monitor should happen Application.getInstance().showPrintMonitor.emit(True) @@ -105,11 +110,20 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self.postFormWithParts("print_jobs/", parts, onFinished=self._onPostPrintJobFinished, onProgress=self._onUploadPrintJobProgress) + @pyqtProperty(QObject, notify=activePrinterChanged) + def activePrinter(self) -> Optional["PrinterOutputModel"]: + return self._active_printer + + @pyqtSlot(QObject) + def setActivePrinter(self, printer): + if self._active_printer != printer: + self._active_printer = printer + self.activePrinterChanged.emit() + def _onPostPrintJobFinished(self, reply): self._progress_message.hide() self._compressing_gcode = False self._sending_gcode = False - Application.getInstance().showPrintMonitor.emit(False) def _onUploadPrintJobProgress(self, bytes_sent, bytes_total): if bytes_total > 0: diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index 3a7fd1fc74..6d7d6c8a7d 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -61,11 +61,11 @@ Rectangle { id: mouse anchors.fill:parent - onClicked: OutputDevice.selectPrinter(printer.unique_name, printer.friendly_name) + onClicked: OutputDevice.setActivePrinter(printer) hoverEnabled: true; // Only clickable if no printer is selected - enabled: OutputDevice.selectedPrinterName == "" && printer.state !== "unreachable" + enabled: OutputDevice.activePrinter == null && printer.state !== "unreachable" } Row diff --git a/plugins/UM3NetworkPrinting/PrinterVideoStream.qml b/plugins/UM3NetworkPrinting/PrinterVideoStream.qml index 6793d74ac5..d0a9e08232 100644 --- a/plugins/UM3NetworkPrinting/PrinterVideoStream.qml +++ b/plugins/UM3NetworkPrinting/PrinterVideoStream.qml @@ -17,7 +17,7 @@ Item MouseArea { anchors.fill: parent - onClicked: OutputDevice.selectAutomaticPrinter() + onClicked: OutputDevice.setActivePrinter(null) z: 0 } diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index a60eb0b3f3..778884ba00 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -70,8 +70,10 @@ Item property variant statusColor: { - if(!printerConnected || !printerAcceptsCommands) + if(!printerConnected || !printerAcceptsCommands || activePrinter == null) + { return UM.Theme.getColor("text"); + } switch(activePrinter.state) { @@ -117,7 +119,10 @@ Item } var printerOutputDevice = Cura.MachineManager.printerOutputDevices[0] - + if(activePrinter == null) + { + return ""; + } if(activePrinter.state == "maintenance") { return catalog.i18nc("@label:MonitorStatus", "In maintenance. Please check the printer"); @@ -262,7 +267,7 @@ Item property bool userClicked: false property string lastJobState: "" - visible: printerConnected && activePrinter.canPause + visible: printerConnected && activePrinter != null &&activePrinter.canPause enabled: (!userClicked) && printerConnected && printerAcceptsCommands && activePrintJob != null && (["paused", "printing"].indexOf(activePrintJob.state) >= 0) @@ -305,7 +310,7 @@ Item { id: abortButton - visible: printerConnected && activePrinter.canAbort + visible: printerConnected && activePrinter != null && activePrinter.canAbort enabled: printerConnected && printerAcceptsCommands && activePrintJob != null && (["paused", "printing", "pre_print"].indexOf(activePrintJob.state) >= 0) From d8c48343625ac745b18576b9761273b8af5cb7c3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 13:20:58 +0100 Subject: [PATCH 082/551] Aborting & pausing prints is now possible again from the Cluster output device CL-541 --- .../ClusterUM3OutputDevice.py | 6 ++++-- .../ClusterUM3PrinterOutputController.py | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 plugins/UM3NetworkPrinting/ClusterUM3PrinterOutputController.py diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 3cee20a54f..da26e77643 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -13,6 +13,8 @@ from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel +from .ClusterUM3PrinterOutputController import ClusterUM3PrinterOutputController + from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from PyQt5.QtGui import QDesktopServices from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QObject @@ -221,7 +223,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): break if print_job is None: - print_job = PrintJobOutputModel(output_controller = None, + print_job = PrintJobOutputModel(output_controller = ClusterUM3PrinterOutputController(self), key = print_job_data["uuid"], name = print_job_data["name"]) print_job.updateTimeTotal(print_job_data["time_total"]) @@ -268,7 +270,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): break if printer is None: - printer = PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders) + printer = PrinterOutputModel(output_controller=ClusterUM3PrinterOutputController(self), number_of_extruders=self._number_of_extruders) self._printers.append(printer) printer_list_changed = True diff --git a/plugins/UM3NetworkPrinting/ClusterUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/ClusterUM3PrinterOutputController.py new file mode 100644 index 0000000000..4615cd62dc --- /dev/null +++ b/plugins/UM3NetworkPrinting/ClusterUM3PrinterOutputController.py @@ -0,0 +1,21 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from cura.PrinterOutput.PrinterOutputController import PrinterOutputController + +MYPY = False +if MYPY: + from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + + +class ClusterUM3PrinterOutputController(PrinterOutputController): + def __init__(self, output_device): + super().__init__(output_device) + self.can_pre_heat_bed = False + self.can_control_manually = False + + def setJobState(self, job: "PrintJobOutputModel", state: str): + data = "{\"action\": \"%s\"}" % state + self._output_device.put("print_jobs/%s/action" % job.key, data, onFinished=None) + From 339d7ca4c9e5da8e7277f2a40237fae1b811ddec Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 14:36:53 +0100 Subject: [PATCH 083/551] Cluster shows default controlItem again when a specific printer is selected CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 8 ++++++++ resources/qml/PrintMonitor.qml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index da26e77643..f4675a2e0a 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -61,6 +61,14 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._active_printer = None # type: Optional[PrinterOutputModel] + @pyqtProperty(QObject, notify=activePrinterChanged) + def controlItem(self): + if self._active_printer is None: + return super().controlItem + else: + # Let cura use the default. + return None + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): # Notify the UI that a switch to the print monitor should happen Application.getInstance().showPrintMonitor.emit(True) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 830093cd2b..b3c36f7fd4 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -45,7 +45,7 @@ Column Repeater { id: extrudersRepeater - model: activePrinter.extruders + model: activePrinter!=null ? activePrinter.extruders : null ExtruderBox { From 1c1c195b931705e8746b28ab65f0411501fca4ce Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 15:01:28 +0100 Subject: [PATCH 084/551] When an printer gets added / removed, this is now correctly shown CL-541 --- .../ClusterUM3OutputDevice.py | 19 ++++++++++++++++++- .../PrintCoreConfiguration.qml | 2 +- resources/qml/MonitorButton.qml | 5 ++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index f4675a2e0a..b64716c958 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -268,6 +268,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): return printer_list_changed = False # TODO: Ensure that printers that have been removed are also removed locally. + + printers_seen = [] + for printer_data in result: uuid = printer_data["uuid"] @@ -282,6 +285,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._printers.append(printer) printer_list_changed = True + printers_seen.append(printer) + printer.updateName(printer_data["friendly_name"]) printer.updateKey(uuid) printer.updateType(printer_data["machine_variant"]) @@ -292,7 +297,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): for index in range(0, self._number_of_extruders): extruder = printer.extruders[index] - extruder_data = printer_data["configuration"][index] + try: + extruder_data = printer_data["configuration"][index] + except IndexError: + break + try: hotend_id = extruder_data["print_core_id"] except KeyError: @@ -322,6 +331,14 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): color = color, name = name) extruder.updateActiveMaterial(material) + removed_printers = [printer for printer in self._printers if printer not in printers_seen] + + for removed_printer in removed_printers: + self._printers.remove(removed_printer) + printer_list_changed = True + if self._active_printer == removed_printer: + self._active_printer = None + self.activePrinterChanged.emit() if printer_list_changed: self.printersChanged.emit() diff --git a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml index f0aeebd217..70fa65da5e 100644 --- a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml +++ b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml @@ -15,7 +15,7 @@ Item Label { id: materialLabel - text: printCoreConfiguration.activeMaterial.name + text: printCoreConfiguration.activeMaterial != null ? printCoreConfiguration.activeMaterial.name : "" elide: Text.ElideRight width: parent.width font: UM.Theme.getFont("very_small") diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 778884ba00..d4861c830a 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -82,7 +82,10 @@ Item case "error": return UM.Theme.getColor("status_stopped"); } - + if(base.activePrintJob == null) + { + return UM.Theme.getColor("text"); + } switch(base.activePrintJob.state) { case "printing": From 51c4062f1b4649833036f9d5cd2bbcbc0ca35947 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 15:17:08 +0100 Subject: [PATCH 085/551] Limit the amount of emits happening for PrintJobs changed CL-541 --- .../ClusterUM3OutputDevice.py | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index b64716c958..8114a3eef5 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -223,6 +223,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): Logger.log("w", "Received an invalid print jobs message: Not valid JSON.") return print_jobs_seen = [] + job_list_changed = False for print_job_data in result: print_job = None for job in self._print_jobs: @@ -234,6 +235,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job = PrintJobOutputModel(output_controller = ClusterUM3PrinterOutputController(self), key = print_job_data["uuid"], name = print_job_data["name"]) + job_list_changed = True + self._print_jobs.append(print_job) print_job.updateTimeTotal(print_job_data["time_total"]) print_job.updateTimeElapsed(print_job_data["time_elapsed"]) print_job.updateState(print_job_data["status"]) @@ -250,13 +253,18 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): printer.updateActivePrintJob(print_job) print_jobs_seen.append(print_job) - for old_job in self._print_jobs: - if old_job not in print_jobs_seen and old_job.assignedPrinter: - # Print job needs to be removed. - old_job.assignedPrinter.updateActivePrintJob(None) - self._print_jobs = print_jobs_seen - self.printJobsChanged.emit() + # Check what jobs need to be removed. + removed_jobs = [print_job for print_job in self._print_jobs if print_job not in print_jobs_seen] + for removed_job in removed_jobs: + if removed_job.assignedPrinter: + removed_job.assignedPrinter.updateActivePrintJob(None) + self._print_jobs.remove(removed_job) + job_list_changed = True + + # Do a single emit for all print job changes. + if job_list_changed: + self.printJobsChanged.emit() def _onGetPrintersDataFinished(self, reply: QNetworkReply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) From 77e3965fc7ca3771bc421dac564849c95c48df52 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 6 Dec 2017 14:59:20 +0100 Subject: [PATCH 086/551] Added videostream to cluster again CL-541 --- cura/CameraImageProvider.py | 2 +- cura/PrinterOutput/NetworkCamera.py | 113 ++++++++++++++++++ cura/PrinterOutput/PrinterOutputModel.py | 12 ++ .../ClusterUM3OutputDevice.py | 2 + .../UM3NetworkPrinting/PrinterVideoStream.qml | 16 ++- 5 files changed, 139 insertions(+), 6 deletions(-) create mode 100644 cura/PrinterOutput/NetworkCamera.py diff --git a/cura/CameraImageProvider.py b/cura/CameraImageProvider.py index ff66170f3c..ddf978f625 100644 --- a/cura/CameraImageProvider.py +++ b/cura/CameraImageProvider.py @@ -12,7 +12,7 @@ class CameraImageProvider(QQuickImageProvider): def requestImage(self, id, size): for output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): try: - return output_device.getCameraImage(), QSize(15, 15) + return output_device.activePrinter.camera.getImage(), QSize(15, 15) except AttributeError: pass return QImage(), QSize(15, 15) \ No newline at end of file diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py new file mode 100644 index 0000000000..5cb76d2876 --- /dev/null +++ b/cura/PrinterOutput/NetworkCamera.py @@ -0,0 +1,113 @@ +from UM.Logger import Logger + +from PyQt5.QtCore import QUrl, pyqtProperty, pyqtSignal, QObject, pyqtSlot +from PyQt5.QtGui import QImage +from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply, QNetworkAccessManager + + +class NetworkCamera(QObject): + newImage = pyqtSignal() + + def __init__(self, target = None, parent = None): + super().__init__(parent) + self._stream_buffer = b"" + self._stream_buffer_start_index = -1 + self._manager = None + self._image_request = None + self._image_reply = None + self._image = QImage() + self._image_id = 0 + + self._target = target + self._started = False + + @pyqtSlot(str) + def setTarget(self, target): + restart_required = False + if self._started: + self.stop() + restart_required = True + + self._target = target + + if restart_required: + self.start() + + @pyqtProperty(QUrl, notify=newImage) + def latestImage(self): + self._image_id += 1 + # There is an image provider that is called "camera". In order to ensure that the image qml object, that + # requires a QUrl to function, updates correctly we add an increasing number. This causes to see the QUrl + # as new (instead of relying on cached version and thus forces an update. + temp = "image://camera/" + str(self._image_id) + + return QUrl(temp, QUrl.TolerantMode) + + @pyqtSlot() + def start(self): + if self._target is None: + Logger.log("w", "Unable to start camera stream without target!") + return + self._started = True + url = QUrl(self._target) + self._image_request = QNetworkRequest(url) + if self._manager is None: + self._manager = QNetworkAccessManager() + + self._image_reply = self._manager.get(self._image_request) + self._image_reply.downloadProgress.connect(self._onStreamDownloadProgress) + + @pyqtSlot() + def stop(self): + self._manager = None + + self._stream_buffer = b"" + self._stream_buffer_start_index = -1 + + if self._image_reply: + try: + # disconnect the signal + try: + self._image_reply.downloadProgress.disconnect(self._onStreamDownloadProgress) + except Exception: + pass + # abort the request if it's not finished + if not self._image_reply.isFinished(): + self._image_reply.close() + except Exception as e: # RuntimeError + pass # It can happen that the wrapped c++ object is already deleted. + + self._image_reply = None + self._image_request = None + + self._started = False + + def getImage(self): + return self._image + + def _onStreamDownloadProgress(self, bytes_received, bytes_total): + # An MJPG stream is (for our purpose) a stream of concatenated JPG images. + # JPG images start with the marker 0xFFD8, and end with 0xFFD9 + if self._image_reply is None: + return + self._stream_buffer += self._image_reply.readAll() + + if len(self._stream_buffer) > 2000000: # No single camera frame should be 2 Mb or larger + Logger.log("w", "MJPEG buffer exceeds reasonable size. Restarting stream...") + self.stop() # resets stream buffer and start index + self.start() + return + + if self._stream_buffer_start_index == -1: + self._stream_buffer_start_index = self._stream_buffer.indexOf(b'\xff\xd8') + stream_buffer_end_index = self._stream_buffer.lastIndexOf(b'\xff\xd9') + # If this happens to be more than a single frame, then so be it; the JPG decoder will + # ignore the extra data. We do it like this in order not to get a buildup of frames + + if self._stream_buffer_start_index != -1 and stream_buffer_end_index != -1: + jpg_data = self._stream_buffer[self._stream_buffer_start_index:stream_buffer_end_index + 2] + self._stream_buffer = self._stream_buffer[stream_buffer_end_index + 2:] + self._stream_buffer_start_index = -1 + self._image.loadFromData(jpg_data) + + self.newImage.emit() diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index cb2dc15ea0..aaf9b48968 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -22,6 +22,7 @@ class PrinterOutputModel(QObject): headPositionChanged = pyqtSignal() keyChanged = pyqtSignal() typeChanged = pyqtSignal() + cameraChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): super().__init__(parent) @@ -38,6 +39,17 @@ class PrinterOutputModel(QObject): self._type = "" + self._camera = None + + def setCamera(self, camera): + if self._camera is not camera: + self._camera = camera + self.cameraChanged.emit() + + @pyqtProperty(QObject, notify=cameraChanged) + def camera(self): + return self._camera + @pyqtProperty(str, notify = typeChanged) def type(self): return self._type diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 8114a3eef5..6403bdf14d 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -12,6 +12,7 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutp from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel +from cura.PrinterOutput.NetworkCamera import NetworkCamera from .ClusterUM3PrinterOutputController import ClusterUM3PrinterOutputController @@ -290,6 +291,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): if printer is None: printer = PrinterOutputModel(output_controller=ClusterUM3PrinterOutputController(self), number_of_extruders=self._number_of_extruders) + printer.setCamera(NetworkCamera("http://" + printer_data["ip_address"] + ":8080/?action=stream")) self._printers.append(printer) printer_list_changed = True diff --git a/plugins/UM3NetworkPrinting/PrinterVideoStream.qml b/plugins/UM3NetworkPrinting/PrinterVideoStream.qml index d0a9e08232..3e6f6a8fd8 100644 --- a/plugins/UM3NetworkPrinting/PrinterVideoStream.qml +++ b/plugins/UM3NetworkPrinting/PrinterVideoStream.qml @@ -32,7 +32,7 @@ Item width: 20 * screenScaleFactor height: 20 * screenScaleFactor - onClicked: OutputDevice.selectAutomaticPrinter() + onClicked: OutputDevice.setActivePrinter(null) style: ButtonStyle { @@ -65,17 +65,23 @@ Item { if(visible) { - OutputDevice.startCamera() + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + { + OutputDevice.activePrinter.camera.start() + } } else { - OutputDevice.stopCamera() + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + { + OutputDevice.activePrinter.camera.stop() + } } } source: { - if(OutputDevice.cameraImage) + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null && OutputDevice.activePrinter.camera.latestImage) { - return OutputDevice.cameraImage; + return OutputDevice.activePrinter.camera.latestImage; } return ""; } From ba782b346f75a0d802a0a52920d0517b60f6e5a6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 6 Dec 2017 16:41:07 +0100 Subject: [PATCH 087/551] Fixed re-requesting authentication CL-541 --- .../UM3NetworkPrinting/LegacyUM3OutputDevice.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index d89efc2acc..8de18443a7 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -2,6 +2,7 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutp from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel +from cura.PrinterOutput.NetworkCamera import NetworkCamera from cura.Settings.ContainerManager import ContainerManager from cura.Settings.ExtruderManager import ExtruderManager @@ -91,7 +92,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): title=i18n_catalog.i18nc("@info:title", "Authentication Status")) self._authentication_failed_message.addAction("Retry", i18n_catalog.i18nc("@action:button", "Retry"), None, i18n_catalog.i18nc("@info:tooltip", "Re-send the access request")) - self._authentication_failed_message.actionTriggered.connect(self._requestAuthentication) + self._authentication_failed_message.actionTriggered.connect(self._messageCallback) self._authentication_succeeded_message = Message( i18n_catalog.i18nc("@info:status", "Access to the printer accepted"), title=i18n_catalog.i18nc("@info:title", "Authentication Status")) @@ -102,7 +103,17 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._not_authenticated_message.addAction("Request", i18n_catalog.i18nc("@action:button", "Request Access"), None, i18n_catalog.i18nc("@info:tooltip", "Send access request to the printer")) - self._not_authenticated_message.actionTriggered.connect(self._requestAuthentication) + self._not_authenticated_message.actionTriggered.connect(self._messageCallback) + + def _messageCallback(self, message_id=None, action_id="Retry"): + if action_id == "Request" or action_id == "Retry": + if self._authentication_failed_message: + self._authentication_failed_message.hide() + if self._not_authenticated_message: + self._not_authenticated_message.hide() + + self._requestAuthentication() + pass # Cura Connect doesn't do any authorization def connect(self): super().connect() @@ -530,6 +541,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): if not self._printers: self._printers = [PrinterOutputModel(output_controller=self._output_controller, number_of_extruders=self._number_of_extruders)] + self._printers[0].setCamera(NetworkCamera("http://" + self._address + ":8080/?action=stream")) self.printersChanged.emit() # LegacyUM3 always has a single printer. From b3a3c1e371c7133d9f4a3f9e21271f60d304c182 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 6 Dec 2017 16:46:33 +0100 Subject: [PATCH 088/551] Camera image is now actually displayed for Legacy CL-541 --- .../LegacyUM3OutputDevice.py | 5 ++- plugins/UM3NetworkPrinting/MonitorItem.qml | 31 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 8de18443a7..5597e03d44 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -22,7 +22,7 @@ from .LegacyUM3PrinterOutputController import LegacyUM3PrinterOutputController from time import time import json - +import os i18n_catalog = i18nCatalog("cura") @@ -72,6 +72,9 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self.setIconName("print") + self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "MonitorItem.qml") + + self._output_controller = LegacyUM3PrinterOutputController(self) def _onAuthenticationStateChanged(self): diff --git a/plugins/UM3NetworkPrinting/MonitorItem.qml b/plugins/UM3NetworkPrinting/MonitorItem.qml index f69df41dd4..09e427ff6f 100644 --- a/plugins/UM3NetworkPrinting/MonitorItem.qml +++ b/plugins/UM3NetworkPrinting/MonitorItem.qml @@ -9,35 +9,32 @@ Component Image { id: cameraImage - property bool proportionalHeight: - { - if(sourceSize.height == 0 || maximumHeight == 0) - { - return true; - } - return (sourceSize.width / sourceSize.height) > (maximumWidth / maximumHeight); - } - property real _width: Math.floor(Math.min(maximumWidth, sourceSize.width)) - property real _height: Math.floor(Math.min(maximumHeight, sourceSize.height)) - width: proportionalHeight ? _width : Math.floor(sourceSize.width * _height / sourceSize.height) - height: !proportionalHeight ? _height : Math.floor(sourceSize.height * _width / sourceSize.width) + width: Math.min(sourceSize.width === 0 ? 800 * screenScaleFactor : sourceSize.width, maximumWidth) + height: Math.floor((sourceSize.height === 0 ? 600 * screenScaleFactor : sourceSize.height) * width / sourceSize.width) anchors.horizontalCenter: parent.horizontalCenter - + anchors.verticalCenter: parent.verticalCenter + z: 1 onVisibleChanged: { if(visible) { - OutputDevice.startCamera() + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + { + OutputDevice.activePrinter.camera.start() + } } else { - OutputDevice.stopCamera() + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + { + OutputDevice.activePrinter.camera.stop() + } } } source: { - if(OutputDevice.cameraImage) + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null && OutputDevice.activePrinter.camera.latestImage) { - return OutputDevice.cameraImage; + return OutputDevice.activePrinter.camera.latestImage; } return ""; } From 73bae3754416a2c22e4dd3cd6e7e51f75af62261 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 6 Dec 2017 16:58:41 +0100 Subject: [PATCH 089/551] Added missing string to verification failed Message CL-541 --- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 5597e03d44..384e51bfce 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -91,7 +91,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): title=i18n_catalog.i18nc("@info:title", "Authentication status")) - self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", ""), + self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", "Authentication failed"), title=i18n_catalog.i18nc("@info:title", "Authentication Status")) self._authentication_failed_message.addAction("Retry", i18n_catalog.i18nc("@action:button", "Retry"), None, i18n_catalog.i18nc("@info:tooltip", "Re-send the access request")) From 4ba551a3af5b9ff0240cbccfab8a160d46164220 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 6 Dec 2017 17:02:35 +0100 Subject: [PATCH 090/551] Prevent crash when switching away from monitor tab CL-541 --- cura/PrinterOutput/NetworkCamera.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py index 5cb76d2876..bffd318f41 100644 --- a/cura/PrinterOutput/NetworkCamera.py +++ b/cura/PrinterOutput/NetworkCamera.py @@ -59,7 +59,6 @@ class NetworkCamera(QObject): @pyqtSlot() def stop(self): - self._manager = None self._stream_buffer = b"" self._stream_buffer_start_index = -1 @@ -80,6 +79,8 @@ class NetworkCamera(QObject): self._image_reply = None self._image_request = None + self._manager = None + self._started = False def getImage(self): From a8695db1c898ae26821ef8280d382a0be10a7507 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 8 Dec 2017 10:44:05 +0100 Subject: [PATCH 091/551] Fixed displaying of icons in monitor stage tab CL-541 --- plugins/MonitorStage/MonitorStage.py | 47 ++++++++++++++++------------ 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index 0736f49858..21d5bb6cde 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -40,34 +40,41 @@ class MonitorStage(CuraStage): ## Find the correct status icon depending on the active output device state def _getActiveOutputDeviceStatusIcon(self): - output_device = Application.getInstance().getOutputDeviceManager().getActiveDevice() - - if not output_device: + # We assume that you are monitoring the device with the highest priority. + try: + output_device = Application.getInstance().getMachineManager().printerOutputDevices[0] + except IndexError: return "tab_status_unknown" - if hasattr(output_device, "acceptsCommands") and not output_device.acceptsCommands: + if not output_device.acceptsCommands: return "tab_status_unknown" - if not hasattr(output_device, "printerState") or not hasattr(output_device, "jobState"): - return "tab_status_unknown" - - # TODO: refactor to use enum instead of hardcoded strings? - if output_device.printerState == "maintenance": - return "tab_status_busy" - - if output_device.jobState in ["printing", "pre_print", "pausing", "resuming"]: - return "tab_status_busy" - - if output_device.jobState == "wait_cleanup": - return "tab_status_finished" - - if output_device.jobState in ["ready", ""]: + if output_device.activePrinter is None: return "tab_status_connected" - if output_device.jobState == "paused": + # TODO: refactor to use enum instead of hardcoded strings? + if output_device.activePrinter.state == "maintenance": + return "tab_status_busy" + + if output_device.state == "maintenance": + return "tab_status_busy" + + if output_device.activePrinter.activeJob is None: + return "tab_status_connected" + + if output_device.activePrinter.activeJob.state in ["printing", "pre_print", "pausing", "resuming"]: + return "tab_status_busy" + + if output_device.activePrinter.activeJob.state == "wait_cleanup": + return "tab_status_finished" + + if output_device.activePrinter.activeJob.state in ["ready", ""]: + return "tab_status_connected" + + if output_device.activePrinter.activeJob.state == "paused": return "tab_status_paused" - if output_device.jobState == "error": + if output_device.activePrinter.activeJob.state == "error": return "tab_status_stopped" return "tab_status_unknown" From 9ccd643f64cceb47e500cdf72fbe2dc2dfe46000 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 8 Dec 2017 14:36:53 +0100 Subject: [PATCH 092/551] Repaired the monitor icon not being updated CL-541 --- cura/PrinterOutputDevice.py | 2 +- cura/Settings/MachineManager.py | 3 +- plugins/MonitorStage/MonitorMainView.qml | 1 - plugins/MonitorStage/MonitorStage.py | 88 +++++++++++++++---- .../LegacyUM3OutputDevice.py | 9 +- 5 files changed, 76 insertions(+), 27 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 2126e791d3..91b981f3b6 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -143,7 +143,7 @@ class PrinterOutputDevice(QObject, OutputDevice): if self._accepts_commands != accepts_commands: self._accepts_commands = accepts_commands - self.acceptsCommandsChanged.emit() + self.acceptsCommandsChanged.emit() ## The current processing state of the backend. diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index c53fa15f1a..7920e89232 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -137,8 +137,7 @@ class MachineManager(QObject): printer_output_device.hotendIdChanged.disconnect(self._onHotendIdChanged) printer_output_device.materialIdChanged.disconnect(self._onMaterialIdChanged)''' - self._printer_output_devices.clear() - + self._printer_output_devices = [] for printer_output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): if isinstance(printer_output_device, PrinterOutputDevice): self._printer_output_devices.append(printer_output_device) diff --git a/plugins/MonitorStage/MonitorMainView.qml b/plugins/MonitorStage/MonitorMainView.qml index 038403e6d3..fad76cba30 100644 --- a/plugins/MonitorStage/MonitorMainView.qml +++ b/plugins/MonitorStage/MonitorMainView.qml @@ -16,7 +16,6 @@ Item color: UM.Theme.getColor("viewport_overlay") width: parent.width height: parent.height - visible: monitorViewComponent.sourceComponent == null ? 1 : 0 MouseArea { diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index 21d5bb6cde..ad63e65943 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -14,26 +14,79 @@ class MonitorStage(CuraStage): super().__init__(parent) # Wait until QML engine is created, otherwise creating the new QML components will fail - Application.getInstance().engineCreatedSignal.connect(self._setComponents) + Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) + self._printer_output_device = None - # Update the status icon when the output device is changed - Application.getInstance().getOutputDeviceManager().activeDeviceChanged.connect(self._setIconSource) + self._active_print_job = None + self._active_printer = None - def _setComponents(self): - self._setMainOverlay() - self._setSidebar() - self._setIconSource() + def _setActivePrintJob(self, print_job): + if self._active_print_job != print_job: + if self._active_print_job: + self._active_printer.stateChanged.disconnect(self._updateIconSource) + self._active_print_job = print_job + if self._active_print_job: + self._active_print_job.stateChanged.connect(self._updateIconSource) - def _setMainOverlay(self): + # Ensure that the right icon source is returned. + self._updateIconSource() + + def _setActivePrinter(self, printer): + if self._active_printer != printer: + if self._active_printer: + self._active_printer.activePrintJobChanged.disconnect(self._onActivePrintJobChanged) + self._active_printer = printer + if self._active_printer: + self._setActivePrintJob(self._active_printer.activePrintJob) + # Jobs might change, so we need to listen to it's changes. + self._active_printer.activePrintJobChanged.connect(self._onActivePrintJobChanged) + else: + self._setActivePrintJob(None) + + # Ensure that the right icon source is returned. + self._updateIconSource() + + def _onActivePrintJobChanged(self): + self._setActivePrintJob(self._active_printer.activePrintJob) + + def _onActivePrinterChanged(self): + self._setActivePrinter(self._printer_output_device.activePrinter) + + def _onOutputDevicesChanged(self): + try: + # We assume that you are monitoring the device with the highest priority. + new_output_device = Application.getInstance().getMachineManager().printerOutputDevices[0] + if new_output_device != self._printer_output_device: + if self._printer_output_device: + self._printer_output_device.acceptsCommandsChanged.disconnect(self._updateIconSource) + self._printer_output_device.printersChanged.disconnect(self._onActivePrinterChanged) + + self._printer_output_device = new_output_device + + self._printer_output_device.acceptsCommandsChanged.connect(self._updateIconSource) + self._printer_output_device.printersChanged.connect(self._onActivePrinterChanged) + self._setActivePrinter(self._printer_output_device.activePrinter) + + except IndexError: + pass + + def _onEngineCreated(self): + # We can only connect now, as we need to be sure that everything is loaded (plugins get created quite early) + Application.getInstance().getMachineManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) + self._updateMainOverlay() + self._updateSidebar() + self._updateIconSource() + + def _updateMainOverlay(self): main_component_path = os.path.join(PluginRegistry.getInstance().getPluginPath("MonitorStage"), "MonitorMainView.qml") self.addDisplayComponent("main", main_component_path) - def _setSidebar(self): + def _updateSidebar(self): # TODO: currently the sidebar component for prepare and monitor stages is the same, this will change with the printer output device refactor! sidebar_component_path = os.path.join(Resources.getPath(Application.getInstance().ResourceTypes.QmlFiles), "Sidebar.qml") self.addDisplayComponent("sidebar", sidebar_component_path) - def _setIconSource(self): + def _updateIconSource(self): if Application.getInstance().getTheme() is not None: icon_name = self._getActiveOutputDeviceStatusIcon() self.setIconSource(Application.getInstance().getTheme().getIcon(icon_name)) @@ -56,25 +109,22 @@ class MonitorStage(CuraStage): if output_device.activePrinter.state == "maintenance": return "tab_status_busy" - if output_device.state == "maintenance": - return "tab_status_busy" - - if output_device.activePrinter.activeJob is None: + if output_device.activePrinter.activePrintJob is None: return "tab_status_connected" - if output_device.activePrinter.activeJob.state in ["printing", "pre_print", "pausing", "resuming"]: + if output_device.activePrinter.activePrintJob.state in ["printing", "pre_print", "pausing", "resuming"]: return "tab_status_busy" - if output_device.activePrinter.activeJob.state == "wait_cleanup": + if output_device.activePrinter.activePrintJob.state == "wait_cleanup": return "tab_status_finished" - if output_device.activePrinter.activeJob.state in ["ready", ""]: + if output_device.activePrinter.activePrintJob.state in ["ready", ""]: return "tab_status_connected" - if output_device.activePrinter.activeJob.state == "paused": + if output_device.activePrinter.activePrintJob.state == "paused": return "tab_status_paused" - if output_device.activePrinter.activeJob.state == "error": + if output_device.activePrinter.activePrintJob.state == "error": return "tab_status_stopped" return "tab_status_unknown" diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 384e51bfce..268debbf7c 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -91,7 +91,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): title=i18n_catalog.i18nc("@info:title", "Authentication status")) - self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", "Authentication failed"), + self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", ""), title=i18n_catalog.i18nc("@info:title", "Authentication Status")) self._authentication_failed_message.addAction("Retry", i18n_catalog.i18nc("@action:button", "Retry"), None, i18n_catalog.i18nc("@info:tooltip", "Re-send the access request")) @@ -352,7 +352,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): return warnings - def _update(self): if not super()._update(): return @@ -401,10 +400,12 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_id = None self._authentication_key = None self.setAuthenticationState(AuthState.NotAuthenticated) - elif status_code == 403: + elif status_code == 403 and self._authentication_state != AuthState.Authenticated: + # If we were already authenticated, we probably got an older message back all of the sudden. Drop that. Logger.log("d", - "While trying to verify the authentication state, we got a forbidden response. Our own auth state was %s", + "While trying to verify the authentication state, we got a forbidden response. Our own auth state was %s. ", self._authentication_state) + print(reply.readAll()) self.setAuthenticationState(AuthState.AuthenticationDenied) self._authentication_failed_message.show() elif status_code == 200: From ae629e2968fbbd251c779db82a806e8432d4dd30 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 8 Dec 2017 14:59:14 +0100 Subject: [PATCH 093/551] Fixed camera for legacy UM3 printer again CL-541 --- cura/PrinterOutput/NetworkCamera.py | 1 - cura/PrinterOutputDevice.py | 1 - .../LegacyUM3OutputDevice.py | 1 - plugins/UM3NetworkPrinting/MonitorItem.qml | 48 ++++++++++++------- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py index bffd318f41..b81914ca7d 100644 --- a/cura/PrinterOutput/NetworkCamera.py +++ b/cura/PrinterOutput/NetworkCamera.py @@ -59,7 +59,6 @@ class NetworkCamera(QObject): @pyqtSlot() def stop(self): - self._stream_buffer = b"" self._stream_buffer_start_index = -1 diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 91b981f3b6..fdf9a77145 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -97,7 +97,6 @@ class PrinterOutputDevice(QObject, OutputDevice): # create the item (and fail) every time. if not self._monitor_component: self._createMonitorViewFromQML() - return self._monitor_item @pyqtProperty(QObject, constant=True) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 268debbf7c..c7fdf9bdc6 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -74,7 +74,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "MonitorItem.qml") - self._output_controller = LegacyUM3PrinterOutputController(self) def _onAuthenticationStateChanged(self): diff --git a/plugins/UM3NetworkPrinting/MonitorItem.qml b/plugins/UM3NetworkPrinting/MonitorItem.qml index 09e427ff6f..bbbc3feee6 100644 --- a/plugins/UM3NetworkPrinting/MonitorItem.qml +++ b/plugins/UM3NetworkPrinting/MonitorItem.qml @@ -6,37 +6,49 @@ import Cura 1.0 as Cura Component { - Image + Item { - id: cameraImage - width: Math.min(sourceSize.width === 0 ? 800 * screenScaleFactor : sourceSize.width, maximumWidth) - height: Math.floor((sourceSize.height === 0 ? 600 * screenScaleFactor : sourceSize.height) * width / sourceSize.width) - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - z: 1 - onVisibleChanged: + width: maximumWidth + height: maximumHeight + Image { - if(visible) + id: cameraImage + width: Math.min(sourceSize.width === 0 ? 800 * screenScaleFactor : sourceSize.width, maximumWidth) + height: Math.floor((sourceSize.height === 0 ? 600 * screenScaleFactor : sourceSize.height) * width / sourceSize.width) + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + z: 1 + Component.onCompleted: { if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) { OutputDevice.activePrinter.camera.start() } - } else + } + onVisibleChanged: { - if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + if(visible) { - OutputDevice.activePrinter.camera.stop() + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + { + OutputDevice.activePrinter.camera.start() + } + } else + { + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + { + OutputDevice.activePrinter.camera.stop() + } } } - } - source: - { - if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null && OutputDevice.activePrinter.camera.latestImage) + source: { - return OutputDevice.activePrinter.camera.latestImage; + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null && OutputDevice.activePrinter.camera.latestImage) + { + return OutputDevice.activePrinter.camera.latestImage; + } + return ""; } - return ""; } } } \ No newline at end of file From 1719a7b2fe53fe14a2eb68724692e5390dd326b0 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 8 Dec 2017 17:16:59 +0100 Subject: [PATCH 094/551] Fixed preheating for Legacy UM3 CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 20 ++++- plugins/MonitorStage/MonitorStage.py | 2 +- .../LegacyUM3OutputDevice.py | 12 ++- .../LegacyUM3PrinterOutputController.py | 63 ++++++++++++++++ resources/qml/PrinterOutput/HeatedBedBox.qml | 74 ++----------------- 5 files changed, 97 insertions(+), 74 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index aaf9b48968..0c30d8d788 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -16,6 +16,7 @@ if MYPY: class PrinterOutputModel(QObject): bedTemperatureChanged = pyqtSignal() targetBedTemperatureChanged = pyqtSignal() + isPreheatingChanged = pyqtSignal() stateChanged = pyqtSignal() activePrintJobChanged = pyqtSignal() nameChanged = pyqtSignal() @@ -24,7 +25,7 @@ class PrinterOutputModel(QObject): typeChanged = pyqtSignal() cameraChanged = pyqtSignal() - def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): + def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None, firmware_version = ""): super().__init__(parent) self._bed_temperature = -1 # Use -1 for no heated bed. self._target_bed_temperature = 0 @@ -34,18 +35,31 @@ class PrinterOutputModel(QObject): self._extruders = [ExtruderOutputModel(printer=self) for i in range(number_of_extruders)] self._head_position = Vector(0, 0, 0) self._active_print_job = None # type: Optional[PrintJobOutputModel] - + self._firmware_version = firmware_version self._printer_state = "unknown" - + self._is_preheating = False self._type = "" self._camera = None + @pyqtProperty(str, constant = True) + def firmwareVersion(self): + return self._firmware_version + def setCamera(self, camera): if self._camera is not camera: self._camera = camera self.cameraChanged.emit() + def updateIsPreheating(self, pre_heating): + if self._is_preheating != pre_heating: + self._is_preheating = pre_heating + self.isPreheatingChanged.emit() + + @pyqtProperty(bool, notify=isPreheatingChanged) + def isPreheating(self): + return self._is_preheating + @pyqtProperty(QObject, notify=cameraChanged) def camera(self): return self._camera diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index ad63e65943..f223ef1844 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -23,7 +23,7 @@ class MonitorStage(CuraStage): def _setActivePrintJob(self, print_job): if self._active_print_job != print_job: if self._active_print_job: - self._active_printer.stateChanged.disconnect(self._updateIconSource) + self._active_print_job.stateChanged.disconnect(self._updateIconSource) self._active_print_job = print_job if self._active_print_job: self._active_print_job.stateChanged.connect(self._updateIconSource) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index c7fdf9bdc6..967c99995e 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -543,7 +543,9 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): return if not self._printers: - self._printers = [PrinterOutputModel(output_controller=self._output_controller, number_of_extruders=self._number_of_extruders)] + # Quickest way to get the firmware version is to grab it from the zeroconf. + firmware_version = self._properties.get(b"firmware_version", b"").decode("utf-8") + self._printers = [PrinterOutputModel(output_controller=self._output_controller, number_of_extruders=self._number_of_extruders, firmware_version=firmware_version)] self._printers[0].setCamera(NetworkCamera("http://" + self._address + ":8080/?action=stream")) self.printersChanged.emit() @@ -553,6 +555,14 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): printer.updateTargetBedTemperature(result["bed"]["temperature"]["target"]) printer.updateState(result["status"]) + try: + # If we're still handling the request, we should ignore remote for a bit. + if not printer.getController().isPreheatRequestInProgress(): + printer.updateIsPreheating(result["bed"]["pre_heat"]["active"]) + except KeyError: + # Older firmwares don't support preheating, so we need to fake it. + pass + head_position = result["heads"][0]["position"] printer.updateHeadPosition(head_position["x"], head_position["y"], head_position["z"]) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py index 54c126e5cc..c476673353 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py @@ -2,6 +2,8 @@ # Cura is released under the terms of the LGPLv3 or higher. from cura.PrinterOutput.PrinterOutputController import PrinterOutputController +from PyQt5.QtCore import QTimer +from UM.Version import Version MYPY = False if MYPY: @@ -12,11 +14,33 @@ if MYPY: class LegacyUM3PrinterOutputController(PrinterOutputController): def __init__(self, output_device): super().__init__(output_device) + self._preheat_bed_timer = QTimer() + self._preheat_bed_timer.setSingleShot(True) + self._preheat_bed_timer.timeout.connect(self._onPreheatBedTimerFinished) + self._preheat_printer = None + # Are we still waiting for a response about preheat? + # We need this so we can already update buttons, so it feels more snappy. + self._preheat_request_in_progress = False + + def isPreheatRequestInProgress(self): + return self._preheat_request_in_progress def setJobState(self, job: "PrintJobOutputModel", state: str): data = "{\"target\": \"%s\"}" % state self._output_device.put("print_job/state", data, onFinished=None) + def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int): + data = str(temperature) + self._output_device.put("printer/bed/temperature/target", data, onFinished=self._onPutBedTemperatureCompleted) + + def _onPutBedTemperatureCompleted(self, reply): + if Version(self._preheat_printer.firmwareVersion) < Version("3.5.92"): + # If it was handling a preheat, it isn't anymore. + self._preheat_request_in_progress = False + + def _onPutPreheatBedCompleted(self, reply): + self._preheat_request_in_progress = False + def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): head_pos = printer._head_position new_x = head_pos.x + x @@ -27,3 +51,42 @@ class LegacyUM3PrinterOutputController(PrinterOutputController): def homeBed(self, printer): self._output_device.put("printer/heads/0/position/z", "0", onFinished=None) + + def _onPreheatBedTimerFinished(self): + self.setTargetBedTemperature(self._preheat_printer, 0) + self._preheat_printer.updateIsPreheating(False) + self._preheat_request_in_progress = True + + def cancelPreheatBed(self, printer: "PrinterOutputModel"): + self.preheatBed(printer, temperature=0, duration=0) + self._preheat_bed_timer.stop() + printer.updateIsPreheating(False) + + def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): + try: + temperature = round(temperature) # The API doesn't allow floating point. + duration = round(duration) + except ValueError: + return # Got invalid values, can't pre-heat. + + if duration > 0: + data = """{"temperature": "%i", "timeout": "%i"}""" % (temperature, duration) + else: + data = """{"temperature": "%i"}""" % temperature + + # Real bed pre-heating support is implemented from 3.5.92 and up. + + if Version(printer.firmwareVersion) < Version("3.5.92"): + # No firmware-side duration support then, so just set target bed temp and set a timer. + self.setTargetBedTemperature(printer, temperature=temperature) + self._preheat_bed_timer.setInterval(duration * 1000) + self._preheat_bed_timer.start() + self._preheat_printer = printer + printer.updateIsPreheating(True) + return + + self._output_device.put("printer/bed/pre_heat", data, onFinished = self._onPutPreheatBedCompleted) + printer.updateIsPreheating(True) + self._preheat_request_in_progress = True + + diff --git a/resources/qml/PrinterOutput/HeatedBedBox.qml b/resources/qml/PrinterOutput/HeatedBedBox.qml index 5f09160708..65c2a161bd 100644 --- a/resources/qml/PrinterOutput/HeatedBedBox.qml +++ b/resources/qml/PrinterOutput/HeatedBedBox.qml @@ -136,15 +136,6 @@ Item color: UM.Theme.getColor("setting_control_highlight") opacity: preheatTemperatureControl.hovered ? 1.0 : 0 } - Label //Maximum temperature indication. - { - text: (bedTemperature.properties.maximum_value != "None" ? bedTemperature.properties.maximum_value : "") + "°C" - color: UM.Theme.getColor("setting_unit") - font: UM.Theme.getFont("default") - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width - anchors.verticalCenter: parent.verticalCenter - } MouseArea //Change cursor on hovering. { id: preheatTemperatureInputMouseArea @@ -204,58 +195,6 @@ Item } } - UM.RecolorImage - { - id: preheatCountdownIcon - width: UM.Theme.getSize("save_button_specs_icons").width - height: UM.Theme.getSize("save_button_specs_icons").height - sourceSize.width: width - sourceSize.height: height - color: UM.Theme.getColor("text") - visible: preheatCountdown.visible - source: UM.Theme.getIcon("print_time") - anchors.right: preheatCountdown.left - anchors.rightMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) - anchors.verticalCenter: preheatCountdown.verticalCenter - } - - Timer - { - id: preheatUpdateTimer - interval: 100 //Update every 100ms. You want to update every 1s, but then you have one timer for the updating running out of sync with the actual date timer and you might skip seconds. - running: printerModel != null && printerModel.preheatBedRemainingTime != "" - repeat: true - onTriggered: update() - property var endTime: new Date() //Set initial endTime to be the current date, so that the endTime has initially already passed and the timer text becomes invisible if you were to update. - function update() - { - if(printerModel != null && !printerModel.canPreHeatBed) - { - return // Nothing to do, printer cant preheat at all! - } - preheatCountdown.text = "" - if (printerModel != null && connectedPrinter.preheatBedRemainingTime != null) - { - preheatCountdown.text = connectedPrinter.preheatBedRemainingTime; - } - if (preheatCountdown.text == "") //Either time elapsed or not connected. - { - stop(); - } - } - } - Label - { - id: preheatCountdown - text: printerModel != null ? printerModel.preheatBedRemainingTime : "" - visible: text != "" //Has no direct effect, but just so that we can link visibility of clock icon to visibility of the countdown text. - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - anchors.right: preheatButton.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: preheatButton.verticalCenter - } - Button //The pre-heat button. { id: preheatButton @@ -267,9 +206,9 @@ Item { return false; //Not connected, not authenticated or printer is busy. } - if (preheatUpdateTimer.running) + if (printerModel.isPreheating) { - return true; //Can always cancel if the timer is running. + return true; } if (bedTemperature.properties.minimum_value != "None" && Math.floor(preheatTemperatureInput.text) < Math.floor(bedTemperature.properties.minimum_value)) { @@ -363,23 +302,20 @@ Item } } font: UM.Theme.getFont("action_button") - text: preheatUpdateTimer.running ? catalog.i18nc("@button Cancel pre-heating", "Cancel") : catalog.i18nc("@button", "Pre-heat") + text: printerModel.isPreheating ? catalog.i18nc("@button Cancel pre-heating", "Cancel") : catalog.i18nc("@button", "Pre-heat") } } } onClicked: { - if (!preheatUpdateTimer.running) + if (!printerModel.isPreheating) { - printerModel.preheatBed(preheatTemperatureInput.text, printerModel.preheatBedTimeout); - preheatUpdateTimer.start(); - preheatUpdateTimer.update(); //Update once before the first timer is triggered. + printerModel.preheatBed(preheatTemperatureInput.text, 900); } else { printerModel.cancelPreheatBed(); - preheatUpdateTimer.update(); } } From 6ad82ee1b04b1e3c83faf6d3eba26d25fcbfdfd6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 8 Dec 2017 17:32:22 +0100 Subject: [PATCH 095/551] Added missing name & description for ClusterOutputDevice CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 6403bdf14d..ba82da64c3 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -62,6 +62,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._active_printer = None # type: Optional[PrinterOutputModel] + self.setPriority(3) # Make sure the output device gets selected above local file output + self.setName(self._id) + self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) + self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network")) + @pyqtProperty(QObject, notify=activePrinterChanged) def controlItem(self): if self._active_printer is None: From 948301c531e776dc0fdf82659153ddaab64dd22c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 12 Dec 2017 09:28:42 +0100 Subject: [PATCH 096/551] Remove duplicate setting definition I think this was a merge conflict. Contributes to issue CURA-4523. --- resources/definitions/fdmprinter.def.json | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 46991dd6e6..fcd73bdf00 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4226,16 +4226,6 @@ "limit_to_extruder": "support_infill_extruder_nr", "enabled": "support_enable and support_use_towers", "settable_per_mesh": true - }, - "remove_empty_first_layers": - { - "label": "Remove Empty First Layers", - "description": "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle.", - "type": "bool", - "default_value": true, - "enabled": "not support_enable and not support_tree_enable", - "settable_per_mesh": false, - "settable_per_extruder": false } } }, From 8bc9663294c7253f0bea512e16011b573dc47688 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 12 Dec 2017 10:28:55 +0100 Subject: [PATCH 097/551] Removed old & unused code CL-541 --- .../NetworkClusterPrinterOutputDevice.py | 716 --------- .../NetworkPrinterOutputDevice.py | 1306 ----------------- .../NetworkPrinterOutputDevicePlugin.py | 357 ----- plugins/UM3NetworkPrinting/__init__.py | 4 +- 4 files changed, 2 insertions(+), 2381 deletions(-) delete mode 100644 plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py delete mode 100755 plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py delete mode 100644 plugins/UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py deleted file mode 100644 index 853ef72f72..0000000000 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ /dev/null @@ -1,716 +0,0 @@ -import datetime -import getpass -import gzip -import json -import os -import os.path -import time - -from enum import Enum -from PyQt5.QtNetwork import QNetworkRequest, QHttpPart, QHttpMultiPart -from PyQt5.QtCore import QUrl, pyqtSlot, pyqtProperty, QCoreApplication, QTimer, pyqtSignal, QObject -from PyQt5.QtGui import QDesktopServices -from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply -from UM.Application import Application -from UM.Logger import Logger -from UM.Message import Message -from UM.OutputDevice import OutputDeviceError -from UM.i18n import i18nCatalog -from UM.Qt.Duration import Duration, DurationFormat -from UM.PluginRegistry import PluginRegistry - -from . import NetworkPrinterOutputDevice - - -i18n_catalog = i18nCatalog("cura") - - -class OutputStage(Enum): - ready = 0 - uploading = 2 - - -class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinterOutputDevice): - printJobsChanged = pyqtSignal() - printersChanged = pyqtSignal() - selectedPrinterChanged = pyqtSignal() - - def __init__(self, key, address, properties, api_prefix): - super().__init__(key, address, properties, api_prefix) - # Store the address of the master. - self._master_address = address - name_property = properties.get(b"name", b"") - if name_property: - name = name_property.decode("utf-8") - else: - name = key - - self._authentication_state = NetworkPrinterOutputDevice.AuthState.Authenticated # The printer is always authenticated - - self.setName(name) - description = i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network") - self.setShortDescription(description) - self.setDescription(description) - - self._stage = OutputStage.ready - host_override = os.environ.get("CLUSTER_OVERRIDE_HOST", "") - if host_override: - Logger.log( - "w", - "Environment variable CLUSTER_OVERRIDE_HOST is set to [%s], cluster hosts are now set to this host", - host_override) - self._host = "http://" + host_override - else: - self._host = "http://" + address - - # is the same as in NetworkPrinterOutputDevicePlugin - self._cluster_api_version = "1" - self._cluster_api_prefix = "/cluster-api/v" + self._cluster_api_version + "/" - self._api_base_uri = self._host + self._cluster_api_prefix - - self._file_name = None - self._progress_message = None - self._request = None - self._reply = None - - # The main reason to keep the 'multipart' form data on the object - # is to prevent the Python GC from claiming it too early. - self._multipart = None - - self._print_view = None - self._request_job = [] - - self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterMonitorItem.qml") - self._control_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterControlItem.qml") - - self._print_jobs = [] - self._print_job_by_printer_uuid = {} - self._print_job_by_uuid = {} # Print jobs by their own uuid - self._printers = [] - self._printers_dict = {} # by unique_name - - self._connected_printers_type_count = [] - self._automatic_printer = {"unique_name": "", "friendly_name": "Automatic"} # empty unique_name IS automatic selection - self._selected_printer = self._automatic_printer - - self._cluster_status_update_timer = QTimer() - self._cluster_status_update_timer.setInterval(5000) - self._cluster_status_update_timer.setSingleShot(False) - self._cluster_status_update_timer.timeout.connect(self._requestClusterStatus) - - self._can_pause = True - self._can_abort = True - self._can_pre_heat_bed = False - self._can_control_manually = False - self._cluster_size = int(properties.get(b"cluster_size", 0)) - - self._cleanupRequest() - - #These are texts that are to be translated for future features. - temporary_translation = i18n_catalog.i18n("This printer is not set up to host a group of connected Ultimaker 3 printers.") - temporary_translation2 = i18n_catalog.i18nc("Count is number of printers.", "This printer is the host for a group of {count} connected Ultimaker 3 printers.").format(count = 3) - temporary_translation3 = i18n_catalog.i18n("{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate.") #When finished. - temporary_translation4 = i18n_catalog.i18n("{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing.") #When configuration changed. - - ## No authentication, so requestAuthentication should do exactly nothing - @pyqtSlot() - def requestAuthentication(self, message_id = None, action_id = "Retry"): - pass # Cura Connect doesn't do any authorization - - def setAuthenticationState(self, auth_state): - self._authentication_state = NetworkPrinterOutputDevice.AuthState.Authenticated # The printer is always authenticated - - def _verifyAuthentication(self): - pass - - def _checkAuthentication(self): - Logger.log("d", "_checkAuthentication Cura Connect - nothing to be done") - - @pyqtProperty(QObject, notify=selectedPrinterChanged) - def controlItem(self): - # TODO: Probably not the nicest way to do this. This needs to be done better at some point in time. - if not self._control_item: - self._createControlViewFromQML() - name = self._selected_printer.get("friendly_name") - if name == self._automatic_printer.get("friendly_name") or name == "": - return self._control_item - # Let cura use the default. - return None - - @pyqtSlot(int, result = str) - def getTimeCompleted(self, time_remaining): - current_time = time.time() - datetime_completed = datetime.datetime.fromtimestamp(current_time + time_remaining) - return "{hour:02d}:{minute:02d}".format(hour = datetime_completed.hour, minute = datetime_completed.minute) - - @pyqtSlot(int, result = str) - def getDateCompleted(self, time_remaining): - current_time = time.time() - datetime_completed = datetime.datetime.fromtimestamp(current_time + time_remaining) - return (datetime_completed.strftime("%a %b ") + "{day}".format(day=datetime_completed.day)).upper() - - @pyqtProperty(int, constant = True) - def clusterSize(self): - return self._cluster_size - - @pyqtProperty(str, notify=selectedPrinterChanged) - def name(self): - # Show the name of the selected printer. - # This is not the nicest way to do this, but changes to the Cura UI are required otherwise. - name = self._selected_printer.get("friendly_name") - if name != self._automatic_printer.get("friendly_name"): - return name - # Return name of cluster master. - return self._properties.get(b"name", b"").decode("utf-8") - - def connect(self): - super().connect() - self._cluster_status_update_timer.start() - - def close(self): - super().close() - self._cluster_status_update_timer.stop() - - def _setJobState(self, job_state): - if not self._selected_printer: - return - - selected_printer_uuid = self._printers_dict[self._selected_printer["unique_name"]]["uuid"] - if selected_printer_uuid not in self._print_job_by_printer_uuid: - return - - print_job_uuid = self._print_job_by_printer_uuid[selected_printer_uuid]["uuid"] - - url = QUrl(self._api_base_uri + "print_jobs/" + print_job_uuid + "/action") - put_request = QNetworkRequest(url) - put_request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") - data = '{"action": "' + job_state + '"}' - self._manager.put(put_request, data.encode()) - - def _requestClusterStatus(self): - # TODO: Handle timeout. We probably want to know if the cluster is still reachable or not. - url = QUrl(self._api_base_uri + "printers/") - printers_request = QNetworkRequest(url) - self._addUserAgentHeader(printers_request) - self._manager.get(printers_request) - # See _finishedPrintersRequest() - - if self._printers: # if printers is not empty - url = QUrl(self._api_base_uri + "print_jobs/") - print_jobs_request = QNetworkRequest(url) - self._addUserAgentHeader(print_jobs_request) - self._manager.get(print_jobs_request) - # See _finishedPrintJobsRequest() - - def _finishedPrintJobsRequest(self, reply): - try: - json_data = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid print job state message: Not valid JSON.") - return - self.setPrintJobs(json_data) - - def _finishedPrintersRequest(self, reply): - try: - json_data = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid print job state message: Not valid JSON.") - return - self.setPrinters(json_data) - - def materialHotendChangedMessage(self, callback): - # When there is just one printer, the activate configuration option is enabled - if (self._cluster_size == 1): - super().materialHotendChangedMessage(callback = callback) - - def _startCameraStream(self): - ## Request new image - url = QUrl("http://" + self._printers_dict[self._selected_printer["unique_name"]]["ip_address"] + ":8080/?action=stream") - self._image_request = QNetworkRequest(url) - self._addUserAgentHeader(self._image_request) - self._image_reply = self._manager.get(self._image_request) - self._image_reply.downloadProgress.connect(self._onStreamDownloadProgress) - - def spawnPrintView(self): - if self._print_view is None: - path = os.path.join(self._plugin_path, "PrintWindow.qml") - self._print_view = Application.getInstance().createQmlComponent(path, {"OutputDevice", self}) - if self._print_view is not None: - self._print_view.show() - - ## Store job info, show Print view for settings - def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): - self._selected_printer = self._automatic_printer # reset to default option - self._request_job = [nodes, file_name, filter_by_machine, file_handler, kwargs] - - if self._stage != OutputStage.ready: - if self._error_message: - self._error_message.hide() - self._error_message = Message( - i18n_catalog.i18nc("@info:status", - "Sending new jobs (temporarily) blocked, still sending the previous print job.")) - self._error_message.show() - return - - self.writeStarted.emit(self) # Allow postprocessing before sending data to the printer - - if len(self._printers) > 1: - self.spawnPrintView() # Ask user how to print it. - elif len(self._printers) == 1: - # If there is only one printer, don't bother asking. - self.selectAutomaticPrinter() - self.sendPrintJob() - else: - # Cluster has no printers, warn the user of this. - if self._error_message: - self._error_message.hide() - self._error_message = Message( - i18n_catalog.i18nc("@info:status", - "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers.")) - self._error_message.show() - - ## Actually send the print job, called from the dialog - # :param: require_printer_name: name of printer, or "" - @pyqtSlot() - def sendPrintJob(self): - nodes, file_name, filter_by_machine, file_handler, kwargs = self._request_job - require_printer_name = self._selected_printer["unique_name"] - - self._send_gcode_start = time.time() - Logger.log("d", "Sending print job [%s] to host..." % file_name) - - if self._stage != OutputStage.ready: - Logger.log("d", "Unable to send print job as the state is %s", self._stage) - raise OutputDeviceError.DeviceBusyError() - self._stage = OutputStage.uploading - - self._file_name = "%s.gcode.gz" % file_name - self._showProgressMessage() - - new_request = self._buildSendPrintJobHttpRequest(require_printer_name) - if new_request is None or self._stage != OutputStage.uploading: - return - self._request = new_request - self._reply = self._manager.post(self._request, self._multipart) - self._reply.uploadProgress.connect(self._onUploadProgress) - # See _finishedPostPrintJobRequest() - - def _buildSendPrintJobHttpRequest(self, require_printer_name): - api_url = QUrl(self._api_base_uri + "print_jobs/") - request = QNetworkRequest(api_url) - # Create multipart request and add the g-code. - self._multipart = QHttpMultiPart(QHttpMultiPart.FormDataType) - - # Add gcode - part = QHttpPart() - part.setHeader(QNetworkRequest.ContentDispositionHeader, - 'form-data; name="file"; filename="%s"' % self._file_name) - - gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list") - compressed_gcode = self._compressGcode(gcode) - if compressed_gcode is None: - return None # User aborted print, so stop trying. - - part.setBody(compressed_gcode) - self._multipart.append(part) - - # require_printer_name "" means automatic - if require_printer_name: - self._multipart.append(self.__createKeyValueHttpPart("require_printer_name", require_printer_name)) - user_name = self.__get_username() - if user_name is None: - user_name = "unknown" - self._multipart.append(self.__createKeyValueHttpPart("owner", user_name)) - - self._addUserAgentHeader(request) - return request - - def _compressGcode(self, gcode): - self._compressing_print = True - batched_line = "" - max_chars_per_line = int(1024 * 1024 / 4) # 1 / 4 MB - - byte_array_file_data = b"" - - def _compressDataAndNotifyQt(data_to_append): - compressed_data = gzip.compress(data_to_append.encode("utf-8")) - self._progress_message.setProgress(-1) # Tickle the message so that it's clear that it's still being used. - QCoreApplication.processEvents() # Ensure that the GUI does not freeze. - # Pretend that this is a response, as zipping might take a bit of time. - self._last_response_time = time.time() - return compressed_data - - if gcode is None: - Logger.log("e", "Unable to find sliced gcode, returning empty.") - return byte_array_file_data - - for line in gcode: - if not self._compressing_print: - self._progress_message.hide() - return None # Stop trying to zip, abort was called. - batched_line += line - # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. - # Compressing line by line in this case is extremely slow, so we need to batch them. - if len(batched_line) < max_chars_per_line: - continue - byte_array_file_data += _compressDataAndNotifyQt(batched_line) - batched_line = "" - - # Also compress the leftovers. - if batched_line: - byte_array_file_data += _compressDataAndNotifyQt(batched_line) - - return byte_array_file_data - - def __createKeyValueHttpPart(self, key, value): - metadata_part = QHttpPart() - metadata_part.setHeader(QNetworkRequest.ContentTypeHeader, 'text/plain') - metadata_part.setHeader(QNetworkRequest.ContentDispositionHeader, 'form-data; name="%s"' % (key)) - metadata_part.setBody(bytearray(value, "utf8")) - return metadata_part - - def __get_username(self): - try: - return getpass.getuser() - except: - Logger.log("d", "Could not get the system user name, returning 'unknown' instead.") - return None - - def _finishedPrintJobPostRequest(self, reply): - self._stage = OutputStage.ready - if self._progress_message: - self._progress_message.hide() - self._progress_message = None - self.writeFinished.emit(self) - - if reply.error(): - self._showRequestFailedMessage(reply) - self.writeError.emit(self) - else: - self._showRequestSucceededMessage() - self.writeSuccess.emit(self) - - self._cleanupRequest() - - def _showRequestFailedMessage(self, reply): - if reply is not None: - Logger.log("w", "Unable to send print job to group {cluster_name}: {error_string} ({error})".format( - cluster_name = self.getName(), - error_string = str(reply.errorString()), - error = str(reply.error()))) - error_message_template = i18n_catalog.i18nc("@info:status", "Unable to send print job to group {cluster_name}.") - message = Message(text=error_message_template.format( - cluster_name = self.getName())) - message.show() - - def _showRequestSucceededMessage(self): - confirmation_message_template = i18n_catalog.i18nc( - "@info:status", - "Sent {file_name} to group {cluster_name}." - ) - file_name = os.path.basename(self._file_name).split(".")[0] - message_text = confirmation_message_template.format(cluster_name = self.getName(), file_name = file_name) - message = Message(text=message_text) - button_text = i18n_catalog.i18nc("@action:button", "Show print jobs") - button_tooltip = i18n_catalog.i18nc("@info:tooltip", "Opens the print jobs interface in your browser.") - message.addAction("open_browser", button_text, "globe", button_tooltip) - message.actionTriggered.connect(self._onMessageActionTriggered) - message.show() - - def setPrintJobs(self, print_jobs): - #TODO: hack, last seen messes up the check, so drop it. - for job in print_jobs: - del job["last_seen"] - # Strip any extensions - job["name"] = self._removeGcodeExtension(job["name"]) - - if self._print_jobs != print_jobs: - old_print_jobs = self._print_jobs - self._print_jobs = print_jobs - - self._notifyFinishedPrintJobs(old_print_jobs, print_jobs) - self._notifyConfigurationChangeRequired(old_print_jobs, print_jobs) - - # Yes, this is a hacky way of doing it, but it's quick and the API doesn't give the print job per printer - # for some reason. ugh. - self._print_job_by_printer_uuid = {} - self._print_job_by_uuid = {} - for print_job in print_jobs: - if "printer_uuid" in print_job and print_job["printer_uuid"] is not None: - self._print_job_by_printer_uuid[print_job["printer_uuid"]] = print_job - self._print_job_by_uuid[print_job["uuid"]] = print_job - self.printJobsChanged.emit() - - def _removeGcodeExtension(self, name): - parts = name.split(".") - if parts[-1].upper() == "GZ": - parts = parts[:-1] - if parts[-1].upper() == "GCODE": - parts = parts[:-1] - return ".".join(parts) - - def _notifyFinishedPrintJobs(self, old_print_jobs, new_print_jobs): - """Notify the user when any of their print jobs have just completed. - - Arguments: - - old_print_jobs -- the previous list of print job status information as returned by the cluster REST API. - new_print_jobs -- the current list of print job status information as returned by the cluster REST API. - """ - if old_print_jobs is None: - return - - username = self.__get_username() - if username is None: - return - - our_old_print_jobs = self.__filterOurPrintJobs(old_print_jobs) - our_old_not_finished_print_jobs = [pj for pj in our_old_print_jobs if pj["status"] != "wait_cleanup"] - - our_new_print_jobs = self.__filterOurPrintJobs(new_print_jobs) - our_new_finished_print_jobs = [pj for pj in our_new_print_jobs if pj["status"] == "wait_cleanup"] - - old_not_finished_print_job_uuids = set([pj["uuid"] for pj in our_old_not_finished_print_jobs]) - - for print_job in our_new_finished_print_jobs: - if print_job["uuid"] in old_not_finished_print_job_uuids: - - printer_name = self.__getPrinterNameFromUuid(print_job["printer_uuid"]) - if printer_name is None: - printer_name = i18n_catalog.i18nc("@label Printer name", "Unknown") - - message_text = (i18n_catalog.i18nc("@info:status", - "Printer '{printer_name}' has finished printing '{job_name}'.") - .format(printer_name=printer_name, job_name=print_job["name"])) - message = Message(text=message_text, title=i18n_catalog.i18nc("@info:status", "Print finished")) - Application.getInstance().showMessage(message) - Application.getInstance().showToastMessage( - i18n_catalog.i18nc("@info:status", "Print finished"), - message_text) - - def __filterOurPrintJobs(self, print_jobs): - username = self.__get_username() - return [print_job for print_job in print_jobs if print_job["owner"] == username] - - def _notifyConfigurationChangeRequired(self, old_print_jobs, new_print_jobs): - if old_print_jobs is None: - return - - old_change_required_print_jobs = self.__filterConfigChangePrintJobs(self.__filterOurPrintJobs(old_print_jobs)) - new_change_required_print_jobs = self.__filterConfigChangePrintJobs(self.__filterOurPrintJobs(new_print_jobs)) - old_change_required_print_job_uuids = set([pj["uuid"] for pj in old_change_required_print_jobs]) - - for print_job in new_change_required_print_jobs: - if print_job["uuid"] not in old_change_required_print_job_uuids: - - printer_name = self.__getPrinterNameFromUuid(print_job["assigned_to"]) - if printer_name is None: - # don't report on yet unknown printers - continue - - message_text = (i18n_catalog.i18n("{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing.") - .format(printer_name=printer_name, job_name=print_job["name"])) - message = Message(text=message_text, title=i18n_catalog.i18nc("@label:status", "Action required")) - Application.getInstance().showMessage(message) - Application.getInstance().showToastMessage( - i18n_catalog.i18nc("@label:status", "Action required"), - message_text) - - def __filterConfigChangePrintJobs(self, print_jobs): - return filter(self.__isConfigurationChangeRequiredPrintJob, print_jobs) - - def __isConfigurationChangeRequiredPrintJob(self, print_job): - if print_job["status"] == "queued": - changes_required = print_job.get("configuration_changes_required", []) - return len(changes_required) != 0 - return False - - def __getPrinterNameFromUuid(self, printer_uuid): - for printer in self._printers: - if printer["uuid"] == printer_uuid: - return printer["friendly_name"] - return None - - def setPrinters(self, printers): - if self._printers != printers: - self._connected_printers_type_count = [] - printers_count = {} - self._printers = printers - self._printers_dict = dict((p["unique_name"], p) for p in printers) # for easy lookup by unique_name - - for printer in printers: - variant = printer["machine_variant"] - if variant in printers_count: - printers_count[variant] += 1 - else: - printers_count[variant] = 1 - for type in printers_count: - self._connected_printers_type_count.append({"machine_type": type, "count": printers_count[type]}) - self.printersChanged.emit() - - @pyqtProperty("QVariantList", notify=printersChanged) - def connectedPrintersTypeCount(self): - return self._connected_printers_type_count - - @pyqtProperty("QVariantList", notify=printersChanged) - def connectedPrinters(self): - return self._printers - - @pyqtProperty(int, notify=printJobsChanged) - def numJobsPrinting(self): - num_jobs_printing = 0 - for job in self._print_jobs: - if job["status"] in ["printing", "wait_cleanup", "sent_to_printer", "pre_print", "post_print"]: - num_jobs_printing += 1 - return num_jobs_printing - - @pyqtProperty(int, notify=printJobsChanged) - def numJobsQueued(self): - num_jobs_queued = 0 - for job in self._print_jobs: - if job["status"] == "queued": - num_jobs_queued += 1 - return num_jobs_queued - - @pyqtProperty("QVariantMap", notify=printJobsChanged) - def printJobsByUUID(self): - return self._print_job_by_uuid - - @pyqtProperty("QVariantMap", notify=printJobsChanged) - def printJobsByPrinterUUID(self): - return self._print_job_by_printer_uuid - - @pyqtProperty("QVariantList", notify=printJobsChanged) - def printJobs(self): - return self._print_jobs - - @pyqtProperty("QVariantList", notify=printersChanged) - def printers(self): - return [self._automatic_printer, ] + self._printers - - @pyqtSlot(str, str) - def selectPrinter(self, unique_name, friendly_name): - self.stopCamera() - self._selected_printer = {"unique_name": unique_name, "friendly_name": friendly_name} - Logger.log("d", "Selected printer: %s %s", friendly_name, unique_name) - # TODO: Probably not the nicest way to do this. This needs to be done better at some point in time. - if unique_name == "": - self._address = self._master_address - else: - self._address = self._printers_dict[self._selected_printer["unique_name"]]["ip_address"] - - self.selectedPrinterChanged.emit() - - def _updateJobState(self, job_state): - name = self._selected_printer.get("friendly_name") - if name == "" or name == "Automatic": - # TODO: This is now a bit hacked; If no printer is selected, don't show job state. - if self._job_state != "": - self._job_state = "" - self.jobStateChanged.emit() - else: - if self._job_state != job_state: - self._job_state = job_state - self.jobStateChanged.emit() - - @pyqtSlot() - def selectAutomaticPrinter(self): - self.stopCamera() - self._selected_printer = self._automatic_printer - self.selectedPrinterChanged.emit() - - @pyqtProperty("QVariant", notify=selectedPrinterChanged) - def selectedPrinterName(self): - return self._selected_printer.get("unique_name", "") - - def getPrintJobsUrl(self): - return self._host + "/print_jobs" - - def getPrintersUrl(self): - return self._host + "/printers" - - def _showProgressMessage(self): - progress_message_template = i18n_catalog.i18nc("@info:progress", - "Sending {file_name} to group {cluster_name}") - file_name = os.path.basename(self._file_name).split(".")[0] - self._progress_message = Message(progress_message_template.format(file_name = file_name, cluster_name = self.getName()), 0, False, -1) - self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "") - self._progress_message.actionTriggered.connect(self._onMessageActionTriggered) - self._progress_message.show() - - def _addUserAgentHeader(self, request): - request.setRawHeader(b"User-agent", b"CuraPrintClusterOutputDevice Plugin") - - def _cleanupRequest(self): - self._request = None - self._stage = OutputStage.ready - self._file_name = None - - def _onFinished(self, reply): - super()._onFinished(reply) - reply_url = reply.url().toString() - status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) - if status_code == 500: - Logger.log("w", "Request to {url} returned a 500.".format(url = reply_url)) - return - if reply.error() == QNetworkReply.ContentOperationNotPermittedError: - # It was probably "/api/v1/materials" for legacy UM3 - return - if reply.error() == QNetworkReply.ContentNotFoundError: - # It was probably "/api/v1/print_job" for legacy UM3 - return - - if reply.operation() == QNetworkAccessManager.PostOperation: - if self._cluster_api_prefix + "print_jobs" in reply_url: - self._finishedPrintJobPostRequest(reply) - return - - # We need to do this check *after* we process the post operation! - # If the sending of g-code is cancelled by the user it will result in an error, but we do need to handle this. - if reply.error() != QNetworkReply.NoError: - Logger.log("e", "After requesting [%s] we got a network error [%s]. Not processing anything...", reply_url, reply.error()) - return - - elif reply.operation() == QNetworkAccessManager.GetOperation: - if self._cluster_api_prefix + "print_jobs" in reply_url: - self._finishedPrintJobsRequest(reply) - elif self._cluster_api_prefix + "printers" in reply_url: - self._finishedPrintersRequest(reply) - - @pyqtSlot() - def openPrintJobControlPanel(self): - Logger.log("d", "Opening print job control panel...") - QDesktopServices.openUrl(QUrl(self.getPrintJobsUrl())) - - @pyqtSlot() - def openPrinterControlPanel(self): - Logger.log("d", "Opening printer control panel...") - QDesktopServices.openUrl(QUrl(self.getPrintersUrl())) - - def _onMessageActionTriggered(self, message, action): - if action == "open_browser": - QDesktopServices.openUrl(QUrl(self.getPrintJobsUrl())) - - if action == "Abort": - Logger.log("d", "User aborted sending print to remote.") - self._progress_message.hide() - self._compressing_print = False - if self._reply: - self._reply.abort() - self._stage = OutputStage.ready - Application.getInstance().getController().setActiveStage("PrepareStage") - - @pyqtSlot(int, result=str) - def formatDuration(self, seconds): - return Duration(seconds).getDisplayString(DurationFormat.Format.Short) - - ## For cluster below - def _get_plugin_directory_name(self): - current_file_absolute_path = os.path.realpath(__file__) - directory_path = os.path.dirname(current_file_absolute_path) - _, directory_name = os.path.split(directory_path) - return directory_name - - @property - def _plugin_path(self): - return PluginRegistry.getInstance().getPluginPath(self._get_plugin_directory_name()) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py deleted file mode 100755 index 3a48bab11b..0000000000 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ /dev/null @@ -1,1306 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from UM.i18n import i18nCatalog -from UM.Application import Application -from UM.Logger import Logger -from UM.Signal import signalemitter - -from UM.Message import Message - -import UM.Settings.ContainerRegistry -import UM.Version #To compare firmware version numbers. - -from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState -from cura.Settings.ContainerManager import ContainerManager -import cura.Settings.ExtruderManager - -from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply -from PyQt5.QtCore import QUrl, QTimer, pyqtSignal, pyqtProperty, pyqtSlot, QCoreApplication -from PyQt5.QtGui import QImage, QColor -from PyQt5.QtWidgets import QMessageBox - -import json -import os -import gzip - -from time import time - -from time import gmtime -from enum import IntEnum - -i18n_catalog = i18nCatalog("cura") - -class AuthState(IntEnum): - NotAuthenticated = 1 - AuthenticationRequested = 2 - Authenticated = 3 - AuthenticationDenied = 4 - -## Network connected (wifi / lan) printer that uses the Ultimaker API -@signalemitter -class NetworkPrinterOutputDevice(PrinterOutputDevice): - def __init__(self, key, address, properties, api_prefix): - super().__init__(key) - self._address = address - self._key = key - self._properties = properties # Properties dict as provided by zero conf - self._api_prefix = api_prefix - - self._gcode = None - self._print_finished = True # _print_finished == False means we're halfway in a print - self._write_finished = True # _write_finished == False means we're currently sending a G-code file - - self._use_gzip = True # Should we use g-zip compression before sending the data? - - # This holds the full JSON file that was received from the last request. - # The JSON looks like: - #{ - # "led": {"saturation": 0.0, "brightness": 100.0, "hue": 0.0}, - # "beep": {}, - # "network": { - # "wifi_networks": [], - # "ethernet": {"connected": true, "enabled": true}, - # "wifi": {"ssid": "xxxx", "connected": False, "enabled": False} - # }, - # "diagnostics": {}, - # "bed": {"temperature": {"target": 60.0, "current": 44.4}}, - # "heads": [{ - # "max_speed": {"z": 40.0, "y": 300.0, "x": 300.0}, - # "position": {"z": 20.0, "y": 6.0, "x": 180.0}, - # "fan": 0.0, - # "jerk": {"z": 0.4, "y": 20.0, "x": 20.0}, - # "extruders": [ - # { - # "feeder": {"max_speed": 45.0, "jerk": 5.0, "acceleration": 3000.0}, - # "active_material": {"guid": "xxxxxxx", "length_remaining": -1.0}, - # "hotend": {"temperature": {"target": 0.0, "current": 22.8}, "id": "AA 0.4"} - # }, - # { - # "feeder": {"max_speed": 45.0, "jerk": 5.0, "acceleration": 3000.0}, - # "active_material": {"guid": "xxxx", "length_remaining": -1.0}, - # "hotend": {"temperature": {"target": 0.0, "current": 22.8}, "id": "BB 0.4"} - # } - # ], - # "acceleration": 3000.0 - # }], - # "status": "printing" - #} - - self._json_printer_state = {} - - ## Todo: Hardcoded value now; we should probably read this from the machine file. - ## It's okay to leave this for now, as this plugin is um3 only (and has 2 extruders by definition) - self._num_extruders = 2 - - # These are reinitialised here (from PrinterOutputDevice) to match the new _num_extruders - self._hotend_temperatures = [0] * self._num_extruders - self._target_hotend_temperatures = [0] * self._num_extruders - - self._material_ids = [""] * self._num_extruders - self._hotend_ids = [""] * self._num_extruders - self._target_bed_temperature = 0 - self._processing_preheat_requests = True - - self._can_control_manually = False - - self.setPriority(3) # Make sure the output device gets selected above local file output - self.setName(key) - self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) - self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network")) - self.setIconName("print") - - self._manager = None - - self._post_request = None - self._post_reply = None - self._post_multi_part = None - self._post_part = None - - self._material_multi_part = None - self._material_part = None - - self._progress_message = None - self._error_message = None - self._connection_message = None - - self._update_timer = QTimer() - self._update_timer.setInterval(2000) # TODO; Add preference for update interval - self._update_timer.setSingleShot(False) - self._update_timer.timeout.connect(self._update) - - self._camera_timer = QTimer() - self._camera_timer.setInterval(500) # Todo: Add preference for camera update interval - self._camera_timer.setSingleShot(False) - self._camera_timer.timeout.connect(self._updateCamera) - - self._image_request = None - self._image_reply = None - - self._use_stream = True - self._stream_buffer = b"" - self._stream_buffer_start_index = -1 - - self._camera_image_id = 0 - - self._authentication_counter = 0 - self._max_authentication_counter = 5 * 60 # Number of attempts before authentication timed out (5 min) - - self._authentication_timer = QTimer() - self._authentication_timer.setInterval(1000) # TODO; Add preference for update interval - self._authentication_timer.setSingleShot(False) - self._authentication_timer.timeout.connect(self._onAuthenticationTimer) - self._authentication_request_active = False - - self._authentication_state = AuthState.NotAuthenticated - self._authentication_id = None - self._authentication_key = None - - self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status", "Access to the printer requested. Please approve the request on the printer"), lifetime = 0, dismissable = False, progress = 0, title = i18n_catalog.i18nc("@info:title", "Connection status")) - self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", ""), title = i18n_catalog.i18nc("@info:title", "Connection Status")) - self._authentication_failed_message.addAction("Retry", i18n_catalog.i18nc("@action:button", "Retry"), None, i18n_catalog.i18nc("@info:tooltip", "Re-send the access request")) - self._authentication_failed_message.actionTriggered.connect(self.requestAuthentication) - self._authentication_succeeded_message = Message(i18n_catalog.i18nc("@info:status", "Access to the printer accepted"), title = i18n_catalog.i18nc("@info:title", "Connection Status")) - self._not_authenticated_message = Message(i18n_catalog.i18nc("@info:status", "No access to print with this printer. Unable to send print job."), title = i18n_catalog.i18nc("@info:title", "Connection Status")) - self._not_authenticated_message.addAction("Request", i18n_catalog.i18nc("@action:button", "Request Access"), None, i18n_catalog.i18nc("@info:tooltip", "Send access request to the printer")) - self._not_authenticated_message.actionTriggered.connect(self.requestAuthentication) - - self._camera_image = QImage() - - self._material_post_objects = {} - self._connection_state_before_timeout = None - - self._last_response_time = time() - self._last_request_time = None - self._response_timeout_time = 10 - self._recreate_network_manager_time = 30 # If we have no connection, re-create network manager every 30 sec. - self._recreate_network_manager_count = 1 - - self._send_gcode_start = time() # Time when the sending of the g-code started. - - self._last_command = "" - - 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") - elif printer_type.startswith("9066"): - self._updatePrinterType("ultimaker3") - 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) - if self._authentication_counter > self._max_authentication_counter: - self._authentication_timer.stop() - Logger.log("i", "Authentication timer ended. Setting authentication to denied for printer: %s" % self._key) - self.setAuthenticationState(AuthState.AuthenticationDenied) - - def _onAuthenticationRequired(self, reply, authenticator): - if self._authentication_id is not None and self._authentication_key is not None: - Logger.log("d", "Authentication was required for printer: %s. Setting up authenticator with ID %s and key %s", self._key, self._authentication_id, self._getSafeAuthKey()) - authenticator.setUser(self._authentication_id) - authenticator.setPassword(self._authentication_key) - else: - Logger.log("d", "No authentication is available to use for %s, but we did got a request for it.", self._key) - - def getProperties(self): - return self._properties - - @pyqtSlot(str, result = str) - def getProperty(self, key): - key = key.encode("utf-8") - if key in self._properties: - return self._properties.get(key, b"").decode("utf-8") - else: - return "" - - ## Get the unique key of this machine - # \return key String containing the key of the machine. - @pyqtSlot(result = str) - def getKey(self): - return self._key - - ## The IP address of the printer. - @pyqtProperty(str, constant = True) - def address(self): - return self._properties.get(b"address", b"").decode("utf-8") - - ## Name of the printer (as returned from the ZeroConf properties) - @pyqtProperty(str, constant = True) - def name(self): - return self._properties.get(b"name", b"").decode("utf-8") - - ## Firmware version (as returned from the ZeroConf properties) - @pyqtProperty(str, constant=True) - def firmwareVersion(self): - return self._properties.get(b"firmware_version", b"").decode("utf-8") - - ## IPadress of this printer - @pyqtProperty(str, constant=True) - def ipAddress(self): - return self._address - - ## Pre-heats the heated bed of the printer. - # - # \param temperature The temperature to heat the bed to, in degrees - # Celsius. - # \param duration How long the bed should stay warm, in seconds. - @pyqtSlot(float, float) - def preheatBed(self, temperature, duration): - temperature = round(temperature) #The API doesn't allow floating point. - duration = round(duration) - if UM.Version.Version(self.firmwareVersion) < UM.Version.Version("3.5.92"): #Real bed pre-heating support is implemented from 3.5.92 and up. - self.setTargetBedTemperature(temperature = temperature) #No firmware-side duration support then. - return - url = QUrl("http://" + self._address + self._api_prefix + "printer/bed/pre_heat") - if duration > 0: - data = """{"temperature": "%i", "timeout": "%i"}""" % (temperature, duration) - else: - data = """{"temperature": "%i"}""" % temperature - Logger.log("i", "Pre-heating bed to %i degrees.", temperature) - put_request = QNetworkRequest(url) - put_request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") - self._processing_preheat_requests = False - self._manager.put(put_request, data.encode()) - self._preheat_bed_timer.start(self._preheat_bed_timeout * 1000) #Times 1000 because it needs to be provided as milliseconds. - self.preheatBedRemainingTimeChanged.emit() - - ## Cancels pre-heating the heated bed of the printer. - # - # If the bed is not pre-heated, nothing happens. - @pyqtSlot() - def cancelPreheatBed(self): - Logger.log("i", "Cancelling pre-heating of the bed.") - self.preheatBed(temperature = 0, duration = 0) - self._preheat_bed_timer.stop() - self._preheat_bed_timer.setInterval(0) - self.preheatBedRemainingTimeChanged.emit() - - ## Changes the target bed temperature on the printer. - # - # /param temperature The new target temperature of the bed. - def _setTargetBedTemperature(self, temperature): - if not self._updateTargetBedTemperature(temperature): - return - - url = QUrl("http://" + self._address + self._api_prefix + "printer/bed/temperature/target") - data = str(temperature) - put_request = QNetworkRequest(url) - put_request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") - self._manager.put(put_request, data.encode()) - - ## Updates the target bed temperature from the printer, and emit a signal if it was changed. - # - # /param temperature The new target temperature of the bed. - # /return boolean, True if the temperature was changed, false if the new temperature has the same value as the already stored temperature - def _updateTargetBedTemperature(self, temperature): - if self._target_bed_temperature == temperature: - return False - self._target_bed_temperature = temperature - self.targetBedTemperatureChanged.emit() - return True - - ## Updates the target hotend temperature from the printer, and emit a signal if it was changed. - # - # /param index The index of the hotend. - # /param temperature The new target temperature of the hotend. - # /return boolean, True if the temperature was changed, false if the new temperature has the same value as the already stored temperature - def _updateTargetHotendTemperature(self, index, temperature): - if self._target_hotend_temperatures[index] == temperature: - return False - self._target_hotend_temperatures[index] = temperature - self.targetHotendTemperaturesChanged.emit() - return True - - def _stopCamera(self): - self._stream_buffer = b"" - self._stream_buffer_start_index = -1 - - if self._camera_timer.isActive(): - self._camera_timer.stop() - - if self._image_reply: - try: - # disconnect the signal - try: - self._image_reply.downloadProgress.disconnect(self._onStreamDownloadProgress) - except Exception: - pass - # abort the request if it's not finished - if not self._image_reply.isFinished(): - self._image_reply.close() - except Exception as e: #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: - self._startCameraStream() - else: - self._camera_timer.start() - - def _startCameraStream(self): - ## Request new image - url = QUrl("http://" + self._address + ":8080/?action=stream") - self._image_request = QNetworkRequest(url) - self._image_reply = self._manager.get(self._image_request) - self._image_reply.downloadProgress.connect(self._onStreamDownloadProgress) - - def _updateCamera(self): - if not self._manager.networkAccessible(): - return - ## Request new image - url = QUrl("http://" + self._address + ":8080/?action=snapshot") - image_request = QNetworkRequest(url) - self._manager.get(image_request) - self._last_request_time = time() - - ## Set the authentication state. - # \param auth_state \type{AuthState} Enum value representing the new auth state - def setAuthenticationState(self, auth_state): - if auth_state == self._authentication_state: - return # Nothing to do here. - - Logger.log("d", "Attempting to update auth state from %s to %s for printer %s" % (self._authentication_state, auth_state, self._key)) - - if auth_state == AuthState.AuthenticationRequested: - Logger.log("d", "Authentication state changed to authentication requested.") - self.setAcceptsCommands(False) - self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network. Please approve the access request on the printer.")) - self._authentication_requested_message.show() - self._authentication_request_active = True - self._authentication_timer.start() # Start timer so auth will fail after a while. - elif auth_state == AuthState.Authenticated: - Logger.log("d", "Authentication state changed to authenticated") - self.setAcceptsCommands(True) - self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network.")) - self._authentication_requested_message.hide() - if self._authentication_request_active: - self._authentication_succeeded_message.show() - - # Stop waiting for a response - self._authentication_timer.stop() - self._authentication_counter = 0 - - # Once we are authenticated we need to send all material profiles. - self.sendMaterialProfiles() - elif auth_state == AuthState.AuthenticationDenied: - self.setAcceptsCommands(False) - self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network. No access to control the printer.")) - self._authentication_requested_message.hide() - if self._authentication_request_active: - if self._authentication_timer.remainingTime() > 0: - Logger.log("d", "Authentication state changed to authentication denied before the request timeout.") - self._authentication_failed_message.setText(i18n_catalog.i18nc("@info:status", "Access request was denied on the printer.")) - else: - Logger.log("d", "Authentication state changed to authentication denied due to a timeout") - self._authentication_failed_message.setText(i18n_catalog.i18nc("@info:status", "Access request failed due to a timeout.")) - - self._authentication_failed_message.show() - self._authentication_request_active = False - - # Stop waiting for a response - self._authentication_timer.stop() - self._authentication_counter = 0 - - self._authentication_state = auth_state - self.authenticationStateChanged.emit() - - authenticationStateChanged = pyqtSignal() - - @pyqtProperty(int, notify = authenticationStateChanged) - def authenticationState(self): - return self._authentication_state - - @pyqtSlot() - def requestAuthentication(self, message_id = None, action_id = "Retry"): - if action_id == "Request" or action_id == "Retry": - Logger.log("d", "Requestion authentication for %s due to action %s" % (self._key, action_id)) - self._authentication_failed_message.hide() - self._not_authenticated_message.hide() - self.setAuthenticationState(AuthState.NotAuthenticated) - self._authentication_counter = 0 - self._authentication_requested_message.setProgress(0) - self._authentication_id = None - self._authentication_key = None - self._createNetworkManager() # Re-create network manager to force re-authentication. - - ## Request data from the connected device. - def _update(self): - if self._last_response_time: - time_since_last_response = time() - self._last_response_time - else: - time_since_last_response = 0 - if self._last_request_time: - time_since_last_request = time() - self._last_request_time - else: - time_since_last_request = float("inf") # An irrelevantly large number of seconds - - # Connection is in timeout, check if we need to re-start the connection. - # Sometimes the qNetwork manager incorrectly reports the network status on Mac & Windows. - # Re-creating the QNetworkManager seems to fix this issue. - if self._last_response_time and self._connection_state_before_timeout: - if time_since_last_response > self._recreate_network_manager_time * self._recreate_network_manager_count: - self._recreate_network_manager_count += 1 - counter = 0 # Counter to prevent possible indefinite while loop. - # It can happen that we had a very long timeout (multiple times the recreate time). - # In that case we should jump through the point that the next update won't be right away. - while time_since_last_response - self._recreate_network_manager_time * self._recreate_network_manager_count > self._recreate_network_manager_time and counter < 10: - counter += 1 - self._recreate_network_manager_count += 1 - Logger.log("d", "Timeout lasted over %.0f seconds (%.1fs), re-checking connection.", self._recreate_network_manager_time, time_since_last_response) - self._createNetworkManager() - return - - # Check if we have an connection in the first place. - if not self._manager.networkAccessible(): - if not self._connection_state_before_timeout: - Logger.log("d", "The network connection seems to be disabled. Going into timeout mode") - self._connection_state_before_timeout = self._connection_state - self.setConnectionState(ConnectionState.error) - self._connection_message = Message(i18n_catalog.i18nc("@info:status", - "The connection with the network was lost."), - title = i18n_catalog.i18nc("@info:title", "Connection Status")) - self._connection_message.show() - - if self._progress_message: - self._progress_message.hide() - - # Check if we were uploading something. Abort if this is the case. - # Some operating systems handle this themselves, others give weird issues. - if self._post_reply: - Logger.log("d", "Stopping post upload because the connection was lost.") - self._finalizePostReply() - return - else: - if not self._connection_state_before_timeout: - self._recreate_network_manager_count = 1 - - # Check that we aren't in a timeout state - if self._last_response_time and self._last_request_time and not self._connection_state_before_timeout: - if time_since_last_response > self._response_timeout_time and time_since_last_request <= self._response_timeout_time: - # Go into timeout state. - Logger.log("d", "We did not receive a response for %0.1f seconds, so it seems the printer is no longer accessible.", time_since_last_response) - self._connection_state_before_timeout = self._connection_state - self._connection_message = Message(i18n_catalog.i18nc("@info:status", "The connection with the printer was lost. Check your printer to see if it is connected."), - title = i18n_catalog.i18nc("@info:title", "Connection Status")) - self._connection_message.show() - - if self._progress_message: - self._progress_message.hide() - - # Check if we were uploading something. Abort if this is the case. - # Some operating systems handle this themselves, others give weird issues. - if self._post_reply: - Logger.log("d", "Stopping post upload because the connection was lost.") - self._finalizePostReply() - self.setConnectionState(ConnectionState.error) - return - - if self._authentication_state == AuthState.NotAuthenticated: - self._verifyAuthentication() # We don't know if we are authenticated; check if we have correct auth. - elif self._authentication_state == AuthState.AuthenticationRequested: - self._checkAuthentication() # We requested authentication at some point. Check if we got permission. - - ## Request 'general' printer data - url = QUrl("http://" + self._address + self._api_prefix + "printer") - printer_request = QNetworkRequest(url) - self._manager.get(printer_request) - - ## Request print_job data - url = QUrl("http://" + self._address + self._api_prefix + "print_job") - print_job_request = QNetworkRequest(url) - self._manager.get(print_job_request) - - self._last_request_time = time() - - def _finalizePostReply(self): - # Indicate uploading was finished (so another file can be send) - self._write_finished = True - - if self._post_reply is None: - return - - try: - try: - self._post_reply.uploadProgress.disconnect(self._onUploadProgress) - except TypeError: - pass # The disconnection can fail on mac in some cases. Ignore that. - - try: - self._post_reply.finished.disconnect(self._onUploadFinished) - except TypeError: - pass # The disconnection can fail on mac in some cases. Ignore that. - - self._post_reply.abort() - self._post_reply = None - except RuntimeError: - self._post_reply = None # It can happen that the wrapped c++ object is already deleted. - - def _createNetworkManager(self): - if self._manager: - self._manager.finished.disconnect(self._onFinished) - self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged) - self._manager.authenticationRequired.disconnect(self._onAuthenticationRequired) - - self._manager = QNetworkAccessManager() - self._manager.finished.connect(self._onFinished) - self._manager.authenticationRequired.connect(self._onAuthenticationRequired) - self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes - - ## Convenience function that gets information from the received json data and converts it to the right internal - # values / variables - def _spliceJSONData(self): - # Check for hotend temperatures - for index in range(0, self._num_extruders): - temperatures = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["temperature"] - self._setHotendTemperature(index, temperatures["current"]) - self._updateTargetHotendTemperature(index, temperatures["target"]) - try: - material_id = self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["guid"] - except KeyError: - material_id = "" - self._setMaterialId(index, material_id) - try: - hotend_id = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["id"] - except KeyError: - hotend_id = "" - self._setHotendId(index, hotend_id) - - bed_temperatures = self._json_printer_state["bed"]["temperature"] - self._setBedTemperature(bed_temperatures["current"]) - self._updateTargetBedTemperature(bed_temperatures["target"]) - - head_x = self._json_printer_state["heads"][0]["position"]["x"] - head_y = self._json_printer_state["heads"][0]["position"]["y"] - head_z = self._json_printer_state["heads"][0]["position"]["z"] - self._updateHeadPosition(head_x, head_y, head_z) - self._updatePrinterState(self._json_printer_state["status"]) - - if self._processing_preheat_requests: - try: - is_preheating = self._json_printer_state["bed"]["pre_heat"]["active"] - except KeyError: #Old firmware doesn't support that. - pass #Don't update the pre-heat remaining time. - else: - if is_preheating: - try: - remaining_preheat_time = self._json_printer_state["bed"]["pre_heat"]["remaining"] - except KeyError: #Error in firmware. If "active" is supported, "remaining" should also be supported. - pass #Anyway, don't update. - else: - #Only update if time estimate is significantly off (>5000ms). - #Otherwise we get issues with latency causing the timer to count inconsistently. - if abs(self._preheat_bed_timer.remainingTime() - remaining_preheat_time * 1000) > 5000: - self._preheat_bed_timer.setInterval(remaining_preheat_time * 1000) - self._preheat_bed_timer.start() - self.preheatBedRemainingTimeChanged.emit() - else: #Not pre-heating. Must've cancelled. - if self._preheat_bed_timer.isActive(): - self._preheat_bed_timer.setInterval(0) - self._preheat_bed_timer.stop() - self.preheatBedRemainingTimeChanged.emit() - - def close(self): - Logger.log("d", "Closing connection of printer %s with ip %s", self._key, self._address) - self._updateJobState("") - self.setConnectionState(ConnectionState.closed) - if self._progress_message: - self._progress_message.hide() - - # Reset authentication state - self._authentication_requested_message.hide() - self.setAuthenticationState(AuthState.NotAuthenticated) - self._authentication_counter = 0 - self._authentication_timer.stop() - - self._authentication_requested_message.hide() - self._authentication_failed_message.hide() - self._authentication_succeeded_message.hide() - - # Reset stored material & hotend data. - self._material_ids = [""] * self._num_extruders - self._hotend_ids = [""] * self._num_extruders - - if self._error_message: - self._error_message.hide() - - # Reset timeout state - self._connection_state_before_timeout = None - self._last_response_time = time() - self._last_request_time = None - - # Stop update timers - self._update_timer.stop() - - self.stopCamera() - - ## Request the current scene to be sent to a network-connected printer. - # - # \param nodes A collection of scene nodes to send. This is ignored. - # \param file_name \type{string} A suggestion for a file name to write. - # This is ignored. - # \param filter_by_machine Whether to filter MIME types by machine. This - # 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 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, - title = i18n_catalog.i18nc("@info:title", "Printer Status")) - self._error_message.show() - return - elif self._authentication_state != AuthState.Authenticated: - self._not_authenticated_message.show() - Logger.log("d", "Attempting to perform an action without authentication for printer %s. Auth state is %s", self._key, self._authentication_state) - return - - Application.getInstance().getController().setActiveStage("MonitorStage") - self._print_finished = True - self.writeStarted.emit(self) - self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list") - - print_information = Application.getInstance().getPrintInformation() - warnings = [] # There might be multiple things wrong. Keep a list of all the stuff we need to warn about. - - # Only check for mistakes if there is material length information. - if print_information.materialLengths: - # 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"] == "": - Logger.log("e", "No cartridge loaded in slot %s, unable to start print", index + 1) - self._error_message = Message( - i18n_catalog.i18nc("@info:status", "Unable to start a new print job. No Printcore loaded in slot {0}".format(index + 1)), - title = i18n_catalog.i18nc("@info:title", "Error")) - self._error_message.show() - return - if self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["guid"] == "": - Logger.log("e", "No material loaded in slot %s, unable to start print", index + 1) - self._error_message = Message( - i18n_catalog.i18nc("@info:status", - "Unable to start a new print job. No material loaded in slot {0}".format(index + 1)), - title = i18n_catalog.i18nc("@info:title", "Error")) - self._error_message.show() - return - - for index in range(0, self._num_extruders): - # Check if there is enough material. Any failure in these results in a warning. - material_length = self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["length_remaining"] - if material_length != -1 and index < len(print_information.materialLengths) and print_information.materialLengths[index] > material_length: - Logger.log("w", "Printer reports that there is not enough material left for extruder %s. We need %s and the printer has %s", index + 1, print_information.materialLengths[index], material_length) - warnings.append(i18n_catalog.i18nc("@label", "Not enough material for spool {0}.").format(index+1)) - - # Check if the right cartridges are loaded. Any failure in these results in a warning. - extruder_manager = cura.Settings.ExtruderManager.ExtruderManager.getInstance() - if index < len(print_information.materialLengths) and print_information.materialLengths[index] != 0: - variant = extruder_manager.getExtruderStack(index).findContainer({"type": "variant"}) - core_name = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["id"] - 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 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: - remote_material_guid = self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["guid"] - if material.getMetaDataEntry("GUID") != remote_material_guid: - Logger.log("w", "Extruder %s has a different material (%s) as Cura (%s)", index + 1, - remote_material_guid, - material.getMetaDataEntry("GUID")) - - remote_materials = UM.Settings.ContainerRegistry.ContainerRegistry.getInstance().findInstanceContainers(type = "material", GUID = remote_material_guid, read_only = True) - remote_material_name = "Unknown" - if remote_materials: - remote_material_name = remote_materials[0].getName() - warnings.append(i18n_catalog.i18nc("@label", "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}").format(material.getName(), remote_material_name, index + 1)) - - try: - is_offset_calibrated = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["offset"]["state"] == "valid" - except KeyError: # Older versions of the API don't expose the offset property, so we must asume that all is well. - is_offset_calibrated = True - - if not is_offset_calibrated: - 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.") - - if warnings: - text = i18n_catalog.i18nc("@label", "Are you sure you wish to print with the selected configuration?") - informative_text = i18n_catalog.i18nc("@label", "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.") - detailed_text = "" - for warning in warnings: - detailed_text += warning + "\n" - - Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Mismatched configuration"), - text, - informative_text, - detailed_text, - buttons=QMessageBox.Yes + QMessageBox.No, - icon=QMessageBox.Question, - callback=self._configurationMismatchMessageCallback - ) - return - - self.startPrint() - - def _configurationMismatchMessageCallback(self, button): - def delayedCallback(): - if button == QMessageBox.Yes: - self.startPrint() - else: - Application.getInstance().getController().setActiveStage("PrepareStage") - # For some unknown reason Cura on OSX will hang if we do the call back code - # immediately without first returning and leaving QML's event system. - QTimer.singleShot(100, delayedCallback) - - def isConnected(self): - return self._connection_state != ConnectionState.closed and self._connection_state != ConnectionState.error - - ## Start requesting data from printer - def connect(self): - # Don't allow to connect to a printer with a faulty connection state. - # For instance when switching printers but the printer is disconnected from the network - if self._connection_state == ConnectionState.error: - return - - if self.isConnected(): - self.close() # Close previous connection - - self._createNetworkManager() - - self._last_response_time = time() # Ensure we reset the time when trying to connect (again) - - self.setConnectionState(ConnectionState.connecting) - self._update() # Manually trigger the first update, as we don't want to wait a few secs before it starts. - if not self._use_stream: - self._updateCamera() - Logger.log("d", "Connection with printer %s with ip %s started", self._key, self._address) - - ## Check if this machine was authenticated before. - self._authentication_id = Application.getInstance().getGlobalContainerStack().getMetaDataEntry("network_authentication_id", None) - self._authentication_key = Application.getInstance().getGlobalContainerStack().getMetaDataEntry("network_authentication_key", None) - - if self._authentication_id is None and self._authentication_key is None: - Logger.log("d", "No authentication found in metadata.") - else: - Logger.log("d", "Loaded authentication id %s and key %s from the metadata entry for printer %s", self._authentication_id, self._getSafeAuthKey(), self._key) - - self._update_timer.start() - - ## Stop requesting data from printer - def disconnect(self): - Logger.log("d", "Connection with printer %s with ip %s stopped", self._key, self._address) - self.close() - - newImage = pyqtSignal() - - @pyqtProperty(QUrl, notify = newImage) - def cameraImage(self): - self._camera_image_id += 1 - # There is an image provider that is called "camera". In order to ensure that the image qml object, that - # requires a QUrl to function, updates correctly we add an increasing number. This causes to see the QUrl - # as new (instead of relying on cached version and thus forces an update. - temp = "image://camera/" + str(self._camera_image_id) - return QUrl(temp, QUrl.TolerantMode) - - def getCameraImage(self): - return self._camera_image - - def _setJobState(self, job_state): - self._last_command = job_state - url = QUrl("http://" + self._address + self._api_prefix + "print_job/state") - put_request = QNetworkRequest(url) - put_request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") - data = "{\"target\": \"%s\"}" % job_state - self._manager.put(put_request, data.encode()) - - ## Convenience function to get the username from the OS. - # The code was copied from the getpass module, as we try to use as little dependencies as possible. - def _getUserName(self): - for name in ("LOGNAME", "USER", "LNAME", "USERNAME"): - user = os.environ.get(name) - if user: - return user - return "Unknown User" # Couldn't find out username. - - def _progressMessageActionTrigger(self, message_id = None, action_id = None): - if action_id == "Abort": - Logger.log("d", "User aborted sending print to remote.") - self._progress_message.hide() - self._compressing_print = False - self._write_finished = True # post_reply does not always exist, so make sure we unblock writing - if self._post_reply: - self._finalizePostReply() - Application.getInstance().getController().setActiveStage("PrepareStage") - - ## Attempt to start a new print. - # This function can fail to actually start a print due to not being authenticated or another print already - # being in progress. - def startPrint(self): - - # Check if we're already writing - if not self._write_finished: - self._error_message = Message( - i18n_catalog.i18nc("@info:status", - "Sending new jobs (temporarily) blocked, still sending the previous print job.")) - self._error_message.show() - return - - # Indicate we're starting a new write action, is set back to True at the end of this method - self._write_finished = False - - try: - self._send_gcode_start = time() - self._progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to printer"), 0, False, -1, i18n_catalog.i18nc("@info:title", "Sending Data")) - self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "") - self._progress_message.actionTriggered.connect(self._progressMessageActionTrigger) - self._progress_message.show() - Logger.log("d", "Started sending g-code to remote printer.") - self._compressing_print = True - ## Mash the data into single string - - max_chars_per_line = 1024 * 1024 / 4 # 1 / 4 MB - - byte_array_file_data = b"" - batched_line = "" - - def _compress_data_and_notify_qt(data_to_append): - compressed_data = gzip.compress(data_to_append.encode("utf-8")) - self._progress_message.setProgress(-1) # Tickle the message so that it's clear that it's still being used. - QCoreApplication.processEvents() # Ensure that the GUI does not freeze. - # Pretend that this is a response, as zipping might take a bit of time. - self._last_response_time = time() - return compressed_data - - for line in self._gcode: - if not self._compressing_print: - self._progress_message.hide() - return # Stop trying to zip, abort was called. - - if self._use_gzip: - batched_line += line - # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. - # Compressing line by line in this case is extremely slow, so we need to batch them. - if len(batched_line) < max_chars_per_line: - continue - - byte_array_file_data += _compress_data_and_notify_qt(batched_line) - batched_line = "" - else: - byte_array_file_data += line.encode("utf-8") - - # don't miss the last batch if it's there - if self._use_gzip: - if batched_line: - byte_array_file_data += _compress_data_and_notify_qt(batched_line) - - if self._use_gzip: - file_name = "%s.gcode.gz" % Application.getInstance().getPrintInformation().jobName - else: - file_name = "%s.gcode" % Application.getInstance().getPrintInformation().jobName - - self._compressing_print = False - ## Create multi_part request - self._post_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType) - - ## Create part (to be placed inside multipart) - self._post_part = QHttpPart() - self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader, - "form-data; name=\"file\"; filename=\"%s\"" % file_name) - self._post_part.setBody(byte_array_file_data) - self._post_multi_part.append(self._post_part) - - url = QUrl("http://" + self._address + self._api_prefix + "print_job") - - ## Create the QT request - self._post_request = QNetworkRequest(url) - - ## Post request + data - self._post_reply = self._manager.post(self._post_request, self._post_multi_part) - self._post_reply.uploadProgress.connect(self._onUploadProgress) - self._post_reply.finished.connect(self._onUploadFinished) # used to unblock new write actions - - except IOError: - self._progress_message.hide() - self._error_message = Message(i18n_catalog.i18nc("@info:status", "Unable to send data to printer. Is another job still active?"), - title = i18n_catalog.i18nc("@info:title", "Warning")) - self._error_message.show() - except Exception as e: - self._progress_message.hide() - Logger.log("e", "An exception occurred in network connection: %s" % str(e)) - - ## Verify if we are authenticated to make requests. - def _verifyAuthentication(self): - url = QUrl("http://" + self._address + self._api_prefix + "auth/verify") - request = QNetworkRequest(url) - self._manager.get(request) - - ## Check if the authentication request was allowed by the printer. - def _checkAuthentication(self): - Logger.log("d", "Checking if authentication is correct for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) - self._manager.get(QNetworkRequest(QUrl("http://" + self._address + self._api_prefix + "auth/check/" + str(self._authentication_id)))) - - ## Request a authentication key from the printer so we can be authenticated - def _requestAuthentication(self): - url = QUrl("http://" + self._address + self._api_prefix + "auth/request") - request = QNetworkRequest(url) - request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") - self._authentication_key = None - self._authentication_id = None - self._manager.post(request, json.dumps({"application": "Cura-" + Application.getInstance().getVersion(), "user": self._getUserName()}).encode()) - self.setAuthenticationState(AuthState.AuthenticationRequested) - - ## Send all material profiles to the printer. - def sendMaterialProfiles(self): - for container in UM.Settings.ContainerRegistry.ContainerRegistry.getInstance().findInstanceContainers(type = "material"): - try: - xml_data = container.serialize() - if xml_data == "" or xml_data is None: - continue - - names = ContainerManager.getInstance().getLinkedMaterials(container.getId()) - if names: - # There are other materials that share this GUID. - if not container.isReadOnly(): - continue # If it's not readonly, it's created by user, so skip it. - - material_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType) - - material_part = QHttpPart() - file_name = "none.xml" - material_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data; name=\"file\";filename=\"%s\"" % file_name) - material_part.setBody(xml_data.encode()) - material_multi_part.append(material_part) - url = QUrl("http://" + self._address + self._api_prefix + "materials") - material_post_request = QNetworkRequest(url) - reply = self._manager.post(material_post_request, material_multi_part) - - # Keep reference to material_part, material_multi_part and reply so the garbage collector won't touch them. - self._material_post_objects[id(reply)] = (material_part, material_multi_part, reply) - except NotImplementedError: - # If the material container is not the most "generic" one it can't be serialized an will raise a - # NotImplementedError. We can simply ignore these. - pass - - ## Handler for all requests that have finished. - def _onFinished(self, reply): - if reply.error() == QNetworkReply.TimeoutError: - Logger.log("w", "Received a timeout on a request to the printer") - self._connection_state_before_timeout = self._connection_state - # Check if we were uploading something. Abort if this is the case. - # Some operating systems handle this themselves, others give weird issues. - if self._post_reply: - self._finalizePostReply() - Logger.log("d", "Uploading of print failed after %s", time() - self._send_gcode_start) - self._progress_message.hide() - - self.setConnectionState(ConnectionState.error) - return - - if self._connection_state_before_timeout and reply.error() == QNetworkReply.NoError: # There was a timeout, but we got a correct answer again. - Logger.log("d", "We got a response (%s) from the server after %0.1f of silence. Going back to previous state %s", reply.url().toString(), time() - self._last_response_time, self._connection_state_before_timeout) - - # Camera was active before timeout. Start it again - if self._camera_active: - self._startCamera() - - self.setConnectionState(self._connection_state_before_timeout) - self._connection_state_before_timeout = None - - if reply.error() == QNetworkReply.NoError: - self._last_response_time = time() - - status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) - if not status_code: - if self._connection_state != ConnectionState.error: - Logger.log("d", "A reply from %s did not have status code.", reply.url().toString()) - # Received no or empty reply - return - reply_url = reply.url().toString() - - if reply.operation() == QNetworkAccessManager.GetOperation: - # "printer" is also in "printers", therefore _api_prefix is added. - if self._api_prefix + "printer" in reply_url: # Status update from printer. - if status_code == 200: - if self._connection_state == ConnectionState.connecting: - self.setConnectionState(ConnectionState.connected) - try: - self._json_printer_state = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid printer state message: Not valid JSON.") - return - self._spliceJSONData() - - # Hide connection error message if the connection was restored - if self._connection_message: - self._connection_message.hide() - self._connection_message = None - else: - Logger.log("w", "We got an unexpected status (%s) while requesting printer state", status_code) - pass # TODO: Handle errors - elif self._api_prefix + "print_job" in reply_url: # Status update from print_job: - if status_code == 200: - try: - json_data = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid print job state message: Not valid JSON.") - return - progress = json_data["progress"] - ## If progress is 0 add a bit so another print can't be sent. - if progress == 0: - progress += 0.001 - elif progress == 1: - self._print_finished = True - else: - self._print_finished = False - self.setProgress(progress * 100) - - state = json_data["state"] - - # There is a short period after aborting or finishing a print where the printer - # reports a "none" state (but the printer is not ready to receive a print) - # If this happens before the print has reached progress == 1, the print has - # been aborted. - if state == "none" or state == "": - if self._last_command == "abort": - self.setErrorText(i18n_catalog.i18nc("@label:MonitorStatus", "Aborting print...")) - state = "error" - else: - state = "printing" - if state == "wait_cleanup" and self._last_command == "abort": - # Keep showing the "aborted" error state until after the buildplate has been cleaned - self.setErrorText(i18n_catalog.i18nc("@label:MonitorStatus", "Print aborted. Please check the printer")) - state = "error" - - # NB/TODO: the following two states are intentionally added for future proofing the i18n strings - # but are currently non-functional - if state == "!pausing": - self.setErrorText(i18n_catalog.i18nc("@label:MonitorStatus", "Pausing print...")) - if state == "!resuming": - self.setErrorText(i18n_catalog.i18nc("@label:MonitorStatus", "Resuming print...")) - - self._updateJobState(state) - self.setTimeElapsed(json_data["time_elapsed"]) - self.setTimeTotal(json_data["time_total"]) - self.setJobName(json_data["name"]) - elif status_code == 404: - self.setProgress(0) # No print job found, so there can't be progress or other data. - self._updateJobState("") - self.setErrorText("") - self.setTimeElapsed(0) - self.setTimeTotal(0) - self.setJobName("") - else: - Logger.log("w", "We got an unexpected status (%s) while requesting print job state", status_code) - elif "snapshot" in reply_url: # Status update from image: - if status_code == 200: - self._camera_image.loadFromData(reply.readAll()) - self.newImage.emit() - elif "auth/verify" in reply_url: # Answer when requesting authentication - if status_code == 401: - if self._authentication_state != AuthState.AuthenticationRequested: - # Only request a new authentication when we have not already done so. - Logger.log("i", "Not authenticated (Current auth state is %s). Attempting to request authentication for printer %s", self._authentication_state, self._key ) - self._requestAuthentication() - elif status_code == 403: - # If we already had an auth (eg; didn't request one), we only need a single 403 to see it as denied. - if self._authentication_state != AuthState.AuthenticationRequested: - Logger.log("d", "While trying to verify the authentication state, we got a forbidden response. Our own auth state was %s", self._authentication_state) - self.setAuthenticationState(AuthState.AuthenticationDenied) - elif status_code == 200: - self.setAuthenticationState(AuthState.Authenticated) - global_container_stack = Application.getInstance().getGlobalContainerStack() - - ## Save authentication details. - if global_container_stack: - if "network_authentication_key" in global_container_stack.getMetaData(): - global_container_stack.setMetaDataEntry("network_authentication_key", self._authentication_key) - else: - global_container_stack.addMetaDataEntry("network_authentication_key", self._authentication_key) - if "network_authentication_id" in global_container_stack.getMetaData(): - global_container_stack.setMetaDataEntry("network_authentication_id", self._authentication_id) - else: - global_container_stack.addMetaDataEntry("network_authentication_id", self._authentication_id) - Logger.log("i", "Authentication succeeded for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) - Application.getInstance().saveStack(global_container_stack) # Force save so we are sure the data is not lost. - else: - Logger.log("w", "Unable to save authentication for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) - - # Request 'system' printer data once, when we know we have authentication, so we know we can set the system time. - url = QUrl("http://" + self._address + self._api_prefix + "system") - system_data_request = QNetworkRequest(url) - self._manager.get(system_data_request) - - else: # Got a response that we didn't expect, so something went wrong. - Logger.log("e", "While trying to authenticate, we got an unexpected response: %s", reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)) - self.setAuthenticationState(AuthState.NotAuthenticated) - - elif "auth/check" in reply_url: # Check if we are authenticated (user can refuse this!) - try: - data = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid authentication check from printer: Not valid JSON.") - return - if data.get("message", "") == "authorized": - Logger.log("i", "Authentication was approved") - self._verifyAuthentication() # Ensure that the verification is really used and correct. - elif data.get("message", "") == "unauthorized": - Logger.log("i", "Authentication was denied.") - self.setAuthenticationState(AuthState.AuthenticationDenied) - else: - pass - - elif self._api_prefix + "system" in reply_url: - # Check if the printer has time, and if this has a valid system time. - try: - data = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid authentication request reply from printer: Not valid JSON.") - return - if "time" in data and "utc" in data["time"]: - try: - printer_time = gmtime(float(data["time"]["utc"])) - Logger.log("i", "Printer has system time of: %s", str(printer_time)) - except ValueError: - printer_time = None - if printer_time is not None and printer_time.tm_year < 1990: - # The system time is not valid, sync our current system time to it, so we at least have some reasonable time in the printer. - Logger.log("w", "Printer system time invalid, setting system time") - url = QUrl("http://" + self._address + self._api_prefix + "system/time/utc") - put_request = QNetworkRequest(url) - put_request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") - self._manager.put(put_request, str(time()).encode()) - - elif reply.operation() == QNetworkAccessManager.PostOperation: - if "/auth/request" in reply_url: - # We got a response to requesting authentication. - try: - data = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid authentication request reply from printer: Not valid JSON.") - return - global_container_stack = Application.getInstance().getGlobalContainerStack() - if global_container_stack: # Remove any old data. - Logger.log("d", "Removing old network authentication data for %s as a new one was requested.", self._key) - global_container_stack.removeMetaDataEntry("network_authentication_key") - global_container_stack.removeMetaDataEntry("network_authentication_id") - Application.getInstance().saveStack(global_container_stack) # Force saving so we don't keep wrong auth data. - - self._authentication_key = data["key"] - self._authentication_id = data["id"] - Logger.log("i", "Got a new authentication ID (%s) and KEY (%s). Waiting for authorization.", self._authentication_id, self._getSafeAuthKey()) - - # Check if the authentication is accepted. - self._checkAuthentication() - elif "materials" in reply_url: - # Remove cached post request items. - del self._material_post_objects[id(reply)] - elif "print_job" in reply_url: - self._onUploadFinished() # Make sure the upload flag is reset as reply.finished is not always triggered - try: - reply.uploadProgress.disconnect(self._onUploadProgress) - except: - pass - try: - reply.finished.disconnect(self._onUploadFinished) - except: - pass - Logger.log("d", "Uploading of print succeeded after %s", time() - self._send_gcode_start) - # Only reset the _post_reply if it was the same one. - if reply == self._post_reply: - self._post_reply = None - self._progress_message.hide() - - elif reply.operation() == QNetworkAccessManager.PutOperation: - if "printer/bed/pre_heat" in reply_url: #Pre-heat command has completed. Re-enable syncing pre-heating. - self._processing_preheat_requests = True - if status_code in [200, 201, 202, 204]: - pass # Request was successful! - else: - Logger.log("d", "Something went wrong when trying to update data of API (%s). Message: %s Statuscode: %s", reply_url, reply.readAll(), status_code) - else: - Logger.log("d", "NetworkPrinterOutputDevice got an unhandled operation %s", reply.operation()) - - def _onStreamDownloadProgress(self, bytes_received, bytes_total): - # An MJPG stream is (for our purpose) a stream of concatenated JPG images. - # JPG images start with the marker 0xFFD8, and end with 0xFFD9 - if self._image_reply is None: - return - self._stream_buffer += self._image_reply.readAll() - - if len(self._stream_buffer) > 2000000: # No single camera frame should be 2 Mb or larger - Logger.log("w", "MJPEG buffer exceeds reasonable size. Restarting stream...") - self._stopCamera() # resets stream buffer and start index - self._startCamera() - return - - if self._stream_buffer_start_index == -1: - self._stream_buffer_start_index = self._stream_buffer.indexOf(b'\xff\xd8') - stream_buffer_end_index = self._stream_buffer.lastIndexOf(b'\xff\xd9') - # If this happens to be more than a single frame, then so be it; the JPG decoder will - # ignore the extra data. We do it like this in order not to get a buildup of frames - - if self._stream_buffer_start_index != -1 and stream_buffer_end_index != -1: - jpg_data = self._stream_buffer[self._stream_buffer_start_index:stream_buffer_end_index + 2] - self._stream_buffer = self._stream_buffer[stream_buffer_end_index + 2:] - self._stream_buffer_start_index = -1 - - self._camera_image.loadFromData(jpg_data) - self.newImage.emit() - - def _onUploadProgress(self, bytes_sent, bytes_total): - if bytes_total > 0: - new_progress = bytes_sent / bytes_total * 100 - # Treat upload progress as response. Uploading can take more than 10 seconds, so if we don't, we can get - # timeout responses if this happens. - self._last_response_time = time() - if new_progress > self._progress_message.getProgress(): - self._progress_message.show() # Ensure that the message is visible. - self._progress_message.setProgress(bytes_sent / bytes_total * 100) - else: - self._progress_message.setProgress(0) - self._progress_message.hide() - - ## Allow new write actions (uploads) again when uploading is finished. - def _onUploadFinished(self): - self._write_finished = True - - ## Let the user decide if the hotends and/or material should be synced with the printer - def materialHotendChangedMessage(self, callback): - Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Sync with your printer"), - i18n_catalog.i18nc("@label", - "Would you like to use your current printer configuration in Cura?"), - i18n_catalog.i18nc("@label", - "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 - ) - - ## Convenience function to "blur" out all but the last 5 characters of the auth key. - # This can be used to debug print the key, without it compromising the security. - def _getSafeAuthKey(self): - if self._authentication_key is not None: - result = self._authentication_key[-5:] - result = "********" + result - return result - return self._authentication_key diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py deleted file mode 100644 index 46538f1af9..0000000000 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py +++ /dev/null @@ -1,357 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -import time -import json -from queue import Queue -from threading import Event, Thread - -from PyQt5.QtCore import QObject, pyqtSlot -from PyQt5.QtCore import QUrl -from PyQt5.QtGui import QDesktopServices -from PyQt5.QtNetwork import QNetworkRequest, QNetworkAccessManager -from UM.Application import Application -from UM.Logger import Logger -from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin -from UM.Preferences import Preferences -from UM.Signal import Signal, signalemitter -from zeroconf import Zeroconf, ServiceBrowser, ServiceStateChange, ServiceInfo # type: ignore - -from . import NetworkPrinterOutputDevice, NetworkClusterPrinterOutputDevice - - -## This plugin handles the connection detection & creation of output device objects for the UM3 printer. -# Zero-Conf is used to detect printers, which are saved in a dict. -# If we discover a printer that has the same key as the active machine instance a connection is made. -@signalemitter -class NetworkPrinterOutputDevicePlugin(QObject, OutputDevicePlugin): - def __init__(self): - super().__init__() - self._zero_conf = None - self._browser = None - self._printers = {} - self._cluster_printers_seen = {} # do not forget a cluster printer when we have seen one, to not 'downgrade' from Connect to legacy printer - - self._api_version = "1" - self._api_prefix = "/api/v" + self._api_version + "/" - self._cluster_api_version = "1" - self._cluster_api_prefix = "/cluster-api/v" + self._cluster_api_version + "/" - - self._network_manager = QNetworkAccessManager() - self._network_manager.finished.connect(self._onNetworkRequestFinished) - - # List of old printer names. This is used to ensure that a refresh of zeroconf does not needlessly forces - # authentication requests. - self._old_printers = [] - - # Because the model needs to be created in the same thread as the QMLEngine, we use a signal. - self.addPrinterSignal.connect(self.addPrinter) - self.removePrinterSignal.connect(self.removePrinter) - Application.getInstance().globalContainerStackChanged.connect(self.reCheckConnections) - - # Get list of manual printers from preferences - self._preferences = Preferences.getInstance() - self._preferences.addPreference("um3networkprinting/manual_instances", "") # A comma-separated list of ip adresses or hostnames - self._manual_instances = self._preferences.getValue("um3networkprinting/manual_instances").split(",") - - self._network_requests_buffer = {} # store api responses until data is complete - - # The zeroconf service changed requests are handled in a separate thread, so we can re-schedule the requests - # which fail to get detailed service info. - # Any new or re-scheduled requests will be appended to the request queue, and the handling thread will pick - # them up and process them. - self._service_changed_request_queue = Queue() - self._service_changed_request_event = Event() - self._service_changed_request_thread = Thread(target = self._handleOnServiceChangedRequests, - daemon = True) - self._service_changed_request_thread.start() - - addPrinterSignal = Signal() - removePrinterSignal = Signal() - printerListChanged = Signal() - - ## Start looking for devices on network. - def start(self): - self.startDiscovery() - - def startDiscovery(self): - self.stop() - if self._browser: - self._browser.cancel() - self._browser = None - self._old_printers = [printer_name for printer_name in self._printers] - self._printers = {} - self.printerListChanged.emit() - # After network switching, one must make a new instance of Zeroconf - # On windows, the instance creation is very fast (unnoticable). Other platforms? - self._zero_conf = Zeroconf() - self._browser = ServiceBrowser(self._zero_conf, u'_ultimaker._tcp.local.', [self._appendServiceChangedRequest]) - - # Look for manual instances from preference - for address in self._manual_instances: - if address: - self.addManualPrinter(address) - - def addManualPrinter(self, address): - if address not in self._manual_instances: - self._manual_instances.append(address) - self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances)) - - instance_name = "manual:%s" % address - properties = { - b"name": address.encode("utf-8"), - b"address": address.encode("utf-8"), - b"manual": b"true", - b"incomplete": b"true" - } - - if instance_name not in self._printers: - # Add a preliminary printer instance - self.addPrinter(instance_name, address, properties) - - self.checkManualPrinter(address) - self.checkClusterPrinter(address) - - def removeManualPrinter(self, key, address = None): - if key in self._printers: - if not address: - address = self._printers[key].ipAddress - self.removePrinter(key) - - if address in self._manual_instances: - self._manual_instances.remove(address) - self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances)) - - def checkManualPrinter(self, address): - # Check if a printer exists at this address - # If a printer responds, it will replace the preliminary printer created above - # origin=manual is for tracking back the origin of the call - url = QUrl("http://" + address + self._api_prefix + "system?origin=manual_name") - name_request = QNetworkRequest(url) - self._network_manager.get(name_request) - - def checkClusterPrinter(self, address): - cluster_url = QUrl("http://" + address + self._cluster_api_prefix + "printers/?origin=check_cluster") - cluster_request = QNetworkRequest(cluster_url) - self._network_manager.get(cluster_request) - - ## Handler for all requests that have finished. - def _onNetworkRequestFinished(self, reply): - reply_url = reply.url().toString() - status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) - - if reply.operation() == QNetworkAccessManager.GetOperation: - address = reply.url().host() - if "origin=manual_name" in reply_url: # Name returned from printer. - if status_code == 200: - - try: - system_info = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.JSONDecodeError: - Logger.log("e", "Printer returned invalid JSON.") - return - except UnicodeDecodeError: - Logger.log("e", "Printer returned incorrect UTF-8.") - return - - if address not in self._network_requests_buffer: - self._network_requests_buffer[address] = {} - self._network_requests_buffer[address]["system"] = system_info - elif "origin=check_cluster" in reply_url: - if address not in self._network_requests_buffer: - self._network_requests_buffer[address] = {} - if status_code == 200: - # We know it's a cluster printer - Logger.log("d", "Cluster printer detected: [%s]", reply.url()) - - try: - cluster_printers_list = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.JSONDecodeError: - Logger.log("e", "Printer returned invalid JSON.") - return - except UnicodeDecodeError: - Logger.log("e", "Printer returned incorrect UTF-8.") - return - - self._network_requests_buffer[address]["cluster"] = True - self._network_requests_buffer[address]["cluster_size"] = len(cluster_printers_list) - else: - Logger.log("d", "This url is not from a cluster printer: [%s]", reply.url()) - self._network_requests_buffer[address]["cluster"] = False - - # Both the system call and cluster call are finished - if (address in self._network_requests_buffer and - "system" in self._network_requests_buffer[address] and - "cluster" in self._network_requests_buffer[address]): - - instance_name = "manual:%s" % address - system_info = self._network_requests_buffer[address]["system"] - machine = "unknown" - if "variant" in system_info: - variant = system_info["variant"] - if variant == "Ultimaker 3": - machine = "9066" - elif variant == "Ultimaker 3 Extended": - machine = "9511" - - properties = { - b"name": system_info["name"].encode("utf-8"), - b"address": address.encode("utf-8"), - b"firmware_version": system_info["firmware"].encode("utf-8"), - b"manual": b"true", - b"machine": machine.encode("utf-8") - } - - if self._network_requests_buffer[address]["cluster"]: - properties[b"cluster_size"] = self._network_requests_buffer[address]["cluster_size"] - - if instance_name in self._printers: - # Only replace the printer if it is still in the list of (manual) printers - self.removePrinter(instance_name) - self.addPrinter(instance_name, address, properties) - - del self._network_requests_buffer[address] - - ## Stop looking for devices on network. - def stop(self): - if self._zero_conf is not None: - Logger.log("d", "zeroconf close...") - self._zero_conf.close() - - def getPrinters(self): - return self._printers - - def reCheckConnections(self): - active_machine = Application.getInstance().getGlobalContainerStack() - if not active_machine: - return - - for key in self._printers: - if key == active_machine.getMetaDataEntry("um_network_key"): - if not self._printers[key].isConnected(): - Logger.log("d", "Connecting [%s]..." % key) - self._printers[key].connect() - self._printers[key].connectionStateChanged.connect(self._onPrinterConnectionStateChanged) - else: - if self._printers[key].isConnected(): - Logger.log("d", "Closing connection [%s]..." % key) - self._printers[key].close() - self._printers[key].connectionStateChanged.disconnect(self._onPrinterConnectionStateChanged) - - ## Because the model needs to be created in the same thread as the QMLEngine, we use a signal. - def addPrinter(self, name, address, properties): - cluster_size = int(properties.get(b"cluster_size", -1)) - if cluster_size >= 0: - printer = NetworkClusterPrinterOutputDevice.NetworkClusterPrinterOutputDevice( - name, address, properties, self._api_prefix) - else: - printer = NetworkPrinterOutputDevice.NetworkPrinterOutputDevice(name, address, properties, self._api_prefix) - self._printers[printer.getKey()] = printer - self._cluster_printers_seen[printer.getKey()] = name # Cluster printers that may be temporary unreachable or is rebooted keep being stored here - global_container_stack = Application.getInstance().getGlobalContainerStack() - if global_container_stack and printer.getKey() == global_container_stack.getMetaDataEntry("um_network_key"): - if printer.getKey() not in self._old_printers: # Was the printer already connected, but a re-scan forced? - Logger.log("d", "addPrinter, connecting [%s]..." % printer.getKey()) - self._printers[printer.getKey()].connect() - printer.connectionStateChanged.connect(self._onPrinterConnectionStateChanged) - self.printerListChanged.emit() - - def removePrinter(self, name): - printer = self._printers.pop(name, None) - if printer: - if printer.isConnected(): - printer.disconnect() - printer.connectionStateChanged.disconnect(self._onPrinterConnectionStateChanged) - Logger.log("d", "removePrinter, disconnecting [%s]..." % name) - self.printerListChanged.emit() - - ## Handler for when the connection state of one of the detected printers changes - def _onPrinterConnectionStateChanged(self, key): - if key not in self._printers: - return - if self._printers[key].isConnected(): - self.getOutputDeviceManager().addOutputDevice(self._printers[key]) - else: - self.getOutputDeviceManager().removeOutputDevice(key) - - ## Handler for zeroConf detection. - # Return True or False indicating if the process succeeded. - def _onServiceChanged(self, zeroconf, service_type, name, state_change): - if state_change == ServiceStateChange.Added: - Logger.log("d", "Bonjour service added: %s" % name) - - # First try getting info from zeroconf cache - info = ServiceInfo(service_type, name, properties = {}) - for record in zeroconf.cache.entries_with_name(name.lower()): - info.update_record(zeroconf, time.time(), record) - - for record in zeroconf.cache.entries_with_name(info.server): - info.update_record(zeroconf, time.time(), record) - if info.address: - break - - # Request more data if info is not complete - if not info.address: - Logger.log("d", "Trying to get address of %s", name) - info = zeroconf.get_service_info(service_type, name) - - if info: - type_of_device = info.properties.get(b"type", None) - if type_of_device: - if type_of_device == b"printer": - address = '.'.join(map(lambda n: str(n), info.address)) - self.addPrinterSignal.emit(str(name), address, info.properties) - else: - Logger.log("w", "The type of the found device is '%s', not 'printer'! Ignoring.." % type_of_device ) - else: - Logger.log("w", "Could not get information about %s" % name) - return False - - elif state_change == ServiceStateChange.Removed: - Logger.log("d", "Bonjour service removed: %s" % name) - self.removePrinterSignal.emit(str(name)) - - return True - - ## Appends a service changed request so later the handling thread will pick it up and processes it. - def _appendServiceChangedRequest(self, zeroconf, service_type, name, state_change): - # append the request and set the event so the event handling thread can pick it up - item = (zeroconf, service_type, name, state_change) - self._service_changed_request_queue.put(item) - self._service_changed_request_event.set() - - def _handleOnServiceChangedRequests(self): - while True: - # wait for the event to be set - self._service_changed_request_event.wait(timeout = 5.0) - # stop if the application is shutting down - if Application.getInstance().isShuttingDown(): - return - - self._service_changed_request_event.clear() - - # handle all pending requests - reschedule_requests = [] # a list of requests that have failed so later they will get re-scheduled - while not self._service_changed_request_queue.empty(): - request = self._service_changed_request_queue.get() - zeroconf, service_type, name, state_change = request - try: - result = self._onServiceChanged(zeroconf, service_type, name, state_change) - if not result: - reschedule_requests.append(request) - except Exception: - Logger.logException("e", "Failed to get service info for [%s] [%s], the request will be rescheduled", - service_type, name) - reschedule_requests.append(request) - - # re-schedule the failed requests if any - if reschedule_requests: - for request in reschedule_requests: - self._service_changed_request_queue.put(request) - - @pyqtSlot() - def openControlPanel(self): - Logger.log("d", "Opening print jobs web UI...") - selected_device = self.getOutputDeviceManager().getActiveDevice() - if isinstance(selected_device, NetworkClusterPrinterOutputDevice.NetworkClusterPrinterOutputDevice): - QDesktopServices.openUrl(QUrl(selected_device.getPrintJobsUrl())) diff --git a/plugins/UM3NetworkPrinting/__init__.py b/plugins/UM3NetworkPrinting/__init__.py index 6dd86a16d2..b68086cb75 100644 --- a/plugins/UM3NetworkPrinting/__init__.py +++ b/plugins/UM3NetworkPrinting/__init__.py @@ -1,6 +1,6 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from . import NetworkPrinterOutputDevicePlugin + from . import DiscoverUM3Action from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") From b61832bc03b6367b18d8182c4e10fd51275317b5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 12 Dec 2017 10:41:27 +0100 Subject: [PATCH 098/551] Added manual entry to prevent jogging for UM3 I've not had the time to properly build it yet, so disabling it for now CL-541 --- plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py index c476673353..7a0e113d5b 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py @@ -18,6 +18,9 @@ class LegacyUM3PrinterOutputController(PrinterOutputController): self._preheat_bed_timer.setSingleShot(True) self._preheat_bed_timer.timeout.connect(self._onPreheatBedTimerFinished) self._preheat_printer = None + + self.can_control_manually = False + # Are we still waiting for a response about preheat? # We need this so we can already update buttons, so it feels more snappy. self._preheat_request_in_progress = False From 005ba4ac5300d86a86fd86a1464bd5d645928cb5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 14 Dec 2017 09:34:16 +0100 Subject: [PATCH 099/551] Changed hotend properties to float CL-541 --- cura/PrinterOutput/ExtruderOuputModel.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cura/PrinterOutput/ExtruderOuputModel.py b/cura/PrinterOutput/ExtruderOuputModel.py index f8f8088389..b0be6cbbe4 100644 --- a/cura/PrinterOutput/ExtruderOuputModel.py +++ b/cura/PrinterOutput/ExtruderOuputModel.py @@ -36,28 +36,28 @@ class ExtruderOutputModel(QObject): self.activeMaterialChanged.emit() ## Update the hotend temperature. This only changes it locally. - def updateHotendTemperature(self, temperature: int): + def updateHotendTemperature(self, temperature: float): if self._hotend_temperature != temperature: self._hotend_temperature = temperature self.hotendTemperatureChanged.emit() - def updateTargetHotendTemperature(self, temperature: int): + def updateTargetHotendTemperature(self, temperature: float): if self._target_hotend_temperature != temperature: self._target_hotend_temperature = temperature self.targetHotendTemperatureChanged.emit() ## Set the target hotend temperature. This ensures that it's actually sent to the remote. - @pyqtSlot(int) - def setTargetHotendTemperature(self, temperature: int): + @pyqtSlot(float) + def setTargetHotendTemperature(self, temperature: float): self._printer.getController().setTargetHotendTemperature(self._printer, self, temperature) self.updateTargetHotendTemperature(temperature) - @pyqtProperty(int, notify = targetHotendTemperatureChanged) - def targetHotendTemperature(self) -> int: + @pyqtProperty(float, notify = targetHotendTemperatureChanged) + def targetHotendTemperature(self) -> float: return self._target_hotend_temperature - @pyqtProperty(int, notify=hotendTemperatureChanged) - def hotendTemperature(self) -> int: + @pyqtProperty(float, notify=hotendTemperatureChanged) + def hotendTemperature(self) -> float: return self._hotend_temperature @pyqtProperty(str, notify = hotendIDChanged) From 80526893c277ce66853e0dae871ea3b0261a0f96 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 14 Dec 2017 09:36:31 +0100 Subject: [PATCH 100/551] Made setAcceptsCommands protected CL-541 --- cura/PrinterOutputDevice.py | 2 +- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index fdf9a77145..f8408947ab 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -138,7 +138,7 @@ class PrinterOutputDevice(QObject, OutputDevice): return self._accepts_commands ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands - def setAcceptsCommands(self, accepts_commands): + def _setAcceptsCommands(self, accepts_commands): if self._accepts_commands != accepts_commands: self._accepts_commands = accepts_commands diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 967c99995e..e8e340e333 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -79,9 +79,9 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def _onAuthenticationStateChanged(self): # We only accept commands if we are authenticated. if self._authentication_state == AuthState.Authenticated: - self.setAcceptsCommands(True) + self._setAcceptsCommands(True) else: - self.setAcceptsCommands(False) + self._setAcceptsCommands(False) def _setupMessages(self): self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status", From d3b9ac0d4550ca0dc24334d5be491b3563d963a5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 14 Dec 2017 17:37:57 +0100 Subject: [PATCH 101/551] Also start reworking the USBPrint. It's also time for some much needed code cleaning in that bit. The auto-detect is moved to it's own job, which should make it a whole lot easier to disable it all together. CL-541 --- cura/PrinterOutputDevice.py | 4 + plugins/USBPrinting/AutoDetectBaudJob.py | 44 + plugins/USBPrinting/USBPrinterOutputDevice.py | 792 ++---------------- .../USBPrinterOutputDeviceManager.py | 114 +-- 4 files changed, 146 insertions(+), 808 deletions(-) create mode 100644 plugins/USBPrinting/AutoDetectBaudJob.py diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index f8408947ab..458d0a1080 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -67,6 +67,10 @@ class PrinterOutputDevice(QObject, OutputDevice): self._connection_state = connection_state self.connectionStateChanged.emit(self._id) + @pyqtProperty(str, notify = connectionStateChanged) + def connectionState(self): + return self._connection_state + def _update(self): pass diff --git a/plugins/USBPrinting/AutoDetectBaudJob.py b/plugins/USBPrinting/AutoDetectBaudJob.py new file mode 100644 index 0000000000..8dcc705397 --- /dev/null +++ b/plugins/USBPrinting/AutoDetectBaudJob.py @@ -0,0 +1,44 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Job import Job +from UM.Logger import Logger + +from time import time +from serial import Serial, SerialException + +class AutoDetectBaudJob(Job): + def __init__(self, serial_port): + super().__init__() + self._serial_port = serial_port + self._all_baud_rates = [115200, 250000, 230400, 57600, 38400, 19200, 9600] + + def run(self): + Logger.log("d", "Auto detect baud rate started.") + timeout = 3 + + for baud_rate in self._all_baud_rates: + Logger.log("d", "Checking {serial} if baud rate {baud_rate} works".format(serial= self._serial_port, baud_rate = baud_rate)) + try: + serial = Serial(str(self._serial_port), baud_rate, timeout = timeout, writeTimeout = timeout) + except SerialException as e: + Logger.logException("w", "Unable to create serial") + continue + + successful_responses = 0 + + serial.write(b"\n") # Ensure we clear out previous responses + serial.write(b"M105\n") + + timeout_time = time() + timeout + + while timeout_time > time(): + line = serial.readline() + if b"ok T:" in line: + successful_responses += 1 + if successful_responses >= 3: + self.setResult(baud_rate) + return + + serial.write(b"M105\n") + self.setResult(None) # Unable to detect the correct baudrate. \ No newline at end of file diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 1930f5402b..e406d0a479 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -1,752 +1,114 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from .avr_isp import stk500v2, ispBase, intelHex -import serial # type: ignore -import threading -import time -import queue -import re -import functools - -from UM.Application import Application from UM.Logger import Logger -from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState -from UM.Message import Message -from UM.Qt.Duration import DurationFormat - -from PyQt5.QtCore import QUrl, pyqtSlot, pyqtSignal, pyqtProperty - from UM.i18n import i18nCatalog +from UM.Application import Application + +from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState +from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + +from .AutoDetectBaudJob import AutoDetectBaudJob + +from serial import Serial, SerialException +from threading import Thread +from time import time + +import re + catalog = i18nCatalog("cura") class USBPrinterOutputDevice(PrinterOutputDevice): - def __init__(self, serial_port): + def __init__(self, serial_port, baud_rate = None): super().__init__(serial_port) self.setName(catalog.i18nc("@item:inmenu", "USB printing")) self.setShortDescription(catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print via USB")) self.setDescription(catalog.i18nc("@info:tooltip", "Print via USB")) self.setIconName("print") - self.setConnectionText(catalog.i18nc("@info:status", "Connected via USB")) self._serial = None self._serial_port = serial_port - self._error_state = None - self._connect_thread = threading.Thread(target = self._connect) - self._connect_thread.daemon = True + self._timeout = 3 - self._end_stop_thread = None - self._poll_endstop = False + self._use_auto_detect = True - # The baud checking is done by sending a number of m105 commands to the printer and waiting for a readable - # response. If the baudrate is correct, this should make sense, else we get giberish. - self._required_responses_auto_baud = 3 + self._baud_rate = baud_rate + self._all_baud_rates = [115200, 250000, 230400, 57600, 38400, 19200, 9600] - self._listen_thread = threading.Thread(target=self._listen) - self._listen_thread.daemon = True + # Instead of using a timer, we really need the update to be as a thread, as reading from serial can block. + self._update_thread = Thread(target=self._update, daemon = True) - self._update_firmware_thread = threading.Thread(target= self._updateFirmware) - self._update_firmware_thread.daemon = True - self.firmwareUpdateComplete.connect(self._onFirmwareUpdateComplete) + self._last_temperature_request = None - self._heatup_wait_start_time = time.time() + def _autoDetectFinished(self, job): + result = job.getResult() + if result is not None: + self.setBaudRate(result) + self.connect() # Try to connect (actually create serial, etc) - self.jobStateChanged.connect(self._onJobStateChanged) - - ## Queue for commands that need to be send. Used when command is sent when a print is active. - self._command_queue = queue.Queue() - - self._is_printing = False - self._is_paused = False - - ## Set when print is started in order to check running time. - self._print_start_time = None - self._print_estimated_time = None - - ## Keep track where in the provided g-code the print is - self._gcode_position = 0 - - # List of gcode lines to be printed - self._gcode = [] - - # Check if endstops are ever pressed (used for first run) - self._x_min_endstop_pressed = False - self._y_min_endstop_pressed = False - self._z_min_endstop_pressed = False - - self._x_max_endstop_pressed = False - self._y_max_endstop_pressed = False - self._z_max_endstop_pressed = False - - # In order to keep the connection alive we request the temperature every so often from a different extruder. - # This index is the extruder we requested data from the last time. - self._temperature_requested_extruder_index = 0 - - self._current_z = 0 - - self._updating_firmware = False - - self._firmware_file_name = None - self._firmware_update_finished = False - - self._error_message = None - self._error_code = 0 - - onError = pyqtSignal() - - firmwareUpdateComplete = pyqtSignal() - firmwareUpdateChange = pyqtSignal() - - endstopStateChanged = pyqtSignal(str ,bool, arguments = ["key","state"]) - - def _setTargetBedTemperature(self, temperature): - Logger.log("d", "Setting bed temperature to %s", temperature) - self._sendCommand("M140 S%s" % temperature) - - def _setTargetHotendTemperature(self, index, temperature): - Logger.log("d", "Setting hotend %s temperature to %s", index, temperature) - self._sendCommand("M104 T%s S%s" % (index, temperature)) - - def _setHeadPosition(self, x, y , z, speed): - self._sendCommand("G0 X%s Y%s Z%s F%s" % (x, y, z, speed)) - - def _setHeadX(self, x, speed): - self._sendCommand("G0 X%s F%s" % (x, speed)) - - def _setHeadY(self, y, speed): - self._sendCommand("G0 Y%s F%s" % (y, speed)) - - def _setHeadZ(self, z, speed): - self._sendCommand("G0 Y%s F%s" % (z, speed)) - - def _homeHead(self): - self._sendCommand("G28 X") - self._sendCommand("G28 Y") - - def _homeBed(self): - self._sendCommand("G28 Z") - - ## Updates the target bed temperature from the printer, and emit a signal if it was changed. - # - # /param temperature The new target temperature of the bed. - # /return boolean, True if the temperature was changed, false if the new temperature has the same value as the already stored temperature - def _updateTargetBedTemperature(self, temperature): - if self._target_bed_temperature == temperature: - return False - self._target_bed_temperature = temperature - self.targetBedTemperatureChanged.emit() - return True - - ## Updates the target hotend temperature from the printer, and emit a signal if it was changed. - # - # /param index The index of the hotend. - # /param temperature The new target temperature of the hotend. - # /return boolean, True if the temperature was changed, false if the new temperature has the same value as the already stored temperature - def _updateTargetHotendTemperature(self, index, temperature): - if self._target_hotend_temperatures[index] == temperature: - return False - self._target_hotend_temperatures[index] = temperature - self.targetHotendTemperaturesChanged.emit() - return True - - ## A name for the device. - @pyqtProperty(str, constant = True) - def name(self): - return self.getName() - - ## The address of the device. - @pyqtProperty(str, constant = True) - def address(self): - return self._serial_port - - def startPrint(self): - self.writeStarted.emit(self) - gcode_list = getattr( Application.getInstance().getController().getScene(), "gcode_list") - self._updateJobState("printing") - self.printGCode(gcode_list) - - def _moveHead(self, x, y, z, speed): - self._sendCommand("G91") - self._sendCommand("G0 X%s Y%s Z%s F%s" % (x, y, z, speed)) - self._sendCommand("G90") - - ## Start a print based on a g-code. - # \param gcode_list List with gcode (strings). - def printGCode(self, gcode_list): - Logger.log("d", "Started printing g-code") - if self._progress or self._connection_state != ConnectionState.connected: - self._error_message = Message(catalog.i18nc("@info:status", "Unable to start a new job because the printer is busy or not connected."), title = catalog.i18nc("@info:title", "Printer Unavailable")) - self._error_message.show() - Logger.log("d", "Printer is busy or not connected, aborting print") - self.writeError.emit(self) - return - - self._gcode.clear() - for layer in gcode_list: - self._gcode.extend(layer.split("\n")) - - # Reset line number. If this is not done, first line is sometimes ignored - self._gcode.insert(0, "M110") - self._gcode_position = 0 - self._is_printing = True - self._print_start_time = time.time() - - for i in range(0, 4): # Push first 4 entries before accepting other inputs - self._sendNextGcodeLine() - - self.writeFinished.emit(self) - - ## Get the serial port string of this connection. - # \return serial port - def getSerialPort(self): - return self._serial_port - - ## Try to connect the serial. This simply starts the thread, which runs _connect. - def connect(self): - if not self._updating_firmware and not self._connect_thread.isAlive(): - self._connect_thread.start() - - ## Private function (threaded) that actually uploads the firmware. - def _updateFirmware(self): - Logger.log("d", "Attempting to update firmware") - self._error_code = 0 - self.setProgress(0, 100) - self._firmware_update_finished = False - - if self._connection_state != ConnectionState.closed: - self.close() - hex_file = intelHex.readHex(self._firmware_file_name) - - if len(hex_file) == 0: - Logger.log("e", "Unable to read provided hex file. Could not update firmware") - self._updateFirmwareFailedMissingFirmware() - return - - programmer = stk500v2.Stk500v2() - programmer.progress_callback = self.setProgress - - try: - programmer.connect(self._serial_port) - except Exception: - programmer.close() - pass - - # Give programmer some time to connect. Might need more in some cases, but this worked in all tested cases. - time.sleep(1) - - if not programmer.isConnected(): - Logger.log("e", "Unable to connect with serial. Could not update firmware") - self._updateFirmwareFailedCommunicationError() - return - - self._updating_firmware = True - - try: - programmer.programChip(hex_file) - self._updating_firmware = False - except serial.SerialException as e: - Logger.log("e", "SerialException while trying to update firmware: <%s>" %(repr(e))) - self._updateFirmwareFailedIOError() - return - except Exception as e: - Logger.log("e", "Exception while trying to update firmware: <%s>" %(repr(e))) - self._updateFirmwareFailedUnknown() - return - programmer.close() - - self._updateFirmwareCompletedSucessfully() - return - - ## Private function which makes sure that firmware update process has failed by missing firmware - def _updateFirmwareFailedMissingFirmware(self): - return self._updateFirmwareFailedCommon(4) - - ## Private function which makes sure that firmware update process has failed by an IO error - def _updateFirmwareFailedIOError(self): - return self._updateFirmwareFailedCommon(3) - - ## Private function which makes sure that firmware update process has failed by a communication problem - def _updateFirmwareFailedCommunicationError(self): - return self._updateFirmwareFailedCommon(2) - - ## Private function which makes sure that firmware update process has failed by an unknown error - def _updateFirmwareFailedUnknown(self): - return self._updateFirmwareFailedCommon(1) - - ## Private common function which makes sure that firmware update process has completed/ended with a set progress state - def _updateFirmwareFailedCommon(self, code): - if not code: - raise Exception("Error code not set!") - - self._error_code = code - - self._firmware_update_finished = True - self.resetFirmwareUpdate(update_has_finished = True) - self.progressChanged.emit() - self.firmwareUpdateComplete.emit() - - return - - ## Private function which makes sure that firmware update process has successfully completed - def _updateFirmwareCompletedSucessfully(self): - self.setProgress(100, 100) - self._firmware_update_finished = True - self.resetFirmwareUpdate(update_has_finished = True) - self.firmwareUpdateComplete.emit() - - return - - ## Upload new firmware to machine - # \param filename full path of firmware file to be uploaded - def updateFirmware(self, file_name): - Logger.log("i", "Updating firmware of %s using %s", self._serial_port, file_name) - self._firmware_file_name = file_name - self._update_firmware_thread.start() - - @property - def firmwareUpdateFinished(self): - return self._firmware_update_finished - - def resetFirmwareUpdate(self, update_has_finished = False): - self._firmware_update_finished = update_has_finished - self.firmwareUpdateChange.emit() - - @pyqtSlot() - def startPollEndstop(self): - if not self._poll_endstop: - self._poll_endstop = True - if self._end_stop_thread is None: - self._end_stop_thread = threading.Thread(target=self._pollEndStop) - self._end_stop_thread.daemon = True - self._end_stop_thread.start() - - @pyqtSlot() - def stopPollEndstop(self): - self._poll_endstop = False - self._end_stop_thread = None - - def _pollEndStop(self): - while self._connection_state == ConnectionState.connected and self._poll_endstop: - self.sendCommand("M119") - time.sleep(0.5) - - ## Private connect function run by thread. Can be started by calling connect. - def _connect(self): - Logger.log("d", "Attempting to connect to %s", self._serial_port) - self.setConnectionState(ConnectionState.connecting) - programmer = stk500v2.Stk500v2() - try: - programmer.connect(self._serial_port) # Connect with the serial, if this succeeds, it's an arduino based usb device. - self._serial = programmer.leaveISP() - except ispBase.IspError as e: - programmer.close() - Logger.log("i", "Could not establish connection on %s: %s. Device is not arduino based." %(self._serial_port,str(e))) - except Exception as e: - programmer.close() - Logger.log("i", "Could not establish connection on %s, unknown reasons. Device is not arduino based." % self._serial_port) - - # If the programmer connected, we know its an atmega based version. - # Not all that useful, but it does give some debugging information. - for baud_rate in self._getBaudrateList(): # Cycle all baud rates (auto detect) - Logger.log("d", "Attempting to connect to printer with serial %s on baud rate %s", self._serial_port, baud_rate) - if self._serial is None: - try: - self._serial = serial.Serial(str(self._serial_port), baud_rate, timeout = 3, writeTimeout = 10000) - time.sleep(10) - except serial.SerialException: - Logger.log("d", "Could not open port %s" % self._serial_port) - continue - else: - if not self.setBaudRate(baud_rate): - continue # Could not set the baud rate, go to the next - - time.sleep(1.5) # Ensure that we are not talking to the bootloader. 1.5 seconds seems to be the magic number - sucesfull_responses = 0 - timeout_time = time.time() + 5 - self._serial.write(b"\n") - self._sendCommand("M105") # Request temperature, as this should (if baudrate is correct) result in a command with "T:" in it - while timeout_time > time.time(): - line = self._readline() - if line is None: - Logger.log("d", "No response from serial connection received.") - # Something went wrong with reading, could be that close was called. - self.setConnectionState(ConnectionState.closed) - return - - if b"T:" in line: - Logger.log("d", "Correct response for auto-baudrate detection received.") - self._serial.timeout = 0.5 - sucesfull_responses += 1 - if sucesfull_responses >= self._required_responses_auto_baud: - self._serial.timeout = 2 # Reset serial timeout - self.setConnectionState(ConnectionState.connected) - self._listen_thread.start() # Start listening - Logger.log("i", "Established printer connection on port %s" % self._serial_port) - return - - self._sendCommand("M105") # Send M105 as long as we are listening, otherwise we end up in an undefined state - - Logger.log("e", "Baud rate detection for %s failed", self._serial_port) - self.close() # Unable to connect, wrap up. - self.setConnectionState(ConnectionState.closed) - - ## Set the baud rate of the serial. This can cause exceptions, but we simply want to ignore those. def setBaudRate(self, baud_rate): - try: - self._serial.baudrate = baud_rate - return True - except Exception as e: - return False + if baud_rate not in self._all_baud_rates: + Logger.log("w", "Not updating baudrate to {baud_rate} as it's an unknown baudrate".format(baud_rate=baud_rate)) + return - ## Close the printer connection - def close(self): - Logger.log("d", "Closing the USB printer connection.") - if self._connect_thread.isAlive(): + self._baud_rate = baud_rate + + def connect(self): + if self._baud_rate is None: + if self._use_auto_detect: + auto_detect_job = AutoDetectBaudJob(self._serial_port) + auto_detect_job.start() + auto_detect_job.finished.connect(self._autoDetectFinished) + return + if self._serial is None: try: - self._connect_thread.join() - except Exception as e: - Logger.log("d", "PrinterConnection.close: %s (expected)", e) - pass # This should work, but it does fail sometimes for some reason + self._serial = Serial(str(self._serial_port), self._baud_rate, timeout=self._timeout, writeTimeout=self._timeout) + except SerialException: + return + container_stack = Application.getInstance().getGlobalContainerStack() + num_extruders = container_stack.getProperty("machine_extruder_count", "value") - self._connect_thread = threading.Thread(target = self._connect) - self._connect_thread.daemon = True + # Ensure that a printer is created. + self._printers = [PrinterOutputModel(output_controller=None, number_of_extruders=num_extruders)] + self.setConnectionState(ConnectionState.connected) + self._update_thread.start() - self.setConnectionState(ConnectionState.closed) - if self._serial is not None: - try: - self._listen_thread.join() - except: - pass - if self._serial is not None: # Avoid a race condition when a thread can change the value of self._serial to None - self._serial.close() + def sendCommand(self, command): + if self._connection_state == ConnectionState.connected: + self._sendCommand(command) - self._listen_thread = threading.Thread(target = self._listen) - self._listen_thread.daemon = True - self._serial = None - - ## Directly send the command, withouth checking connection state (eg; printing). - # \param cmd string with g-code - def _sendCommand(self, cmd): + def _sendCommand(self, command): if self._serial is None: return - if "M109" in cmd or "M190" in cmd: - self._heatup_wait_start_time = time.time() + if type(command == str):q + command = (command + "\n").encode() + if not command.endswith(b"\n"): + command += b"\n" - try: - command = (cmd + "\n").encode() - self._serial.write(b"\n") - self._serial.write(command) - except serial.SerialTimeoutException: - Logger.log("w","Serial timeout while writing to serial port, trying again.") - try: - time.sleep(0.5) - self._serial.write((cmd + "\n").encode()) - except Exception as e: - Logger.log("e","Unexpected error while writing serial port %s " % e) - self._setErrorState("Unexpected error while writing serial port %s " % e) - self.close() - except Exception as e: - Logger.log("e","Unexpected error while writing serial port %s" % e) - self._setErrorState("Unexpected error while writing serial port %s " % e) - self.close() + self._serial.write(b"\n") + self._serial.write(command) - ## Send a command to printer. - # \param cmd string with g-code - def sendCommand(self, cmd): - if self._progress: - self._command_queue.put(cmd) - elif self._connection_state == ConnectionState.connected: - self._sendCommand(cmd) + def _update(self): + while self._connection_state == ConnectionState.connected and self._serial is not None: + line = self._serial.readline() + if self._last_temperature_request is None or time() > self._last_temperature_request + self._timeout: + # Timeout, or no request has been sent at all. + self.sendCommand("M105") + self._last_temperature_request = time() - ## Set the error state with a message. - # \param error String with the error message. - def _setErrorState(self, error): - self._updateJobState("error") - self._error_state = error - self.onError.emit() + if b"ok T:" in line or line.startswith(b"T:"): # Temperature message + extruder_temperature_matches = re.findall(b"T(\d*): ?([\d\.]+) ?\/?([\d\.]+)?", line) + # Update all temperature values + for match, extruder in zip(extruder_temperature_matches, self._printers[0].extruders): + extruder.updateHotendTemperature(float(match[1])) + extruder.updateTargetHotendTemperature(float(match[2])) - ## Request the current scene to be sent to a USB-connected printer. - # - # \param nodes A collection of scene nodes to send. This is ignored. - # \param file_name \type{string} A suggestion for a file name to write. - # \param filter_by_machine Whether to filter MIME types by machine. This - # is ignored. - # \param kwargs Keyword arguments. - def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs): - container_stack = Application.getInstance().getGlobalContainerStack() - - if container_stack.getProperty("machine_gcode_flavor", "value") == "UltiGCode": - self._error_message = Message(catalog.i18nc("@info:status", "This printer does not support USB printing because it uses UltiGCode flavor."), title = catalog.i18nc("@info:title", "USB Printing")) - self._error_message.show() - return - elif not container_stack.getMetaDataEntry("supports_usb_connection"): - self._error_message = Message(catalog.i18nc("@info:status", "Unable to start a new job because the printer does not support usb printing."), title = catalog.i18nc("@info:title", "Warning")) - self._error_message.show() - return - - self.setJobName(file_name) - self._print_estimated_time = int(Application.getInstance().getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.Seconds)) - - Application.getInstance().getController().setActiveStage("MonitorStage") - self.startPrint() - - def _setEndstopState(self, endstop_key, value): - if endstop_key == b"x_min": - if self._x_min_endstop_pressed != value: - self.endstopStateChanged.emit("x_min", value) - self._x_min_endstop_pressed = value - elif endstop_key == b"y_min": - if self._y_min_endstop_pressed != value: - self.endstopStateChanged.emit("y_min", value) - self._y_min_endstop_pressed = value - elif endstop_key == b"z_min": - if self._z_min_endstop_pressed != value: - self.endstopStateChanged.emit("z_min", value) - self._z_min_endstop_pressed = value - - ## Listen thread function. - def _listen(self): - Logger.log("i", "Printer connection listen thread started for %s" % self._serial_port) - container_stack = Application.getInstance().getGlobalContainerStack() - temperature_request_timeout = time.time() - ok_timeout = time.time() - while self._connection_state == ConnectionState.connected: - line = self._readline() - if line is None: - break # None is only returned when something went wrong. Stop listening - - if time.time() > temperature_request_timeout: - if self._num_extruders > 1: - self._temperature_requested_extruder_index = (self._temperature_requested_extruder_index + 1) % self._num_extruders - self.sendCommand("M105 T%d" % (self._temperature_requested_extruder_index)) - else: - self.sendCommand("M105") - temperature_request_timeout = time.time() + 5 - - if line.startswith(b"Error:"): - # Oh YEAH, consistency. - # Marlin reports a MIN/MAX temp error as "Error:x\n: Extruder switched off. MAXTEMP triggered !\n" - # But a bed temp error is reported as "Error: Temperature heated bed switched off. MAXTEMP triggered !!" - # So we can have an extra newline in the most common case. Awesome work people. - if re.match(b"Error:[0-9]\n", line): - line = line.rstrip() + self._readline() - - # Skip the communication errors, as those get corrected. - if b"Extruder switched off" in line or b"Temperature heated bed switched off" in line or b"Something is wrong, please turn off the printer." in line: - if not self.hasError(): - self._setErrorState(line[6:]) - - elif b" T:" in line or line.startswith(b"T:"): # Temperature message - temperature_matches = re.findall(b"T(\d*): ?([\d\.]+) ?\/?([\d\.]+)?", line) - temperature_set = False - try: - for match in temperature_matches: - if match[0]: - extruder_nr = int(match[0]) - if extruder_nr >= container_stack.getProperty("machine_extruder_count", "value"): - continue - if match[1]: - self._setHotendTemperature(extruder_nr, float(match[1])) - temperature_set = True - if match[2]: - self._updateTargetHotendTemperature(extruder_nr, float(match[2])) - else: - requested_temperatures = match - if not temperature_set and requested_temperatures: - if requested_temperatures[1]: - self._setHotendTemperature(self._temperature_requested_extruder_index, float(requested_temperatures[1])) - if requested_temperatures[2]: - self._updateTargetHotendTemperature(self._temperature_requested_extruder_index, float(requested_temperatures[2])) - except: - Logger.log("w", "Could not parse hotend temperatures from response: %s", line) - # Check if there's also a bed temperature - temperature_matches = re.findall(b"B: ?([\d\.]+) ?\/?([\d\.]+)?", line) - if container_stack.getProperty("machine_heated_bed", "value") and len(temperature_matches) > 0: - match = temperature_matches[0] - try: - if match[0]: - self._setBedTemperature(float(match[0])) - if match[1]: - self._updateTargetBedTemperature(float(match[1])) - except: - Logger.log("w", "Could not parse bed temperature from response: %s", line) - - elif b"_min" in line or b"_max" in line: - tag, value = line.split(b":", 1) - self._setEndstopState(tag,(b"H" in value or b"TRIGGERED" in value)) - - if self._is_printing: - if line == b"" and time.time() > ok_timeout: - line = b"ok" # Force a timeout (basically, send next command) - - if b"ok" in line: - ok_timeout = time.time() + 5 - if not self._command_queue.empty(): - self._sendCommand(self._command_queue.get()) - elif self._is_paused: - line = b"" # Force getting temperature as keep alive - else: - self._sendNextGcodeLine() - elif b"resend" in line.lower() or b"rs" in line: # Because a resend can be asked with "resend" and "rs" - try: - Logger.log("d", "Got a resend response") - self._gcode_position = int(line.replace(b"N:",b" ").replace(b"N",b" ").replace(b":",b" ").split()[-1]) - except: - if b"rs" in line: - self._gcode_position = int(line.split()[1]) - - # Request the temperature on comm timeout (every 2 seconds) when we are not printing.) - if line == b"": - if self._num_extruders > 1: - self._temperature_requested_extruder_index = (self._temperature_requested_extruder_index + 1) % self._num_extruders - self.sendCommand("M105 T%d" % self._temperature_requested_extruder_index) - else: - self.sendCommand("M105") - - Logger.log("i", "Printer connection listen thread stopped for %s" % self._serial_port) - - ## Send next Gcode in the gcode list - def _sendNextGcodeLine(self): - if self._gcode_position >= len(self._gcode): - return - line = self._gcode[self._gcode_position] - - if ";" in line: - line = line[:line.find(";")] - line = line.strip() - - # Don't send empty lines. But we do have to send something, so send - # m105 instead. - # Don't send the M0 or M1 to the machine, as M0 and M1 are handled as - # an LCD menu pause. - if line == "" or line == "M0" or line == "M1": - line = "M105" - try: - if ("G0" in line or "G1" in line) and "Z" in line: - z = float(re.search("Z([0-9\.]*)", line).group(1)) - if self._current_z != z: - self._current_z = z - except Exception as e: - Logger.log("e", "Unexpected error with printer connection, could not parse current Z: %s: %s" % (e, line)) - self._setErrorState("Unexpected error: %s" %e) - checksum = functools.reduce(lambda x,y: x^y, map(ord, "N%d%s" % (self._gcode_position, line))) - - self._sendCommand("N%d%s*%d" % (self._gcode_position, line, checksum)) - - progress = (self._gcode_position / len(self._gcode)) - - elapsed_time = int(time.time() - self._print_start_time) - self.setTimeElapsed(elapsed_time) - estimated_time = self._print_estimated_time - if progress > .1: - estimated_time = self._print_estimated_time * (1-progress) + elapsed_time - self.setTimeTotal(estimated_time) - - self._gcode_position += 1 - self.setProgress(progress * 100) - self.progressChanged.emit() - - ## Set the state of the print. - # Sent from the print monitor - def _setJobState(self, job_state): - if job_state == "pause": - self._is_paused = True - self._updateJobState("paused") - elif job_state == "print": - self._is_paused = False - self._updateJobState("printing") - elif job_state == "abort": - self.cancelPrint() - - def _onJobStateChanged(self): - # clear the job name & times when printing is done or aborted - if self._job_state == "ready": - self.setJobName("") - self.setTimeElapsed(0) - self.setTimeTotal(0) - - ## Set the progress of the print. - # It will be normalized (based on max_progress) to range 0 - 100 - def setProgress(self, progress, max_progress = 100): - self._progress = (progress / max_progress) * 100 # Convert to scale of 0-100 - if self._progress == 100: - # Printing is done, reset progress - self._gcode_position = 0 - self.setProgress(0) - self._is_printing = False - self._is_paused = False - self._updateJobState("ready") - self.progressChanged.emit() - - ## Cancel the current print. Printer connection wil continue to listen. - def cancelPrint(self): - self._gcode_position = 0 - self.setProgress(0) - self._gcode = [] - - # Turn off temperatures, fan and steppers - self._sendCommand("M140 S0") - self._sendCommand("M104 S0") - self._sendCommand("M107") - # Home XY to prevent nozzle resting on aborted print - # Don't home bed because it may crash the printhead into the print on printers that home on the bottom - self.homeHead() - self._sendCommand("M84") - self._is_printing = False - self._is_paused = False - self._updateJobState("ready") - Application.getInstance().getController().setActiveStage("PrepareStage") - - ## Check if the process did not encounter an error yet. - def hasError(self): - return self._error_state is not None - - ## private read line used by printer connection to listen for data on serial port. - def _readline(self): - if self._serial is None: - return None - try: - ret = self._serial.readline() - except Exception as e: - Logger.log("e", "Unexpected error while reading serial port. %s" % e) - self._setErrorState("Printer has been disconnected") - self.close() - return None - return ret - - ## Create a list of baud rates at which we can communicate. - # \return list of int - def _getBaudrateList(self): - ret = [115200, 250000, 230400, 57600, 38400, 19200, 9600] - return ret - - def _onFirmwareUpdateComplete(self): - self._update_firmware_thread.join() - self._update_firmware_thread = threading.Thread(target = self._updateFirmware) - self._update_firmware_thread.daemon = True - - self.connect() - - ## Pre-heats the heated bed of the printer, if it has one. - # - # \param temperature The temperature to heat the bed to, in degrees - # Celsius. - # \param duration How long the bed should stay warm, in seconds. This is - # ignored because there is no g-code to set this. - @pyqtSlot(float, float) - def preheatBed(self, temperature, duration): - Logger.log("i", "Pre-heating the bed to %i degrees.", temperature) - self._setTargetBedTemperature(temperature) - self.preheatBedRemainingTimeChanged.emit() - - ## Cancels pre-heating the heated bed of the printer. - # - # If the bed is not pre-heated, nothing happens. - @pyqtSlot() - def cancelPreheatBed(self): - Logger.log("i", "Cancelling pre-heating of the bed.") - self._setTargetBedTemperature(0) - self.preheatBedRemainingTimeChanged.emit() + bed_temperature_matches = re.findall(b"B: ?([\d\.]+) ?\/?([\d\.]+)?", line) + match = bed_temperature_matches[0] + if match[0]: + self._printers[0].updateBedTemperature(float(match[0])) + if match[1]: + self._printers[0].updateTargetBedTemperature(float(match[1])) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 62412bb521..439ca1feaf 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -29,6 +29,9 @@ i18n_catalog = i18nCatalog("cura") ## Manager class that ensures that a usbPrinteroutput device is created for every connected USB printer. @signalemitter class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): + addUSBOutputDeviceSignal = Signal() + progressChanged = pyqtSignal() + def __init__(self, parent = None): super().__init__(parent = parent) self._serial_port_list = [] @@ -43,12 +46,6 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): Application.getInstance().applicationShuttingDown.connect(self.stop) self.addUSBOutputDeviceSignal.connect(self.addOutputDevice) #Because the model needs to be created in the same thread as the QMLEngine, we use a signal. - addUSBOutputDeviceSignal = Signal() - connectionStateChanged = pyqtSignal() - - progressChanged = pyqtSignal() - firmwareUpdateChange = pyqtSignal() - @pyqtProperty(float, notify = progressChanged) def progress(self): progress = 0 @@ -63,15 +60,6 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): return device._error_code return 0 - ## Return True if all printers finished firmware update - @pyqtProperty(float, notify = firmwareUpdateChange) - def firmwareUpdateCompleteStatus(self): - complete = True - for printer_name, device in self._usb_output_devices.items(): # TODO: @UnusedVariable "printer_name" - if not device.firmwareUpdateFinished: - complete = False - return complete - def start(self): self._check_updates = True self._update_thread.start() @@ -79,58 +67,28 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): def stop(self): self._check_updates = False - def _updateThread(self): - while self._check_updates: - result = self.getSerialPortList(only_list_usb = True) - self._addRemovePorts(result) - time.sleep(5) - - ## Show firmware interface. - # This will create the view if its not already created. - def spawnFirmwareInterface(self, serial_port): - if self._firmware_view is None: - path = os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "FirmwareUpdateWindow.qml") - self._firmware_view = Application.getInstance().createQmlComponent(path, {"manager": self}) - - self._firmware_view.show() - - @pyqtSlot(str) - def updateAllFirmware(self, file_name): - if file_name.startswith("file://"): - file_name = QUrl(file_name).toLocalFile() # File dialogs prepend the path with file://, which we don't need / want - - if not self._usb_output_devices: - Message(i18n_catalog.i18nc("@info", "Unable to update firmware because there are no printers connected."), title = i18n_catalog.i18nc("@info:title", "Warning")).show() + def _onConnectionStateChanged(self, serial_port): + if serial_port not in self._usb_output_devices: return - for printer_connection in self._usb_output_devices: - self._usb_output_devices[printer_connection].resetFirmwareUpdate() - self.spawnFirmwareInterface("") - for printer_connection in self._usb_output_devices: - try: - self._usb_output_devices[printer_connection].updateFirmware(file_name) - except FileNotFoundError: - # Should only happen in dev environments where the resources/firmware folder is absent. - self._usb_output_devices[printer_connection].setProgress(100, 100) - Logger.log("w", "No firmware found for printer %s called '%s'", printer_connection, file_name) - Message(i18n_catalog.i18nc("@info", - "Could not find firmware required for the printer at %s.") % printer_connection, title = i18n_catalog.i18nc("@info:title", "Printer Firmware")).show() - self._firmware_view.close() + changed_device = self._usb_output_devices[serial_port] + if changed_device.connectionState == ConnectionState.connected: + self.getOutputDeviceManager().addOutputDevice(changed_device) + else: + self.getOutputDeviceManager().removeOutputDevice(serial_port) + def _updateThread(self): + while self._check_updates: + container_stack = Application.getInstance().getGlobalContainerStack() + if container_stack is None: + time.sleep(5) continue - - @pyqtSlot(str, str, result = bool) - def updateFirmwareBySerial(self, serial_port, file_name): - if serial_port in self._usb_output_devices: - self.spawnFirmwareInterface(self._usb_output_devices[serial_port].getSerialPort()) - try: - self._usb_output_devices[serial_port].updateFirmware(file_name) - except FileNotFoundError: - self._firmware_view.close() - Logger.log("e", "Could not find firmware required for this machine called '%s'", file_name) - return False - return True - return False + if container_stack.getMetaDataEntry("supports_usb_connection"): + port_list = self.getSerialPortList(only_list_usb=True) + else: + port_list = [] # Just use an empty list; all USB devices will be removed. + self._addRemovePorts(port_list) + time.sleep(5) ## Return the singleton instance of the USBPrinterManager @classmethod @@ -205,47 +163,17 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): continue self._serial_port_list = list(serial_ports) - devices_to_remove = [] for port, device in self._usb_output_devices.items(): if port not in self._serial_port_list: device.close() - devices_to_remove.append(port) - - for port in devices_to_remove: - del self._usb_output_devices[port] ## Because the model needs to be created in the same thread as the QMLEngine, we use a signal. def addOutputDevice(self, serial_port): device = USBPrinterOutputDevice.USBPrinterOutputDevice(serial_port) device.connectionStateChanged.connect(self._onConnectionStateChanged) device.connect() - device.progressChanged.connect(self.progressChanged) - device.firmwareUpdateChange.connect(self.firmwareUpdateChange) self._usb_output_devices[serial_port] = device - ## If one of the states of the connected devices change, we might need to add / remove them from the global list. - def _onConnectionStateChanged(self, serial_port): - success = True - try: - if self._usb_output_devices[serial_port].connectionState == ConnectionState.connected: - self.getOutputDeviceManager().addOutputDevice(self._usb_output_devices[serial_port]) - else: - success = success and self.getOutputDeviceManager().removeOutputDevice(serial_port) - if success: - self.connectionStateChanged.emit() - except KeyError: - Logger.log("w", "Connection state of %s changed, but it was not found in the list") - - @pyqtProperty(QObject , notify = connectionStateChanged) - def connectedPrinterList(self): - self._usb_output_devices_model = ListModel() - self._usb_output_devices_model.addRoleName(Qt.UserRole + 1, "name") - self._usb_output_devices_model.addRoleName(Qt.UserRole + 2, "printer") - for connection in self._usb_output_devices: - if self._usb_output_devices[connection].connectionState == ConnectionState.connected: - self._usb_output_devices_model.appendItem({"name": connection, "printer": self._usb_output_devices[connection]}) - return self._usb_output_devices_model - ## Create a list of serial ports on the system. # \param only_list_usb If true, only usb ports are listed def getSerialPortList(self, only_list_usb = False): From d3d9a6e1bb0dfb4c83688801b900c5b7d346e0b6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 13:25:35 +0100 Subject: [PATCH 102/551] Starting a print with USB printer now works with reworked printeroutputmodel CL-541 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 126 ++++++++++++++++-- 1 file changed, 116 insertions(+), 10 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index e406d0a479..ace43e41d7 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -4,17 +4,21 @@ from UM.Logger import Logger from UM.i18n import i18nCatalog from UM.Application import Application +from UM.Qt.Duration import DurationFormat from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel +from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from .AutoDetectBaudJob import AutoDetectBaudJob from serial import Serial, SerialException from threading import Thread from time import time +from queue import Queue import re +import functools # Used for reduce catalog = i18nCatalog("cura") @@ -32,9 +36,15 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._timeout = 3 + # List of gcode lines to be printed + self._gcode = [] + self._gcode_position = 0 + self._use_auto_detect = True self._baud_rate = baud_rate + + self._all_baud_rates = [115200, 250000, 230400, 57600, 38400, 19200, 9600] # Instead of using a timer, we really need the update to be as a thread, as reading from serial can block. @@ -42,6 +52,48 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._last_temperature_request = None + self._is_printing = False # A print is being sent. + + ## Set when print is started in order to check running time. + self._print_start_time = None + self._print_estimated_time = None + + # Queue for commands that need to be send. Used when command is sent when a print is active. + self._command_queue = Queue() + + ## Request the current scene to be sent to a USB-connected printer. + # + # \param nodes A collection of scene nodes to send. This is ignored. + # \param file_name \type{string} A suggestion for a file name to write. + # \param filter_by_machine Whether to filter MIME types by machine. This + # is ignored. + # \param kwargs Keyword arguments. + def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs): + gcode_list = getattr(Application.getInstance().getController().getScene(), "gcode_list") + self._printGCode(gcode_list) + + ## Start a print based on a g-code. + # \param gcode_list List with gcode (strings). + def _printGCode(self, gcode_list): + self._gcode.clear() + + for layer in gcode_list: + self._gcode.extend(layer.split("\n")) + + # Reset line number. If this is not done, first line is sometimes ignored + self._gcode.insert(0, "M110") + self._gcode_position = 0 + self._is_printing = True + self._print_start_time = time() + + self._print_estimated_time = int(Application.getInstance().getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.Seconds)) + + for i in range(0, 4): # Push first 4 entries before accepting other inputs + self._sendNextGcodeLine() + + self.writeFinished.emit(self) + + def _autoDetectFinished(self, job): result = job.getResult() if result is not None: @@ -76,18 +128,19 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._update_thread.start() def sendCommand(self, command): - if self._connection_state == ConnectionState.connected: + if self._is_printing: + self._command_queue.put(command) + elif self._connection_state == ConnectionState.connected: self._sendCommand(command) def _sendCommand(self, command): if self._serial is None: return - if type(command == str):q + if type(command == str): command = (command + "\n").encode() if not command.endswith(b"\n"): command += b"\n" - self._serial.write(b"\n") self._serial.write(command) @@ -103,12 +156,65 @@ class USBPrinterOutputDevice(PrinterOutputDevice): extruder_temperature_matches = re.findall(b"T(\d*): ?([\d\.]+) ?\/?([\d\.]+)?", line) # Update all temperature values for match, extruder in zip(extruder_temperature_matches, self._printers[0].extruders): - extruder.updateHotendTemperature(float(match[1])) - extruder.updateTargetHotendTemperature(float(match[2])) + if match[1]: + extruder.updateHotendTemperature(float(match[1])) + if match[2]: + extruder.updateTargetHotendTemperature(float(match[2])) bed_temperature_matches = re.findall(b"B: ?([\d\.]+) ?\/?([\d\.]+)?", line) - match = bed_temperature_matches[0] - if match[0]: - self._printers[0].updateBedTemperature(float(match[0])) - if match[1]: - self._printers[0].updateTargetBedTemperature(float(match[1])) + if bed_temperature_matches: + match = bed_temperature_matches[0] + if match[0]: + self._printers[0].updateBedTemperature(float(match[0])) + if match[1]: + self._printers[0].updateTargetBedTemperature(float(match[1])) + + if self._is_printing: + if b"ok" in line: + if not self._command_queue.empty(): + self._sendCommand(self._command_queue.get()) + else: + self._sendNextGcodeLine() + elif b"resend" in line.lower() or b"rs" in line: + # A resend can be requested either by Resend, resend or rs. + try: + self._gcode_position = int(line.replace(b"N:", b" ").replace(b"N", b" ").replace(b":", b" ").split()[-1]) + except: + if b"rs" in line: + # In some cases of the RS command it needs to be handled differently. + self._gcode_position = int(line.split()[1]) + + def _sendNextGcodeLine(self): + if self._gcode_position >= len(self._gcode): + return + line = self._gcode[self._gcode_position] + + if ";" in line: + line = line[:line.find(";")] + + line = line.strip() + + # Don't send empty lines. But we do have to send something, so send M105 instead. + # Don't send the M0 or M1 to the machine, as M0 and M1 are handled as an LCD menu pause. + if line == "" or line == "M0" or line == "M1": + line = "M105" + + checksum = functools.reduce(lambda x, y: x ^ y, map(ord, "N%d%s" % (self._gcode_position, line))) + + self._sendCommand("N%d%s*%d" % (self._gcode_position, line, checksum)) + + progress = (self._gcode_position / len(self._gcode)) + + elapsed_time = int(time() - self._print_start_time) + print_job = self._printers[0].activePrintJob + if print_job is None: + print_job = PrintJobOutputModel(output_controller = None) + self._printers[0].updateActivePrintJob(print_job) + + print_job.updateTimeElapsed(elapsed_time) + estimated_time = self._print_estimated_time + if progress > .1: + estimated_time = self._print_estimated_time * (1 - progress) + elapsed_time + print_job.updateTimeTotal(estimated_time) + + self._gcode_position += 1 From aef54f99dbb74d75225e53af09f57839436d5fca Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 13:43:19 +0100 Subject: [PATCH 103/551] If a print is completed, it's now also updated in UI CL-541 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index ace43e41d7..6c5d4ecb7f 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -186,6 +186,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): def _sendNextGcodeLine(self): if self._gcode_position >= len(self._gcode): + self._printers[0].updateActivePrintJob(None) + self._is_printing = False return line = self._gcode[self._gcode_position] From e2845a224cb1a0300cc3504ec71c749930d24906 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 14:01:58 +0100 Subject: [PATCH 104/551] No longer start print if it's already started CL-541 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 6c5d4ecb7f..7fbbb12be3 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -69,6 +69,11 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # is ignored. # \param kwargs Keyword arguments. def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs): + if self._is_printing: + return # Aleady printing + + Application.getInstance().showPrintMonitor.emit(True) + gcode_list = getattr(Application.getInstance().getController().getScene(), "gcode_list") self._printGCode(gcode_list) @@ -93,7 +98,6 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self.writeFinished.emit(self) - def _autoDetectFinished(self, job): result = job.getResult() if result is not None: @@ -210,7 +214,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): elapsed_time = int(time() - self._print_start_time) print_job = self._printers[0].activePrintJob if print_job is None: - print_job = PrintJobOutputModel(output_controller = None) + print_job = PrintJobOutputModel(output_controller = None, name= Application.getInstance().getPrintInformation().jobName) self._printers[0].updateActivePrintJob(print_job) print_job.updateTimeElapsed(elapsed_time) From a6deddb6aec95a778d34055934ed163548659dd5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 14:30:01 +0100 Subject: [PATCH 105/551] Added controller for USB printer CL-541 --- .../USBPrinting/USBPrinterOutputController.py | 57 +++++++++++++++++++ plugins/USBPrinting/USBPrinterOutputDevice.py | 8 ++- 2 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 plugins/USBPrinting/USBPrinterOutputController.py diff --git a/plugins/USBPrinting/USBPrinterOutputController.py b/plugins/USBPrinting/USBPrinterOutputController.py new file mode 100644 index 0000000000..c42348ee6e --- /dev/null +++ b/plugins/USBPrinting/USBPrinterOutputController.py @@ -0,0 +1,57 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from cura.PrinterOutput.PrinterOutputController import PrinterOutputController +from PyQt5.QtCore import QTimer + +MYPY = False +if MYPY: + from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + + +class USBPrinterOuptutController(PrinterOutputController): + def __init__(self, output_device): + super().__init__(output_device) + + self._preheat_bed_timer = QTimer() + self._preheat_bed_timer.setSingleShot(True) + self._preheat_bed_timer.timeout.connect(self._onPreheatBedTimerFinished) + self._preheat_printer = None + + def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): + self._output_device.sendCommand("G91") + self._output_device.sendCommand("G0 X%s Y%s Z%s F%s" % (x, y, z, speed)) + self._output_device.sendCommand("G90") + + def homeHead(self, printer): + self._output_device.sendCommand("G28 X") + self._output_device.sendCommand("G28 Y") + + def homeBed(self, printer): + self._output_device.sendCommand("G28 Z") + + def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): + try: + temperature = round(temperature) # The API doesn't allow floating point. + duration = round(duration) + except ValueError: + return # Got invalid values, can't pre-heat. + + self.setTargetBedTemperature(printer, temperature=temperature) + self._preheat_bed_timer.setInterval(duration * 1000) + self._preheat_bed_timer.start() + self._preheat_printer = printer + printer.updateIsPreheating(True) + + def cancelPreheatBed(self, printer: "PrinterOutputModel"): + self.preheatBed(printer, temperature=0, duration=0) + self._preheat_bed_timer.stop() + printer.updateIsPreheating(False) + + def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int): + self._output_device.sendCommand("M140 S%s" % temperature) + + def _onPreheatBedTimerFinished(self): + self.setTargetBedTemperature(self._preheat_printer, 0) + self._preheat_printer.updateIsPreheating(False) \ No newline at end of file diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 7fbbb12be3..d7fd2cea7c 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -11,6 +11,7 @@ from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from .AutoDetectBaudJob import AutoDetectBaudJob +from .USBPrinterOutputController import USBPrinterOuptutController from serial import Serial, SerialException from threading import Thread @@ -44,7 +45,6 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._baud_rate = baud_rate - self._all_baud_rates = [115200, 250000, 230400, 57600, 38400, 19200, 9600] # Instead of using a timer, we really need the update to be as a thread, as reading from serial can block. @@ -58,6 +58,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._print_start_time = None self._print_estimated_time = None + self._accepts_commands = True + # Queue for commands that need to be send. Used when command is sent when a print is active. self._command_queue = Queue() @@ -127,7 +129,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): num_extruders = container_stack.getProperty("machine_extruder_count", "value") # Ensure that a printer is created. - self._printers = [PrinterOutputModel(output_controller=None, number_of_extruders=num_extruders)] + self._printers = [PrinterOutputModel(output_controller=USBPrinterOuptutController(self), number_of_extruders=num_extruders)] self.setConnectionState(ConnectionState.connected) self._update_thread.start() @@ -214,7 +216,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): elapsed_time = int(time() - self._print_start_time) print_job = self._printers[0].activePrintJob if print_job is None: - print_job = PrintJobOutputModel(output_controller = None, name= Application.getInstance().getPrintInformation().jobName) + print_job = PrintJobOutputModel(output_controller = USBPrinterOuptutController(self), name= Application.getInstance().getPrintInformation().jobName) self._printers[0].updateActivePrintJob(print_job) print_job.updateTimeElapsed(elapsed_time) From 6bdce54e1dc5d0a4a47538a9091835a31e7d651a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 14:47:06 +0100 Subject: [PATCH 106/551] Enable progress bar for USB printing CL-541 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 1 + .../USBPrinting/USBPrinterOutputDeviceManager.py | 14 -------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index d7fd2cea7c..40964bdd20 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -217,6 +217,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): print_job = self._printers[0].activePrintJob if print_job is None: print_job = PrintJobOutputModel(output_controller = USBPrinterOuptutController(self), name= Application.getInstance().getPrintInformation().jobName) + print_job.updateState("printing") self._printers[0].updateActivePrintJob(print_job) print_job.updateTimeElapsed(elapsed_time) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 439ca1feaf..0f98c11ddf 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -46,20 +46,6 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): Application.getInstance().applicationShuttingDown.connect(self.stop) self.addUSBOutputDeviceSignal.connect(self.addOutputDevice) #Because the model needs to be created in the same thread as the QMLEngine, we use a signal. - @pyqtProperty(float, notify = progressChanged) - def progress(self): - progress = 0 - for printer_name, device in self._usb_output_devices.items(): # TODO: @UnusedVariable "printer_name" - progress += device.progress - return progress / len(self._usb_output_devices) - - @pyqtProperty(int, notify = progressChanged) - def errorCode(self): - for printer_name, device in self._usb_output_devices.items(): # TODO: @UnusedVariable "printer_name" - if device._error_code: - return device._error_code - return 0 - def start(self): self._check_updates = True self._update_thread.start() From 0ac48817b26713ea9a15ee2dea619f1485d5cace Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 15:00:10 +0100 Subject: [PATCH 107/551] Added abort, start & pause USL-541 --- .../USBPrinting/USBPrinterOutputController.py | 11 ++++++++ plugins/USBPrinting/USBPrinterOutputDevice.py | 28 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/plugins/USBPrinting/USBPrinterOutputController.py b/plugins/USBPrinting/USBPrinterOutputController.py index c42348ee6e..ba45e7b0ca 100644 --- a/plugins/USBPrinting/USBPrinterOutputController.py +++ b/plugins/USBPrinting/USBPrinterOutputController.py @@ -31,6 +31,17 @@ class USBPrinterOuptutController(PrinterOutputController): def homeBed(self, printer): self._output_device.sendCommand("G28 Z") + def setJobState(self, job: "PrintJobOutputModel", state: str): + if state == "pause": + self._output_device.pausePrint() + job.updateState("paused") + elif state == "print": + self._output_device.resumePrint() + job.updateState("printing") + elif state == "abort": + self._output_device.cancelPrint() + pass + def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): try: temperature = round(temperature) # The API doesn't allow floating point. diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 40964bdd20..f1d7b1fdf4 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -60,6 +60,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._accepts_commands = True + self._paused = False + # Queue for commands that need to be send. Used when command is sent when a print is active. self._command_queue = Queue() @@ -83,6 +85,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # \param gcode_list List with gcode (strings). def _printGCode(self, gcode_list): self._gcode.clear() + self._paused = False for layer in gcode_list: self._gcode.extend(layer.split("\n")) @@ -179,6 +182,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if b"ok" in line: if not self._command_queue.empty(): self._sendCommand(self._command_queue.get()) + elif self._paused: + pass # Nothing to do! else: self._sendNextGcodeLine() elif b"resend" in line.lower() or b"rs" in line: @@ -190,6 +195,29 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # In some cases of the RS command it needs to be handled differently. self._gcode_position = int(line.split()[1]) + def pausePrint(self): + self._paused = True + + def resumePrint(self): + self._paused = False + + def cancelPrint(self): + self._gcode_position = 0 + self._gcode.clear() + self._printers[0].updateActivePrintJob(None) + self._is_printing = False + self._is_paused = False + + # Turn off temperatures, fan and steppers + self._sendCommand("M140 S0") + self._sendCommand("M104 S0") + self._sendCommand("M107") + + # Home XY to prevent nozzle resting on aborted print + # Don't home bed because it may crash the printhead into the print on printers that home on the bottom + self.printers[0].homeHead() + self._sendCommand("M84") + def _sendNextGcodeLine(self): if self._gcode_position >= len(self._gcode): self._printers[0].updateActivePrintJob(None) From 35d3690b8978345f753b6493b4bee26b7db75dea Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 15:19:59 +0100 Subject: [PATCH 108/551] Disable UMO checkup action --- plugins/UltimakerMachineActions/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/UltimakerMachineActions/__init__.py b/plugins/UltimakerMachineActions/__init__.py index 864c501392..495f212736 100644 --- a/plugins/UltimakerMachineActions/__init__.py +++ b/plugins/UltimakerMachineActions/__init__.py @@ -3,7 +3,6 @@ from . import BedLevelMachineAction from . import UpgradeFirmwareMachineAction -from . import UMOCheckupMachineAction from . import UMOUpgradeSelection from . import UM2UpgradeSelection @@ -18,7 +17,6 @@ def register(app): return { "machine_action": [ BedLevelMachineAction.BedLevelMachineAction(), UpgradeFirmwareMachineAction.UpgradeFirmwareMachineAction(), - UMOCheckupMachineAction.UMOCheckupMachineAction(), UMOUpgradeSelection.UMOUpgradeSelection(), UM2UpgradeSelection.UM2UpgradeSelection() ]} From bd4797404df6761c84bf1b8b7f160957f8199805 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 15:46:15 +0100 Subject: [PATCH 109/551] Changed showMonitorStage to setActiveStage CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 4 ++-- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 6 +++--- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index ba82da64c3..eb9f0469fa 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -77,7 +77,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): # Notify the UI that a switch to the print monitor should happen - Application.getInstance().showPrintMonitor.emit(True) + Application.getInstance().getController().setActiveStage("MonitorStage") self.writeStarted.emit(self) self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", []) @@ -160,7 +160,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._progress_message.hide() self._compressing_gcode = False self._sending_gcode = False - Application.getInstance().showPrintMonitor.emit(False) + Application.getInstance().getController().setActiveStage("PrepareStage") @pyqtSlot() def openPrintJobControlPanel(self): diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index e8e340e333..1f58da7ca9 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -177,7 +177,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): return # Notify the UI that a switch to the print monitor should happen - Application.getInstance().showPrintMonitor.emit(True) + Application.getInstance().getController().setActiveStage("MonitorStage") self.writeStarted.emit(self) self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", []) @@ -265,7 +265,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._progress_message.hide() self._compressing_gcode = False self._sending_gcode = False - Application.getInstance().showPrintMonitor.emit(False) + Application.getInstance().getController().setActiveStage("PrepareStage") def _onPostPrintJobFinished(self, reply): self._progress_message.hide() @@ -290,7 +290,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): if button == QMessageBox.Yes: self._startPrint() else: - Application.getInstance().showPrintMonitor.emit(False) + Application.getInstance().getController().setActiveStage("PrepareStage") # For some unknown reason Cura on OSX will hang if we do the call back code # immediately without first returning and leaving QML's event system. diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index f1d7b1fdf4..8b4961c19c 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -76,7 +76,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if self._is_printing: return # Aleady printing - Application.getInstance().showPrintMonitor.emit(True) + Application.getInstance().getController().setActiveStage("MonitorStage") gcode_list = getattr(Application.getInstance().getController().getScene(), "gcode_list") self._printGCode(gcode_list) From 1ae881caee70f1f47a4712a8592783f9ab7afb3a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 16:03:58 +0100 Subject: [PATCH 110/551] USB device is first added and then trying to connect. This is to ensure that USB printers work without autodetect --- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 +- plugins/USBPrinting/USBPrinterOutputDeviceManager.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 8b4961c19c..867233561e 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -127,10 +127,10 @@ class USBPrinterOutputDevice(PrinterOutputDevice): try: self._serial = Serial(str(self._serial_port), self._baud_rate, timeout=self._timeout, writeTimeout=self._timeout) except SerialException: + Logger.log("w", "An exception occured while trying to create serial connection") return container_stack = Application.getInstance().getGlobalContainerStack() num_extruders = container_stack.getProperty("machine_extruder_count", "value") - # Ensure that a printer is created. self._printers = [PrinterOutputModel(output_controller=USBPrinterOuptutController(self), number_of_extruders=num_extruders)] self.setConnectionState(ConnectionState.connected) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 0f98c11ddf..e13d8cef39 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -157,8 +157,8 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): def addOutputDevice(self, serial_port): device = USBPrinterOutputDevice.USBPrinterOutputDevice(serial_port) device.connectionStateChanged.connect(self._onConnectionStateChanged) - device.connect() self._usb_output_devices[serial_port] = device + device.connect() ## Create a list of serial ports on the system. # \param only_list_usb If true, only usb ports are listed From 2451e903706f7ca92ed7b3048218cabec123a3e2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 18 Dec 2017 09:57:03 +0100 Subject: [PATCH 111/551] Increase default resolution for tree support Otherwise you get lines falling completely next to the previous layer. Contributes to issue CURA-4523. --- 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 fcd73bdf00..8438bf1fa3 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3869,7 +3869,7 @@ "minimum_value_warning": "support_line_width / 4", "maximum_value_warning": "support_line_width * 2", "default_value": 0.4, - "value": "support_line_width", + "value": "support_line_width / 2", "limit_to_extruder": "support_infill_extruder_nr", "enabled": "support_tree_enable and support_tree_branch_diameter_angle > 0", "settable_per_mesh": false, From 54d53756de262d8a654e8a23cf29e24252240e5e Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 18 Dec 2017 12:48:35 +0100 Subject: [PATCH 112/551] Ignore new plugin --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8d9ba4b2d2..88c4d5b6eb 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ plugins/CuraVariSlicePlugin plugins/CuraLiveScriptingPlugin plugins/CuraPrintProfileCreator plugins/OctoPrintPlugin +plugins/CuraCloudPlugin #Build stuff CMakeCache.txt From f538c3a6863a6327d81d46645e30712024afc376 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 18 Dec 2017 14:53:24 +0100 Subject: [PATCH 113/551] Allow support bottom extruder to be set with tree support It is now implemented. Contributes to issue CURA-4523. --- resources/definitions/fdmprinter.def.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8438bf1fa3..cfad51eeb5 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3546,7 +3546,7 @@ "type": "extruder", "default_value": "0", "value": "support_interface_extruder_nr", - "enabled": "support_enable and machine_extruder_count > 1", + "enabled": "(support_enable or support_tree_enable) and machine_extruder_count > 1", "settable_per_mesh": false, "settable_per_extruder": false } @@ -3963,7 +3963,7 @@ "default_value": false, "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable')", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_enable", + "enabled": "support_enable or support_tree_enable", "settable_per_mesh": true } } @@ -4085,7 +4085,7 @@ "minimum_value": "0", "maximum_value": "100", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_bottom_enable and support_enable", + "enabled": "support_bottom_enable and (support_enable or support_tree_enable)", "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_density')", "settable_per_mesh": false, "settable_per_extruder": true, @@ -4102,7 +4102,7 @@ "minimum_value_warning": "support_bottom_line_width - 0.0001", "value": "0 if support_bottom_density == 0 else (support_bottom_line_width * 100) / support_bottom_density * (2 if support_bottom_pattern == 'grid' else (3 if support_bottom_pattern == 'triangles' else 1))", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_bottom_enable and support_enable", + "enabled": "support_bottom_enable and (support_enable or support_tree_enable)", "settable_per_mesh": false, "settable_per_extruder": true } From 97b051907fb90ef991a5f9ed55cd28142c6fe35c Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Mon, 18 Dec 2017 14:52:25 +0000 Subject: [PATCH 114/551] Added infill_enable_travel_optimization setting. Enabling this can greatly reduce the travel time during the printing of infill but it can be expensive to compute so now the user can decide whether to use it or not. --- 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 24f7efe373..ae8b93c3bb 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1853,6 +1853,14 @@ "settable_per_mesh": true } } + }, + "infill_enable_travel_optimization": + { + "label": "Enable Travel Optimization", + "description": "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true } } }, From a35f665201a79b8975635b1ff0d60473bf08b1a6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 19 Dec 2017 10:45:38 +0100 Subject: [PATCH 115/551] Fixed crash if the firmware was in the list, but not found. CL-541 --- plugins/USBPrinting/USBPrinterOutputDeviceManager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index e13d8cef39..c97d8c0160 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -135,7 +135,11 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): Logger.log("w", "There is no firmware for machine %s.", machine_id) if hex_file: - return Resources.getPath(CuraApplication.ResourceTypes.Firmware, hex_file.format(baudrate=baudrate)) + try: + return Resources.getPath(CuraApplication.ResourceTypes.Firmware, hex_file.format(baudrate=baudrate)) + except FileNotFoundError: + Logger.log("w", "Could not find any firmware for machine %s.", machine_id) + return "" else: Logger.log("w", "Could not find any firmware for machine %s.", machine_id) return "" From 57a9b709e72d9053fc5d883aff6fbd45e24f66c2 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 19 Dec 2017 12:14:58 +0100 Subject: [PATCH 116/551] Select text when gaining focus --- resources/qml/Settings/SettingTextField.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 8a51f2baff..b87c8a05c8 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -17,6 +17,7 @@ SettingItem { textHasChanged = false; textBeforeEdit = focusItem.text; + focusItem.selectAll(); } contents: Rectangle From 32cbd27b708fe6311edc538a8af6f15c57294a50 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 19 Dec 2017 15:59:21 +0100 Subject: [PATCH 117/551] Fixed the firmware update for USB print CL-541 --- plugins/USBPrinting/AutoDetectBaudJob.py | 31 ++++- plugins/USBPrinting/FirmwareUpdateWindow.qml | 54 +++----- plugins/USBPrinting/USBPrinterOutputDevice.py | 125 +++++++++++++++++- .../USBPrinterOutputDeviceManager.py | 2 - .../UpgradeFirmwareMachineAction.qml | 10 +- 5 files changed, 171 insertions(+), 51 deletions(-) diff --git a/plugins/USBPrinting/AutoDetectBaudJob.py b/plugins/USBPrinting/AutoDetectBaudJob.py index 8dcc705397..574e241453 100644 --- a/plugins/USBPrinting/AutoDetectBaudJob.py +++ b/plugins/USBPrinting/AutoDetectBaudJob.py @@ -4,9 +4,12 @@ from UM.Job import Job from UM.Logger import Logger -from time import time +from .avr_isp.stk500v2 import Stk500v2 + +from time import time, sleep from serial import Serial, SerialException + class AutoDetectBaudJob(Job): def __init__(self, serial_port): super().__init__() @@ -17,14 +20,30 @@ class AutoDetectBaudJob(Job): Logger.log("d", "Auto detect baud rate started.") timeout = 3 + programmer = Stk500v2() + serial = None + try: + programmer.connect(self._serial_port) + serial = programmer.leaveISP() + except: + programmer.close() + for baud_rate in self._all_baud_rates: Logger.log("d", "Checking {serial} if baud rate {baud_rate} works".format(serial= self._serial_port, baud_rate = baud_rate)) - try: - serial = Serial(str(self._serial_port), baud_rate, timeout = timeout, writeTimeout = timeout) - except SerialException as e: - Logger.logException("w", "Unable to create serial") - continue + if serial is None: + try: + serial = Serial(str(self._serial_port), baud_rate, timeout = timeout, writeTimeout = timeout) + except SerialException as e: + Logger.logException("w", "Unable to create serial") + continue + else: + # We already have a serial connection, just change the baud rate. + try: + serial.baudrate = baud_rate + except: + continue + sleep(1.5) # Ensure that we are not talking to the bootloader. 1.5 seconds seems to be the magic number successful_responses = 0 serial.write(b"\n") # Ensure we clear out previous responses diff --git a/plugins/USBPrinting/FirmwareUpdateWindow.qml b/plugins/USBPrinting/FirmwareUpdateWindow.qml index 44218b61b1..bd0c85f49d 100644 --- a/plugins/USBPrinting/FirmwareUpdateWindow.qml +++ b/plugins/USBPrinting/FirmwareUpdateWindow.qml @@ -34,44 +34,22 @@ UM.Dialog } text: { - if (manager.errorCode == 0) + switch (manager.firmwareUpdateState) { - if (manager.firmwareUpdateCompleteStatus) - { - //: Firmware update status label - return catalog.i18nc("@label","Firmware update completed.") - } - else if (manager.progress == 0) - { - //: Firmware update status label - return catalog.i18nc("@label","Starting firmware update, this may take a while.") - } - else - { - //: Firmware update status label + case 0: + return "" //Not doing anything (eg; idling) + case 1: return catalog.i18nc("@label","Updating firmware.") - } - } - else - { - switch (manager.errorCode) - { - case 1: - //: Firmware update status label - return catalog.i18nc("@label","Firmware update failed due to an unknown error.") - case 2: - //: Firmware update status label - return catalog.i18nc("@label","Firmware update failed due to an communication error.") - case 3: - //: Firmware update status label - return catalog.i18nc("@label","Firmware update failed due to an input/output error.") - case 4: - //: Firmware update status label - return catalog.i18nc("@label","Firmware update failed due to missing firmware.") - default: - //: Firmware update status label - return catalog.i18nc("@label", "Unknown error code: %1").arg(manager.errorCode) - } + case 2: + return catalog.i18nc("@label","Firmware update completed.") + case 3: + return catalog.i18nc("@label","Firmware update failed due to an unknown error.") + case 4: + return catalog.i18nc("@label","Firmware update failed due to an communication error.") + case 5: + return catalog.i18nc("@label","Firmware update failed due to an input/output error.") + case 6: + return catalog.i18nc("@label","Firmware update failed due to missing firmware.") } } @@ -81,10 +59,10 @@ UM.Dialog ProgressBar { id: prog - value: manager.firmwareUpdateCompleteStatus ? 100 : manager.progress + value: manager.firmwareProgress minimumValue: 0 maximumValue: 100 - indeterminate: (manager.progress < 1) && (!manager.firmwareUpdateCompleteStatus) + indeterminate: manager.firmwareProgress < 1 && manager.firmwareProgress > 0 anchors { left: parent.left; diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 867233561e..100643b490 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -5,6 +5,7 @@ from UM.Logger import Logger from UM.i18n import i18nCatalog from UM.Application import Application from UM.Qt.Duration import DurationFormat +from UM.PluginRegistry import PluginRegistry from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel @@ -12,19 +13,27 @@ from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from .AutoDetectBaudJob import AutoDetectBaudJob from .USBPrinterOutputController import USBPrinterOuptutController +from .avr_isp import stk500v2, intelHex + +from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty from serial import Serial, SerialException from threading import Thread -from time import time +from time import time, sleep from queue import Queue +from enum import IntEnum import re import functools # Used for reduce +import os catalog = i18nCatalog("cura") class USBPrinterOutputDevice(PrinterOutputDevice): + firmwareProgressChanged = pyqtSignal() + firmwareUpdateStateChanged = pyqtSignal() + def __init__(self, serial_port, baud_rate = None): super().__init__(serial_port) self.setName(catalog.i18nc("@item:inmenu", "USB printing")) @@ -50,6 +59,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # Instead of using a timer, we really need the update to be as a thread, as reading from serial can block. self._update_thread = Thread(target=self._update, daemon = True) + self._update_firmware_thread = Thread(target=self._updateFirmware, daemon = True) + self._last_temperature_request = None self._is_printing = False # A print is being sent. @@ -62,6 +73,11 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._paused = False + self._firmware_view = None + self._firmware_location = None + self._firmware_progress = 0 + self._firmware_update_state = FirmwareUpdateState.idle + # Queue for commands that need to be send. Used when command is sent when a print is active. self._command_queue = Queue() @@ -81,6 +97,88 @@ class USBPrinterOutputDevice(PrinterOutputDevice): gcode_list = getattr(Application.getInstance().getController().getScene(), "gcode_list") self._printGCode(gcode_list) + + ## Show firmware interface. + # This will create the view if its not already created. + def showFirmwareInterface(self): + if self._firmware_view is None: + path = os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "FirmwareUpdateWindow.qml") + self._firmware_view = Application.getInstance().createQmlComponent(path, {"manager": self}) + + self._firmware_view.show() + + @pyqtSlot(str) + def updateFirmware(self, file): + self._firmware_location = file + self.showFirmwareInterface() + self.setFirmwareUpdateState(FirmwareUpdateState.updating) + self._update_firmware_thread.start() + + def _updateFirmware(self): + # Ensure that other connections are closed. + if self._connection_state != ConnectionState.closed: + self.close() + + hex_file = intelHex.readHex(self._firmware_location) + if len(hex_file) == 0: + Logger.log("e", "Unable to read provided hex file. Could not update firmware") + self.setFirmwareUpdateState(FirmwareUpdateState.firmware_not_found_error) + return + + programmer = stk500v2.Stk500v2() + programmer.progress_callback = self._onFirmwareProgress + + try: + programmer.connect(self._serial_port) + except: + programmer.close() + Logger.logException("e", "Failed to update firmware") + self.setFirmwareUpdateState(FirmwareUpdateState.communication_error) + return + + # Give programmer some time to connect. Might need more in some cases, but this worked in all tested cases. + sleep(1) + if not programmer.isConnected(): + Logger.log("e", "Unable to connect with serial. Could not update firmware") + self.setFirmwareUpdateState(FirmwareUpdateState.communication_error) + try: + programmer.programChip(hex_file) + except SerialException: + self.setFirmwareUpdateState(FirmwareUpdateState.io_error) + return + except: + self.setFirmwareUpdateState(FirmwareUpdateState.unknown_error) + return + + programmer.close() + + # Clean up for next attempt. + self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) + self._firmware_location = "" + self._onFirmwareProgress(100) + self.setFirmwareUpdateState(FirmwareUpdateState.completed) + + # Try to re-connect with the machine again, which must be done on the Qt thread, so we use call later. + Application.getInstance().callLater(self.connect) + + @pyqtProperty(float, notify = firmwareProgressChanged) + def firmwareProgress(self): + return self._firmware_progress + + @pyqtProperty(int, notify=firmwareUpdateStateChanged) + def firmwareUpdateState(self): + return self._firmware_update_state + + def setFirmwareUpdateState(self, state): + if self._firmware_update_state != state: + self._firmware_update_state = state + self.firmwareUpdateStateChanged.emit() + + # Callback function for firmware update progress. + def _onFirmwareProgress(self, progress, max_progress = 100): + self._firmware_progress = (progress / max_progress) * 100 # Convert to scale of 0-100 + self.firmwareProgressChanged.emit() + ## Start a print based on a g-code. # \param gcode_list List with gcode (strings). def _printGCode(self, gcode_list): @@ -136,6 +234,15 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self.setConnectionState(ConnectionState.connected) self._update_thread.start() + def close(self): + super().close() + if self._serial is not None: + self._serial.close() + + # Re-create the thread so it can be started again later. + self._update_thread = Thread(target=self._update, daemon=True) + self._serial = None + def sendCommand(self, command): if self._is_printing: self._command_queue.put(command) @@ -155,7 +262,11 @@ class USBPrinterOutputDevice(PrinterOutputDevice): def _update(self): while self._connection_state == ConnectionState.connected and self._serial is not None: - line = self._serial.readline() + try: + line = self._serial.readline() + except: + continue + if self._last_temperature_request is None or time() > self._last_temperature_request + self._timeout: # Timeout, or no request has been sent at all. self.sendCommand("M105") @@ -255,3 +366,13 @@ class USBPrinterOutputDevice(PrinterOutputDevice): print_job.updateTimeTotal(estimated_time) self._gcode_position += 1 + + +class FirmwareUpdateState(IntEnum): + idle = 0 + updating = 1 + completed = 2 + unknown_error = 3 + communication_error = 4 + io_error = 5 + firmware_not_found_error = 6 \ No newline at end of file diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index c97d8c0160..47e2776286 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -6,7 +6,6 @@ from . import USBPrinterOutputDevice from UM.Application import Application from UM.Resources import Resources from UM.Logger import Logger -from UM.PluginRegistry import PluginRegistry from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin from cura.PrinterOutputDevice import ConnectionState from UM.Qt.ListModel import ListModel @@ -41,7 +40,6 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): self._update_thread.setDaemon(True) self._check_updates = True - self._firmware_view = None Application.getInstance().applicationShuttingDown.connect(self.stop) self.addUSBOutputDeviceSignal.connect(self.addOutputDevice) #Because the model needs to be created in the same thread as the QMLEngine, we use a signal. diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml index 72a77e992d..f36788daa5 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml @@ -14,6 +14,9 @@ import Cura 1.0 as Cura Cura.MachineAction { anchors.fill: parent; + property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 + property var activeOutputDevice: printerConnected ? Cura.MachineManager.printerOutputDevices[0] : null + Item { id: upgradeFirmwareMachineAction @@ -60,16 +63,17 @@ Cura.MachineAction { id: autoUpgradeButton text: catalog.i18nc("@action:button", "Automatically upgrade Firmware"); - enabled: parent.firmwareName != "" + enabled: parent.firmwareName != "" && activeOutputDevice onClicked: { - Cura.USBPrinterManager.updateAllFirmware(parent.firmwareName) + activeOutputDevice.updateFirmware(parent.firmwareName) } } Button { id: manualUpgradeButton text: catalog.i18nc("@action:button", "Upload custom Firmware"); + enabled: activeOutputDevice != null onClicked: { customFirmwareDialog.open() @@ -83,7 +87,7 @@ Cura.MachineAction title: catalog.i18nc("@title:window", "Select custom firmware") nameFilters: "Firmware image files (*.hex)" selectExisting: true - onAccepted: Cura.USBPrinterManager.updateAllFirmware(fileUrl) + onAccepted: activeOutputDevice.updateFirmware(fileUrl) } } } \ No newline at end of file From b4c83814d9774436c371ce0ae0165267fb4975a4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 19 Dec 2017 16:03:48 +0100 Subject: [PATCH 118/551] Clean up unused imports CL-541 --- .../USBPrinterOutputDeviceManager.py | 18 ++++++++---------- plugins/USBPrinting/__init__.py | 11 ++++++----- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 47e2776286..4de71e8b23 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -2,32 +2,29 @@ # Cura is released under the terms of the LGPLv3 or higher. from UM.Signal import Signal, signalemitter -from . import USBPrinterOutputDevice from UM.Application import Application from UM.Resources import Resources from UM.Logger import Logger from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin -from cura.PrinterOutputDevice import ConnectionState -from UM.Qt.ListModel import ListModel -from UM.Message import Message +from UM.i18n import i18nCatalog +from cura.PrinterOutputDevice import ConnectionState from cura.CuraApplication import CuraApplication +from . import USBPrinterOutputDevice +from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal + import threading import platform import time -import os.path import serial.tools.list_ports -from UM.Extension import Extension -from PyQt5.QtCore import QUrl, QObject, pyqtSlot, pyqtProperty, pyqtSignal, Qt -from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") ## Manager class that ensures that a usbPrinteroutput device is created for every connected USB printer. @signalemitter -class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): +class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin): addUSBOutputDeviceSignal = Signal() progressChanged = pyqtSignal() @@ -42,7 +39,8 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): self._check_updates = True Application.getInstance().applicationShuttingDown.connect(self.stop) - self.addUSBOutputDeviceSignal.connect(self.addOutputDevice) #Because the model needs to be created in the same thread as the QMLEngine, we use a signal. + # Because the model needs to be created in the same thread as the QMLEngine, we use a signal. + self.addUSBOutputDeviceSignal.connect(self.addOutputDevice) def start(self): self._check_updates = True diff --git a/plugins/USBPrinting/__init__.py b/plugins/USBPrinting/__init__.py index 1cc45c3c3b..7bf5853c10 100644 --- a/plugins/USBPrinting/__init__.py +++ b/plugins/USBPrinting/__init__.py @@ -1,17 +1,18 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from . import USBPrinterOutputDeviceManager -from PyQt5.QtQml import qmlRegisterType, qmlRegisterSingletonType +from PyQt5.QtQml import qmlRegisterSingletonType from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") + def getMetaData(): - return { - } + return {} + def register(app): # We are violating the QT API here (as we use a factory, which is technically not allowed). # but we don't really have another means for doing this (and it seems to you know -work-) qmlRegisterSingletonType(USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager, "Cura", 1, 0, "USBPrinterManager", USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager.getInstance) - return {"extension":USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager.getInstance(), "output_device": USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager.getInstance()} + return {"output_device": USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager.getInstance()} From 79add4ffd8dc2534bafb204ce0c4ca4157dfc59d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 19 Dec 2017 16:15:48 +0100 Subject: [PATCH 119/551] Added typing CL-541 --- plugins/USBPrinting/AutoDetectBaudJob.py | 7 +++-- plugins/USBPrinting/FirmwareUpdateWindow.qml | 3 +-- plugins/USBPrinting/USBPrinterOutputDevice.py | 26 ++++++++++--------- .../USBPrinterOutputDeviceManager.py | 2 +- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/plugins/USBPrinting/AutoDetectBaudJob.py b/plugins/USBPrinting/AutoDetectBaudJob.py index 574e241453..72f4f20262 100644 --- a/plugins/USBPrinting/AutoDetectBaudJob.py +++ b/plugins/USBPrinting/AutoDetectBaudJob.py @@ -10,6 +10,9 @@ from time import time, sleep from serial import Serial, SerialException +# An async job that attempts to find the correct baud rate for a USB printer. +# It tries a pre-set list of baud rates. All these baud rates are validated by requesting the temperature a few times +# and checking if the results make sense. If getResult() is not None, it was able to find a correct baud rate. class AutoDetectBaudJob(Job): def __init__(self, serial_port): super().__init__() @@ -43,7 +46,7 @@ class AutoDetectBaudJob(Job): serial.baudrate = baud_rate except: continue - sleep(1.5) # Ensure that we are not talking to the bootloader. 1.5 seconds seems to be the magic number + sleep(1.5) # Ensure that we are not talking to the boot loader. 1.5 seconds seems to be the magic number successful_responses = 0 serial.write(b"\n") # Ensure we clear out previous responses @@ -60,4 +63,4 @@ class AutoDetectBaudJob(Job): return serial.write(b"M105\n") - self.setResult(None) # Unable to detect the correct baudrate. \ No newline at end of file + self.setResult(None) # Unable to detect the correct baudrate. diff --git a/plugins/USBPrinting/FirmwareUpdateWindow.qml b/plugins/USBPrinting/FirmwareUpdateWindow.qml index bd0c85f49d..e0f9de314e 100644 --- a/plugins/USBPrinting/FirmwareUpdateWindow.qml +++ b/plugins/USBPrinting/FirmwareUpdateWindow.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 LGPLv3 or higher. import QtQuick 2.2 @@ -68,7 +68,6 @@ UM.Dialog left: parent.left; right: parent.right; } - } SystemPalette diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 100643b490..1e28e252d1 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -22,6 +22,7 @@ from threading import Thread from time import time, sleep from queue import Queue from enum import IntEnum +from typing import Union, Optional, List import re import functools # Used for reduce @@ -34,20 +35,20 @@ class USBPrinterOutputDevice(PrinterOutputDevice): firmwareProgressChanged = pyqtSignal() firmwareUpdateStateChanged = pyqtSignal() - def __init__(self, serial_port, baud_rate = None): + def __init__(self, serial_port: str, baud_rate: Optional[int] = None): super().__init__(serial_port) self.setName(catalog.i18nc("@item:inmenu", "USB printing")) self.setShortDescription(catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print via USB")) self.setDescription(catalog.i18nc("@info:tooltip", "Print via USB")) self.setIconName("print") - self._serial = None + self._serial = None # type: Optional[Serial] self._serial_port = serial_port self._timeout = 3 # List of gcode lines to be printed - self._gcode = [] + self._gcode = [] # type: List[str] self._gcode_position = 0 self._use_auto_detect = True @@ -61,13 +62,13 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._update_firmware_thread = Thread(target=self._updateFirmware, daemon = True) - self._last_temperature_request = None + self._last_temperature_request = None # type: Optional[int] self._is_printing = False # A print is being sent. ## Set when print is started in order to check running time. - self._print_start_time = None - self._print_estimated_time = None + self._print_start_time = None # type: Optional[int] + self._print_estimated_time = None # type: Optional[int] self._accepts_commands = True @@ -90,7 +91,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # \param kwargs Keyword arguments. def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs): if self._is_printing: - return # Aleady printing + return # Aleady printing Application.getInstance().getController().setActiveStage("MonitorStage") @@ -181,7 +182,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): ## Start a print based on a g-code. # \param gcode_list List with gcode (strings). - def _printGCode(self, gcode_list): + def _printGCode(self, gcode_list: List[str]): self._gcode.clear() self._paused = False @@ -201,13 +202,13 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self.writeFinished.emit(self) - def _autoDetectFinished(self, job): + def _autoDetectFinished(self, job: AutoDetectBaudJob): result = job.getResult() if result is not None: self.setBaudRate(result) self.connect() # Try to connect (actually create serial, etc) - def setBaudRate(self, baud_rate): + def setBaudRate(self, baud_rate: int): if baud_rate not in self._all_baud_rates: Logger.log("w", "Not updating baudrate to {baud_rate} as it's an unknown baudrate".format(baud_rate=baud_rate)) return @@ -243,13 +244,14 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._update_thread = Thread(target=self._update, daemon=True) self._serial = None - def sendCommand(self, command): + ## Send a command to printer. + def sendCommand(self, command: Union[str, bytes]): if self._is_printing: self._command_queue.put(command) elif self._connection_state == ConnectionState.connected: self._sendCommand(command) - def _sendCommand(self, command): + def _sendCommand(self, command: Union[str, bytes]): if self._serial is None: return diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 4de71e8b23..58b6106fb0 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -22,7 +22,7 @@ import serial.tools.list_ports i18n_catalog = i18nCatalog("cura") -## Manager class that ensures that a usbPrinteroutput device is created for every connected USB printer. +## Manager class that ensures that an USBPrinterOutput device is created for every connected USB printer. @signalemitter class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin): addUSBOutputDeviceSignal = Signal() From 89004b8df5dcf7da7250e4af29a938d9cae417c8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 19 Dec 2017 17:19:04 +0100 Subject: [PATCH 120/551] Fixed some QML warnings CL-541 --- resources/qml/PrinterOutput/HeatedBedBox.qml | 15 ++++++++++++++- .../qml/PrinterOutput/OutputDeviceHeader.qml | 1 - 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/resources/qml/PrinterOutput/HeatedBedBox.qml b/resources/qml/PrinterOutput/HeatedBedBox.qml index 65c2a161bd..bc89da2251 100644 --- a/resources/qml/PrinterOutput/HeatedBedBox.qml +++ b/resources/qml/PrinterOutput/HeatedBedBox.qml @@ -302,7 +302,20 @@ Item } } font: UM.Theme.getFont("action_button") - text: printerModel.isPreheating ? catalog.i18nc("@button Cancel pre-heating", "Cancel") : catalog.i18nc("@button", "Pre-heat") + text: + { + if(printerModel == null) + { + return "" + } + if(printerModel.isPreheating ) + { + return catalog.i18nc("@button Cancel pre-heating", "Cancel") + } else + { + return catalog.i18nc("@button", "Pre-heat") + } + } } } } diff --git a/resources/qml/PrinterOutput/OutputDeviceHeader.qml b/resources/qml/PrinterOutput/OutputDeviceHeader.qml index 6553655da0..ca64c79f2b 100644 --- a/resources/qml/PrinterOutput/OutputDeviceHeader.qml +++ b/resources/qml/PrinterOutput/OutputDeviceHeader.qml @@ -48,7 +48,6 @@ Item anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.top: outputDevice.bottom } } } \ No newline at end of file From 37461a7934fb71d6cacf9bdab776e4f0952805db Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 19 Dec 2017 17:24:30 +0100 Subject: [PATCH 121/551] Made sendMaterialProfiles protected CL-541 --- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 1f58da7ca9..d0b8f139f1 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -138,7 +138,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_timer.stop() ## Send all material profiles to the printer. - def sendMaterialProfiles(self): + def _sendMaterialProfiles(self): Logger.log("i", "Sending material profiles to printer") # TODO: Might want to move this to a job... @@ -410,7 +410,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): elif status_code == 200: self.setAuthenticationState(AuthState.Authenticated) # Now we know for sure that we are authenticated, send the material profiles to the machine. - self.sendMaterialProfiles() + self._sendMaterialProfiles() def _checkAuthentication(self): Logger.log("d", "Checking if authentication is correct for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) From 95b1e8f68cb10071e6190fe6be7c890fd5b1675d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 20 Dec 2017 15:38:47 +0100 Subject: [PATCH 122/551] Ensured that multiple requests from the same camera are no longer possible CL-541 --- cura/PrinterOutput/NetworkCamera.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py index b81914ca7d..f71a575c5f 100644 --- a/cura/PrinterOutput/NetworkCamera.py +++ b/cura/PrinterOutput/NetworkCamera.py @@ -45,6 +45,8 @@ class NetworkCamera(QObject): @pyqtSlot() def start(self): + # Ensure that previous requests (if any) are stopped. + self.stop() if self._target is None: Logger.log("w", "Unable to start camera stream without target!") return From 23330cd08601d38647e0cc8413cb51efa24e25ad Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 20 Dec 2017 15:39:52 +0100 Subject: [PATCH 123/551] Camera feed is also stopped when NetworkCamera is destroyed CL-541 --- cura/PrinterOutput/NetworkCamera.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py index f71a575c5f..ad4fb90dd2 100644 --- a/cura/PrinterOutput/NetworkCamera.py +++ b/cura/PrinterOutput/NetworkCamera.py @@ -87,6 +87,10 @@ class NetworkCamera(QObject): def getImage(self): return self._image + ## Ensure that close gets called when object is destroyed + def __del__(self): + self.close() + def _onStreamDownloadProgress(self, bytes_received, bytes_total): # An MJPG stream is (for our purpose) a stream of concatenated JPG images. # JPG images start with the marker 0xFFD8, and end with 0xFFD9 From d66e9493ca2a3c78bf05e00bb43066ed49c96069 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 20 Dec 2017 15:54:05 +0100 Subject: [PATCH 124/551] When not looking at camera, it will now actually be disabled CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index eb9f0469fa..ad085d16ec 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -133,6 +133,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): @pyqtSlot(QObject) def setActivePrinter(self, printer): if self._active_printer != printer: + if self._active_printer and self._active_printer.camera: + self._active_printer.camera.stop() self._active_printer = printer self.activePrinterChanged.emit() From 041b1830fe5ab3d11303c2bbb264313fd5df50f2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 20 Dec 2017 16:30:40 +0100 Subject: [PATCH 125/551] Re-added manual printer adding CL-541 --- .../NetworkedPrinterOutputDevice.py | 3 + .../UM3NetworkPrinting/DiscoverUM3Action.py | 7 +- .../UM3NetworkPrinting/DiscoverUM3Action.qml | 4 +- .../UM3OutputDevicePlugin.py | 121 +++++++++++++++++- 4 files changed, 128 insertions(+), 7 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 3585aee5ea..b10700176e 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -266,6 +266,9 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): else: return "" + def getProperties(self): + return self._properties + ## Get the unique key of this machine # \return key String containing the key of the machine. @pyqtProperty(str, constant=True) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py index 84115f28d3..0e872fed43 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py @@ -12,7 +12,10 @@ from cura.MachineAction import MachineAction catalog = i18nCatalog("cura") + class DiscoverUM3Action(MachineAction): + discoveredDevicesChanged = pyqtSignal() + def __init__(self): super().__init__("DiscoverUM3Action", catalog.i18nc("@action","Connect via Network")) self._qml_url = "DiscoverUM3Action.qml" @@ -30,8 +33,6 @@ class DiscoverUM3Action(MachineAction): # Time to wait after a zero-conf service change before allowing a zeroconf reset self._zero_conf_change_grace_period = 0.25 - discoveredDevicesChanged = pyqtSignal() - @pyqtSlot() def startDiscovery(self): if not self._network_plugin: @@ -73,7 +74,7 @@ class DiscoverUM3Action(MachineAction): self._network_plugin.removeManualDevice(key) if address != "": - self._network_plugin.addManualPrinter(address) + self._network_plugin.addManualDevice(address) def _onDeviceDiscoveryChanged(self, *args): self._last_zero_conf_event_time = time.time() diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index d79bd543e7..003fdbf95c 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -101,7 +101,7 @@ Cura.MachineAction id: removeButton text: catalog.i18nc("@action:button", "Remove") enabled: base.selectedDevice != null && base.selectedDevice.getProperty("manual") == "true" - onClicked: manager.removeManualPrinter(base.selectedDevice.key, base.selectedDevice.ipAddress) + onClicked: manager.removeManualDevice(base.selectedDevice.key, base.selectedDevice.ipAddress) } Button @@ -343,7 +343,7 @@ Cura.MachineAction onAccepted: { - manager.setManualPrinter(printerKey, addressText) + manager.setManualDevice(printerKey, addressText) } Column { diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 13ab774577..fa1a0bc417 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -5,14 +5,21 @@ from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin from UM.Logger import Logger from UM.Application import Application from UM.Signal import Signal, signalemitter +from UM.Preferences import Preferences +from UM.Version import Version + +from . import ClusterUM3OutputDevice, LegacyUM3OutputDevice + +from PyQt5.QtNetwork import QNetworkRequest, QNetworkAccessManager +from PyQt5.QtCore import QUrl from zeroconf import Zeroconf, ServiceBrowser, ServiceStateChange, ServiceInfo from queue import Queue from threading import Event, Thread - from time import time -from . import ClusterUM3OutputDevice, LegacyUM3OutputDevice +import json + ## This plugin handles the connection detection & creation of output device objects for the UM3 printer. # Zero-Conf is used to detect printers, which are saved in a dict. @@ -35,6 +42,23 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): Application.getInstance().globalContainerStackChanged.connect(self.reCheckConnections) self._discovered_devices = {} + + self._network_manager = QNetworkAccessManager() + self._network_manager.finished.connect(self._onNetworkRequestFinished) + + self._min_cluster_version = Version("4.0.0") + + self._api_version = "1" + self._api_prefix = "/api/v" + self._api_version + "/" + self._cluster_api_version = "1" + self._cluster_api_prefix = "/cluster-api/v" + self._cluster_api_version + "/" + + # Get list of manual instances from preferences + self._preferences = Preferences.getInstance() + self._preferences.addPreference("um3networkprinting/manual_instances", + "") # A comma-separated list of ip adresses or hostnames + + self._manual_instances = self._preferences.getValue("um3networkprinting/manual_instances").split(",") # The zero-conf service changed requests are handled in a separate thread, so we can re-schedule the requests # which fail to get detailed service info. @@ -62,6 +86,11 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self._zero_conf_browser = ServiceBrowser(self._zero_conf, u'_ultimaker._tcp.local.', [self._appendServiceChangedRequest]) + # Look for manual instances from preference + for address in self._manual_instances: + if address: + self.addManualDevice(address) + def reCheckConnections(self): active_machine = Application.getInstance().getGlobalContainerStack() if not active_machine: @@ -94,6 +123,94 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): Logger.log("d", "zeroconf close...") self._zero_conf.close() + def addManualDevice(self, address): + if address not in self._manual_instances: + self._manual_instances.append(address) + self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances)) + + instance_name = "manual:%s" % address + properties = { + b"name": address.encode("utf-8"), + b"address": address.encode("utf-8"), + b"manual": b"true", + b"incomplete": b"true" + } + + if instance_name not in self._discovered_devices: + # Add a preliminary printer instance + self._onAddDevice(instance_name, address, properties) + + self._checkManualDevice(address) + + def _checkManualDevice(self, address): + # Check if a UM3 family device exists at this address. + # If a printer responds, it will replace the preliminary printer created above + # origin=manual is for tracking back the origin of the call + url = QUrl("http://" + address + self._api_prefix + "system") + name_request = QNetworkRequest(url) + self._network_manager.get(name_request) + + def _onNetworkRequestFinished(self, reply): + reply_url = reply.url().toString() + + if "system" in reply_url: + if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200: + # Something went wrong with checking the firmware version! + return + + try: + system_info = json.loads(bytes(reply.readAll()).decode("utf-8")) + except: + Logger.log("e", "Something went wrong converting the JSON.") + return + + address = reply.url().host() + has_cluster_capable_firmware = Version(system_info["firmware"]) > self._min_cluster_version + instance_name = "manual:%s" % address + properties = { + b"name": system_info["name"].encode("utf-8"), + b"address": address.encode("utf-8"), + b"firmware_version": system_info["firmware"].encode("utf-8"), + b"manual": b"true", + b"machine": system_info["variant"].encode("utf-8") + } + + if has_cluster_capable_firmware: + # Cluster needs an additional request, before it's completed. + properties[b"incomplete"] = b"true" + + # Check if the device is still in the list & re-add it with the updated + # information. + if instance_name in self._discovered_devices: + self._onRemoveDevice(instance_name) + self._onAddDevice(instance_name, address, properties) + + if has_cluster_capable_firmware: + # We need to request more info in order to figure out the size of the cluster. + cluster_url = QUrl("http://" + address + self._cluster_api_prefix + "printers/") + cluster_request = QNetworkRequest(cluster_url) + self._network_manager.get(cluster_request) + + elif "printers" in reply_url: + if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200: + # Something went wrong with checking the amount of printers the cluster has! + return + # So we confirmed that the device is in fact a cluster printer, and we should now know how big it is. + try: + cluster_printers_list = json.loads(bytes(reply.readAll()).decode("utf-8")) + except: + Logger.log("e", "Something went wrong converting the JSON.") + return + address = reply.url().host() + instance_name = "manual:%s" % address + if instance_name in self._discovered_devices: + device = self._discovered_devices[instance_name] + properties = device.getProperties().copy() + del properties[b"incomplete"] + properties[b'cluster_size'] = len(cluster_printers_list) + self._onRemoveDevice(instance_name) + self._onAddDevice(instance_name, address, properties) + def _onRemoveDevice(self, device_id): device = self._discovered_devices.pop(device_id, None) if device: From 4796e0057440f92639a2ac8e4e8d85001c0a9cc8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 20 Dec 2017 16:57:49 +0100 Subject: [PATCH 126/551] Fixed removing of manual printer CL-541 --- plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index fa1a0bc417..2e1fe4db6f 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -123,6 +123,16 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): Logger.log("d", "zeroconf close...") self._zero_conf.close() + def removeManualDevice(self, key, address = None): + if key in self._discovered_devices: + if not address: + address = self._printers[key].ipAddress + self._onRemoveDevice(key) + + if address in self._manual_instances: + self._manual_instances.remove(address) + self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances)) + def addManualDevice(self, address): if address not in self._manual_instances: self._manual_instances.append(address) @@ -206,7 +216,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): if instance_name in self._discovered_devices: device = self._discovered_devices[instance_name] properties = device.getProperties().copy() - del properties[b"incomplete"] + if b"incomplete" in properties: + del properties[b"incomplete"] properties[b'cluster_size'] = len(cluster_printers_list) self._onRemoveDevice(instance_name) self._onAddDevice(instance_name, address, properties) From e576c1a9f7936aad29d6a324c902c206e30043a8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 21 Dec 2017 10:01:29 +0100 Subject: [PATCH 127/551] Ensure that an update of icon also happens on output device change CL-541 --- plugins/MonitorStage/MonitorStage.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index f223ef1844..41976c70a6 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -67,6 +67,8 @@ class MonitorStage(CuraStage): self._printer_output_device.printersChanged.connect(self._onActivePrinterChanged) self._setActivePrinter(self._printer_output_device.activePrinter) + # Force an update of the icon source + self._updateIconSource() except IndexError: pass From 9754aa5397b494b699b119b7e3fefe4f2f5a633a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 21 Dec 2017 13:16:44 +0100 Subject: [PATCH 128/551] Material & hotend updated callback is enabled for LegacyUM3 again CL-541 --- cura/PrinterOutputDevice.py | 15 ++- cura/Settings/MachineManager.py | 116 ++++++++++-------- .../LegacyUM3OutputDevice.py | 15 ++- .../UM3OutputDevicePlugin.py | 3 +- 4 files changed, 91 insertions(+), 58 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 458d0a1080..b4e67f6297 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -3,15 +3,14 @@ from UM.i18n import i18nCatalog from UM.OutputDevice.OutputDevice import OutputDevice -from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl -from PyQt5.QtQml import QQmlComponent, QQmlContext +from PyQt5.QtCore import pyqtProperty, QObject, QTimer, pyqtSignal +from PyQt5.QtWidgets import QMessageBox from UM.Logger import Logger from UM.Signal import signalemitter from UM.Application import Application -import os from enum import IntEnum # For the connection state tracking. from typing import List, Optional @@ -36,6 +35,12 @@ class PrinterOutputDevice(QObject, OutputDevice): connectionStateChanged = pyqtSignal(str) acceptsCommandsChanged = pyqtSignal() + # Signal to indicate that the material of the active printer on the remote changed. + materialIdChanged = pyqtSignal() + + # # Signal to indicate that the hotend of the active printer on the remote changed. + hotendIdChanged = pyqtSignal() + def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) @@ -59,6 +64,10 @@ class PrinterOutputDevice(QObject, OutputDevice): self._connection_state = ConnectionState.closed + def materialHotendChangedMessage(self, callback): + Logger.log("w", "materialHotendChangedMessage needs to be implemented, returning 'Yes'") + callback(QMessageBox.Yes) + def isConnected(self): return self._connection_state != ConnectionState.closed and self._connection_state != ConnectionState.error diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e78c0b9d97..50ab26f9df 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -117,7 +117,7 @@ class MachineManager(QObject): self._auto_hotends_changed = {} self._material_incompatible_message = Message(catalog.i18nc("@info:status", - "The selected material is incompatible with the selected machine or configuration."), + "The selected material is incompatible with the selected machine or configuration."), title = catalog.i18nc("@info:title", "Incompatible Material")) containers = ContainerRegistry.getInstance().findInstanceContainers(id = self.activeMaterialId) @@ -135,21 +135,21 @@ class MachineManager(QObject): activeStackValidationChanged = pyqtSignal() # Emitted whenever a validation inside active container is changed stacksValidationChanged = pyqtSignal() # Emitted whenever a validation is changed - blurSettings = pyqtSignal() # Emitted to force fields in the advanced sidebar to un-focus, so they update properly + blurSettings = pyqtSignal() # Emitted to force fields in the advanced sidebar to un-focus, so they update properly outputDevicesChanged = pyqtSignal() def _onOutputDevicesChanged(self) -> None: - '''for printer_output_device in self._printer_output_devices: + for printer_output_device in self._printer_output_devices: printer_output_device.hotendIdChanged.disconnect(self._onHotendIdChanged) - printer_output_device.materialIdChanged.disconnect(self._onMaterialIdChanged)''' + printer_output_device.materialIdChanged.disconnect(self._onMaterialIdChanged) self._printer_output_devices = [] for printer_output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): if isinstance(printer_output_device, PrinterOutputDevice): self._printer_output_devices.append(printer_output_device) - #printer_output_device.hotendIdChanged.connect(self._onHotendIdChanged) - #printer_output_device.materialIdChanged.connect(self._onMaterialIdChanged) + printer_output_device.hotendIdChanged.connect(self._onHotendIdChanged) + printer_output_device.materialIdChanged.connect(self._onMaterialIdChanged) self.outputDevicesChanged.emit() @@ -169,58 +169,70 @@ class MachineManager(QObject): def totalNumberOfSettings(self) -> int: return len(ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0].getAllKeys()) - def _onHotendIdChanged(self, index: Union[str, int], hotend_id: str) -> None: - if not self._global_container_stack: + def _onHotendIdChanged(self): + if not self._global_container_stack or not self._printer_output_devices: + return + + active_printer_model = self._printer_output_devices[0].activePrinter + if not active_printer_model: return - containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type = "variant", definition = self._global_container_stack.definition.getId(), name = hotend_id) - if containers: # New material ID is known - extruder_manager = ExtruderManager.getInstance() - machine_id = self.activeMachineId - extruders = extruder_manager.getMachineExtruders(machine_id) - matching_extruder = None - for extruder in extruders: - if str(index) == extruder.getMetaDataEntry("position"): - matching_extruder = extruder - break - 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]["id"] - self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) - else: - Logger.log("w", "No variant found for printer definition %s with id %s" % (self._global_container_stack.definition.getId(), hotend_id)) + change_found = False + machine_id = self.activeMachineId + extruders = sorted(ExtruderManager.getInstance().getMachineExtruders(machine_id), + key=lambda k: k.getMetaDataEntry("position")) - def _onMaterialIdChanged(self, index: Union[str, int], material_id: str): - if not self._global_container_stack: + for extruder_model, extruder in zip(active_printer_model.extruders, extruders): + containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type="variant", + definition=self._global_container_stack.definition.getId(), + name=extruder_model.hotendID) + if containers: + # The hotend ID is known. + machine_id = self.activeMachineId + if extruder.variant.getName() != extruder_model.hotendID: + change_found = True + self._auto_hotends_changed[extruder.getMetaDataEntry("position")] = containers[0]["id"] + + if change_found: + # A change was found, let the output device handle this. + self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) + + def _onMaterialIdChanged(self): + if not self._global_container_stack or not self._printer_output_devices: return - definition_id = "fdmprinter" - if self._global_container_stack.getMetaDataEntry("has_machine_materials", False): - definition_id = self.activeQualityDefinitionId - extruder_manager = ExtruderManager.getInstance() - containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type = "material", definition = definition_id, GUID = material_id) - if containers: # New material ID is known - extruders = list(extruder_manager.getMachineExtruders(self.activeMachineId)) - matching_extruder = None - for extruder in extruders: - if str(index) == extruder.getMetaDataEntry("position"): - matching_extruder = extruder - break + active_printer_model = self._printer_output_devices[0].activePrinter + if not active_printer_model: + return - 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. - if self._global_container_stack.definition.getMetaDataEntry("has_variants") and matching_extruder.variant: - variant_id = self.getQualityVariantId(self._global_container_stack.definition, matching_extruder.variant) - for container in containers: - if container.get("variant") == variant_id: - self._auto_materials_changed[str(index)] = container["id"] - break - else: - # Just use the first result we found. - self._auto_materials_changed[str(index)] = containers[0]["id"] - self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) - else: - Logger.log("w", "No material definition found for printer definition %s and GUID %s" % (definition_id, material_id)) + change_found = False + machine_id = self.activeMachineId + extruders = sorted(ExtruderManager.getInstance().getMachineExtruders(machine_id), + key=lambda k: k.getMetaDataEntry("position")) + + for extruder_model, extruder in zip(active_printer_model.extruders, extruders): + if extruder_model.activeMaterial is None: + continue + containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type="material", + definition=self._global_container_stack.definition.getId(), + GUID=extruder_model.activeMaterial.guid) + if containers: + # The material is known. + if extruder.material.getMetaDataEntry("GUID") != extruder_model.activeMaterial.guid: + change_found = True + if self._global_container_stack.definition.getMetaDataEntry("has_variants") and extruder.variant: + variant_id = self.getQualityVariantId(self._global_container_stack.definition, + extruder.variant) + for container in containers: + if container.get("variant") == variant_id: + self._auto_materials_changed[extruder.getMetaDataEntry("position")] = container["id"] + break + else: + # Just use the first result we found. + self._auto_materials_changed[extruder.getMetaDataEntry("position")] = containers[0]["id"] + if change_found: + # A change was found, let the output device handle this. + self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) def _materialHotendChangedCallback(self, button): if button == QMessageBox.No: diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index d0b8f139f1..ce87eaba16 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -404,7 +404,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): Logger.log("d", "While trying to verify the authentication state, we got a forbidden response. Our own auth state was %s. ", self._authentication_state) - print(reply.readAll()) self.setAuthenticationState(AuthState.AuthenticationDenied) self._authentication_failed_message.show() elif status_code == 200: @@ -533,6 +532,17 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): Logger.log("w", "Got status code {status_code} while trying to get printer data".format(status_code=status_code)) + def materialHotendChangedMessage(self, callback): + Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Sync with your printer"), + i18n_catalog.i18nc("@label", + "Would you like to use your current printer configuration in Cura?"), + i18n_catalog.i18nc("@label", + "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 + ) + def _onGetPrinterDataFinished(self, reply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) if status_code == 200: @@ -547,6 +557,9 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): firmware_version = self._properties.get(b"firmware_version", b"").decode("utf-8") self._printers = [PrinterOutputModel(output_controller=self._output_controller, number_of_extruders=self._number_of_extruders, firmware_version=firmware_version)] self._printers[0].setCamera(NetworkCamera("http://" + self._address + ":8080/?action=stream")) + for extruder in self._printers[0].extruders: + extruder.activeMaterialChanged.connect(self.materialIdChanged) + extruder.hotendIDChanged.connect(self.hotendIdChanged) self.printersChanged.emit() # LegacyUM3 always has a single printer. diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 2e1fe4db6f..6bd1c24464 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -235,8 +235,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): # Check what kind of device we need to add; Depending on the firmware we either add a "Connect"/"Cluster" # or "Legacy" UM3 device. cluster_size = int(properties.get(b"cluster_size", -1)) - # TODO: For debug purposes; force it to be legacy printer. - #device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) + if cluster_size > 0: device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties) else: From b1e9e3b8faecdf11a68754dd0126a6c53535c8c6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 21 Dec 2017 15:14:50 +0100 Subject: [PATCH 129/551] Prevent crash if disconnect already happend CL-541 --- plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 6bd1c24464..be62e68f03 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -227,7 +227,11 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): if device: if device.isConnected(): device.disconnect() - device.connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) + try: + device.connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) + except TypeError: + # Disconnect already happened. + pass self.discoveredDevicesChanged.emit() From 0e1cd9957877180006c86557ed3f9979b18372f4 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 21 Dec 2017 17:08:44 +0100 Subject: [PATCH 130/551] Add flag to ignore discard or keep dialog when changing print setup --- cura/Settings/MachineManager.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 05aed1f5e2..b3a2e6612b 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -739,7 +739,7 @@ class MachineManager(QObject): ## Set the active material by switching out a container # Depending on from/to material+current variant, a quality profile is chosen and set. @pyqtSlot(str) - def setActiveMaterial(self, material_id: str): + def setActiveMaterial(self, material_id: str, always_discard_changes = False): with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): containers = ContainerRegistry.getInstance().findInstanceContainers(id = material_id) if not containers or not self._active_container_stack: @@ -821,10 +821,10 @@ class MachineManager(QObject): if not old_quality_changes: new_quality_id = candidate_quality.getId() - self.setActiveQuality(new_quality_id) + self.setActiveQuality(new_quality_id, always_discard_changes = always_discard_changes) @pyqtSlot(str) - def setActiveVariant(self, variant_id: str): + def setActiveVariant(self, variant_id: str, always_discard_changes = False): with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): containers = ContainerRegistry.getInstance().findInstanceContainers(id = variant_id) if not containers or not self._active_container_stack: @@ -840,14 +840,14 @@ class MachineManager(QObject): if old_material: preferred_material_name = old_material.getName() preferred_material_id = self._updateMaterialContainer(self._global_container_stack.definition, self._global_container_stack, containers[0], preferred_material_name).id - self.setActiveMaterial(preferred_material_id) + self.setActiveMaterial(preferred_material_id, always_discard_changes = always_discard_changes) else: Logger.log("w", "While trying to set the active variant, no variant was found to replace.") ## set the active quality # \param quality_id The quality_id of either a quality or a quality_changes @pyqtSlot(str) - def setActiveQuality(self, quality_id: str): + def setActiveQuality(self, quality_id: str, always_discard_changes = False): with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): self.blurSettings.emit() @@ -909,7 +909,7 @@ class MachineManager(QObject): # the dialog will be the those before the switching. self._executeDelayedActiveContainerStackChanges() - if self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1: + if self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1 and not always_discard_changes: Application.getInstance().discardOrKeepProfileChanges() ## Used to update material and variant in the active container stack with a delay. From 56435f12c0f1410e2447fbca1c3ced6c3642da37 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 21 Dec 2017 17:12:39 +0100 Subject: [PATCH 131/551] Add additional debug logging in machine manager for changing stack setup --- cura/Settings/MachineManager.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index b3a2e6612b..dbff11279f 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -851,6 +851,8 @@ class MachineManager(QObject): with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): self.blurSettings.emit() + Logger.log("d", "Attempting to change the active quality to %s", quality_id) + containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = quality_id) if not containers or not self._global_container_stack: return @@ -905,6 +907,8 @@ class MachineManager(QObject): "quality_changes": stack_quality_changes }) + Logger.log("d", "Active quality changed") + # show the keep/discard dialog after the containers have been switched. Otherwise, the default values on # the dialog will be the those before the switching. self._executeDelayedActiveContainerStackChanges() @@ -917,6 +921,9 @@ class MachineManager(QObject): # before the user decided to keep or discard any of their changes using the dialog. # The Application.onDiscardOrKeepProfileChangesClosed signal triggers this method. def _executeDelayedActiveContainerStackChanges(self): + + Logger.log("d", "Applying configuration changes...") + if self._new_variant_container is not None: self._active_container_stack.variant = self._new_variant_container self._new_variant_container = None @@ -937,6 +944,8 @@ class MachineManager(QObject): self._new_quality_containers.clear() + Logger.log("d", "New configuration applied") + ## Cancel set changes for material and variant in the active container stack. # Used for ignoring any changes when switching between printers (setActiveMachine) def _cancelDelayedActiveContainerStackChanges(self): From 52d25042ebcf926e7af11a81e343c2572d3cd48a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 22 Dec 2017 11:29:13 +0100 Subject: [PATCH 132/551] Machines now re-appear after timeout CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index b10700176e..607d23aa53 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -51,6 +51,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._compressing_gcode = False self._gcode = [] + self._connection_state_before_timeout = None + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): raise NotImplementedError("requestWrite needs to be implemented") @@ -114,7 +116,11 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if time_since_last_response > self._timeout_time >= time_since_last_request: # Go (or stay) into timeout. + if self._connection_state_before_timeout is None: + self._connection_state_before_timeout = self._connection_state + self.setConnectionState(ConnectionState.closed) + # We need to check if the manager needs to be re-created. If we don't, we get some issues when OSX goes to # sleep. if time_since_last_response > self._recreate_network_manager_time: @@ -122,6 +128,10 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._createNetworkManager() if time() - self._last_manager_create_time > self._recreate_network_manager_time: self._createNetworkManager() + elif self._connection_state == ConnectionState.closed: + # Go out of timeout. + self.setConnectionState(self._connection_state_before_timeout) + self._connection_state_before_timeout = None return True From 931c87716bf9963bbc23398ae909b3608f05b2e7 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 22 Dec 2017 11:31:48 +0100 Subject: [PATCH 133/551] Connection state changes now trigger a re-evaluation of the icon CL-541 --- plugins/MonitorStage/MonitorStage.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index 41976c70a6..b5a38dad70 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -59,12 +59,14 @@ class MonitorStage(CuraStage): if new_output_device != self._printer_output_device: if self._printer_output_device: self._printer_output_device.acceptsCommandsChanged.disconnect(self._updateIconSource) + self._printer_output_device.connectionStateChanged.disconnect(self._updateIconSource) self._printer_output_device.printersChanged.disconnect(self._onActivePrinterChanged) self._printer_output_device = new_output_device self._printer_output_device.acceptsCommandsChanged.connect(self._updateIconSource) self._printer_output_device.printersChanged.connect(self._onActivePrinterChanged) + self._printer_output_device.connectionStateChanged.connect(self._updateIconSource) self._setActivePrinter(self._printer_output_device.activePrinter) # Force an update of the icon source From 5b43a32986ba176c703479ed01e2de5985cfb3a7 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 22 Dec 2017 11:56:47 +0100 Subject: [PATCH 134/551] Extract UI boot from non-UI boot --- cura/CuraApplication.py | 48 ++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e90dfd70d3..66adcebb29 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -636,13 +636,35 @@ class CuraApplication(QtApplication): def run(self): self.preRun() - - self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene...")) + # Check if we should run as single instance or not self._setUpSingleInstanceServer() + # Detect in which mode to run and execute that mode + if self.getCommandLineOption("headless", False): + self.runWithoutGUI() + else: + self.runWithGUI() + + ## Run Cura without GUI elements and interaction (server mode). + def runWithoutGUI(self): + self.closeSplash() + + for file_name in self.getCommandLineOption("file", []): + self._openFile(file_name) + for file_name in self._open_file_queue: # Open all the files that were queued up while plug-ins were loading. + self._openFile(file_name) + + self._started = True + self.exec_() + + ## Run Cura with GUI (desktop mode). + def runWithGUI(self): + self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene...")) + controller = self.getController() + # Initialize UI state controller.setActiveStage("PrepareStage") controller.setActiveView("SolidView") controller.setCameraTool("CameraTool") @@ -662,8 +684,10 @@ class CuraApplication(QtApplication): # Set the build volume of the arranger to the used build volume Arrange.build_volume = self._volume + # Set default background color for scene self.getRenderer().setBackgroundColor(QColor(245, 245, 245)) + # Initialize platform physics self._physics = PlatformPhysics.PlatformPhysics(controller, self._volume) camera = Camera("3d", root) @@ -691,22 +715,16 @@ class CuraApplication(QtApplication): self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles)) - run_without_gui = self.getCommandLineOption("headless", False) - if not run_without_gui: - self.initializeEngine() - controller.setActiveStage("PrepareStage") + self.initializeEngine() - if run_without_gui or self._engine.rootObjects: - self.closeSplash() + # Make sure the correct stage is activated + controller.setActiveStage("PrepareStage") - for file_name in self.getCommandLineOption("file", []): - self._openFile(file_name) - for file_name in self._open_file_queue: #Open all the files that were queued up while plug-ins were loading. - self._openFile(file_name) + # Hide the splash screen + self.closeSplash() - self._started = True - - self.exec_() + self._started = True + self.exec_() def getMachineManager(self, *args) -> MachineManager: if self._machine_manager is None: From 1bfe296be711f5f05c32e4a1fb4a9cfaed26952f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 22 Dec 2017 11:59:38 +0100 Subject: [PATCH 135/551] Move all QML registrations together --- cura/CuraApplication.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 66adcebb29..c6ae0392a1 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -705,13 +705,6 @@ class CuraApplication(QtApplication): self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading interface...")) - qmlRegisterSingletonType(ExtruderManager, "Cura", 1, 0, "ExtruderManager", self.getExtruderManager) - qmlRegisterSingletonType(MachineManager, "Cura", 1, 0, "MachineManager", self.getMachineManager) - qmlRegisterSingletonType(MaterialManager, "Cura", 1, 0, "MaterialManager", self.getMaterialManager) - qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, "SettingInheritanceManager", self.getSettingInheritanceManager) - qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 2, "SimpleModeSettingsManager", self.getSimpleModeSettingsManager) - qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager) - self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles)) @@ -785,6 +778,13 @@ class CuraApplication(QtApplication): qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type") + qmlRegisterSingletonType(ExtruderManager, "Cura", 1, 0, "ExtruderManager", self.getExtruderManager) + qmlRegisterSingletonType(MachineManager, "Cura", 1, 0, "MachineManager", self.getMachineManager) + qmlRegisterSingletonType(MaterialManager, "Cura", 1, 0, "MaterialManager", self.getMaterialManager) + qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, "SettingInheritanceManager", self.getSettingInheritanceManager) + qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 2, "SimpleModeSettingsManager", self.getSimpleModeSettingsManager) + qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager) + qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") qmlRegisterSingletonType(ProfilesModel, "Cura", 1, 0, "ProfilesModel", ProfilesModel.createProfilesModel) From eb27695d52181ef1abaadbb6fcbb9fa0772fd77b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 22 Dec 2017 12:04:02 +0100 Subject: [PATCH 136/551] If a reserved job is moved to a printer that can do it, it' s correclty removed from the old printer CL-541 --- cura/PrinterOutput/PrintJobOutputModel.py | 4 ++++ cura/PrinterOutput/PrinterOutputModel.py | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index fa8bbe8673..92376ad1dd 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -44,7 +44,11 @@ class PrintJobOutputModel(QObject): def updateAssignedPrinter(self, assigned_printer: "PrinterOutputModel"): if self._assigned_printer != assigned_printer: + old_printer = self._assigned_printer self._assigned_printer = assigned_printer + if old_printer is not None: + # If the previously assigned printer is set, this job is moved away from it. + old_printer.updateActivePrintJob(None) self.assignedPrinterChanged.emit() @pyqtProperty(str, notify=keyChanged) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 0c30d8d788..8234989519 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -180,11 +180,14 @@ class PrinterOutputModel(QObject): def updateActivePrintJob(self, print_job): if self._active_print_job != print_job: - if self._active_print_job is not None: - self._active_print_job.updateAssignedPrinter(None) + old_print_job = self._active_print_job + if print_job is not None: print_job.updateAssignedPrinter(self) self._active_print_job = print_job + + if old_print_job is not None: + old_print_job.updateAssignedPrinter(None) self.activePrintJobChanged.emit() def updateState(self, printer_state): From 4bc47585e63e3becbbb8442ffdf1da2695a9dd7c Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 22 Dec 2017 12:27:45 +0100 Subject: [PATCH 137/551] Improvement in booting order --- cura/CuraApplication.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c6ae0392a1..305c69f833 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -646,10 +646,6 @@ class CuraApplication(QtApplication): else: self.runWithGUI() - ## Run Cura without GUI elements and interaction (server mode). - def runWithoutGUI(self): - self.closeSplash() - for file_name in self.getCommandLineOption("file", []): self._openFile(file_name) for file_name in self._open_file_queue: # Open all the files that were queued up while plug-ins were loading. @@ -658,6 +654,10 @@ class CuraApplication(QtApplication): self._started = True self.exec_() + ## Run Cura without GUI elements and interaction (server mode). + def runWithoutGUI(self): + self.closeSplash() + ## Run Cura with GUI (desktop mode). def runWithGUI(self): self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene...")) @@ -716,9 +716,6 @@ class CuraApplication(QtApplication): # Hide the splash screen self.closeSplash() - self._started = True - self.exec_() - def getMachineManager(self, *args) -> MachineManager: if self._machine_manager is None: self._machine_manager = MachineManager.createMachineManager() From 562b2454b8bfeb8433fce2011058c04b8c137635 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 22 Dec 2017 13:48:51 +0100 Subject: [PATCH 138/551] Added missing notifications for Connect prints CL-541 --- .../ClusterUM3OutputDevice.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index ad085d16ec..d9740c4d29 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -67,6 +67,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network")) + self._finished_jobs = [] + @pyqtProperty(QObject, notify=activePrinterChanged) def controlItem(self): if self._active_printer is None: @@ -216,6 +218,24 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): return (datetime_completed.strftime("%a %b ") + "{day}".format(day=datetime_completed.day)).upper() + def _printJobStateChanged(self): + username = self._getUserName() + + if username is None: + # We only want to show notifications if username is set. + return + + finished_jobs = [job for job in self._print_jobs if job.state == "wait_cleanup"] + + newly_finished_jobs = [job for job in finished_jobs if job not in self._finished_jobs and job.owner == username] + for job in newly_finished_jobs: + job_completed_text = i18n_catalog.i18nc("@info:status", "Printer '{printer_name}' has finished printing '{job_name}'.".format(printer_name=job.assignedPrinter.name, job_name = job.name)) + job_completed_message = Message(text=job_completed_text, title = i18n_catalog.i18nc("@info:status", "Print finished")) + job_completed_message.show() + + # Keep a list of all completed jobs so we know if something changed next time. + self._finished_jobs = finished_jobs + def _update(self): if not super()._update(): return @@ -243,6 +263,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job = PrintJobOutputModel(output_controller = ClusterUM3PrinterOutputController(self), key = print_job_data["uuid"], name = print_job_data["name"]) + print_job.stateChanged.connect(self._printJobStateChanged) job_list_changed = True self._print_jobs.append(print_job) print_job.updateTimeTotal(print_job_data["time_total"]) @@ -267,6 +288,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): for removed_job in removed_jobs: if removed_job.assignedPrinter: removed_job.assignedPrinter.updateActivePrintJob(None) + removed_job.stateChanged.disconnect(self._printJobStateChanged) self._print_jobs.remove(removed_job) job_list_changed = True From d6b0fcc92e44cd87756f8517a635f2e39751d8f9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 22 Dec 2017 13:50:55 +0100 Subject: [PATCH 139/551] Progress message is now also shown when still compressing g-code CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 1 + plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index d9740c4d29..9cf83e965a 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -106,6 +106,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): i18n_catalog.i18nc("@info:title", "Sending Data")) self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "") self._progress_message.actionTriggered.connect(self._progressMessageActionTriggered) + self._progress_message.show() compressed_gcode = self._compressGCode() if compressed_gcode is None: diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index ce87eaba16..126dbbbde3 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -246,8 +246,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): i18n_catalog.i18nc("@info:title", "Sending Data")) self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "") self._progress_message.actionTriggered.connect(self._progressMessageActionTriggered) - self._progress_message.show() + compressed_gcode = self._compressGCode() if compressed_gcode is None: # Abort was called. From 07ad74d7f92acf61394abb900bf75fe0d87b9c80 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 22 Dec 2017 14:20:54 +0100 Subject: [PATCH 140/551] =?UTF-8?q?Always=20construct=20scene=20and=20buil?= =?UTF-8?q?d=20plat=C3=AB=20node=20tree?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cura/CuraApplication.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 305c69f833..9fd5b3913f 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -640,12 +640,18 @@ class CuraApplication(QtApplication): # Check if we should run as single instance or not self._setUpSingleInstanceServer() + # Setup scene and build volume + root = self.getController().getScene().getRoot() + self._volume = BuildVolume.BuildVolume(self.getController().getScene().getRoot()) + Arrange.build_volume = self._volume + # Detect in which mode to run and execute that mode if self.getCommandLineOption("headless", False): self.runWithoutGUI() else: self.runWithGUI() + # Pre-load files if requested for file_name in self.getCommandLineOption("file", []): self._openFile(file_name) for file_name in self._open_file_queue: # Open all the files that were queued up while plug-ins were loading. @@ -676,41 +682,37 @@ class CuraApplication(QtApplication): Selection.selectionChanged.connect(self.onSelectionChanged) - root = controller.getScene().getRoot() - - # The platform is a child of BuildVolume - self._volume = BuildVolume.BuildVolume(root) - - # Set the build volume of the arranger to the used build volume - Arrange.build_volume = self._volume - # Set default background color for scene self.getRenderer().setBackgroundColor(QColor(245, 245, 245)) # Initialize platform physics self._physics = PlatformPhysics.PlatformPhysics(controller, self._volume) + # Initialize camera + root = controller.getScene().getRoot() camera = Camera("3d", root) camera.setPosition(Vector(-80, 250, 700)) camera.setPerspective(True) camera.lookAt(Vector(0, 0, 0)) controller.getScene().setActiveCamera("3d") - camera_tool = self.getController().getTool("CameraTool") + # Initialize camera tool + camera_tool = controller.getTool("CameraTool") camera_tool.setOrigin(Vector(0, 100, 0)) camera_tool.setZoomRange(0.1, 200000) + # Initialize camera animations self._camera_animation = CameraAnimation.CameraAnimation() self._camera_animation.setCameraTool(self.getController().getTool("CameraTool")) self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading interface...")) + # Initialize QML engine self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles)) - self.initializeEngine() - # Make sure the correct stage is activated + # Make sure the correct stage is activated after QML is loaded controller.setActiveStage("PrepareStage") # Hide the splash screen From 2ac3ef78c32b6a367f0d341b6bffcb14e0000732 Mon Sep 17 00:00:00 2001 From: Tyler Gibson Date: Wed, 29 Nov 2017 01:09:42 -0800 Subject: [PATCH 141/551] Adding support for Malyan M200, Monoprice Select Mini V1 & V2, renaming Malyan M180 for consistency. --- .../{m180.def.json => malyan_m180.def.json} | 1 + resources/definitions/malyan_m200.def.json | 90 ++++++++++++++++++ .../monoprice_select_mini_v1.def.json | 18 ++++ .../monoprice_select_mini_v2.def.json | 22 +++++ resources/meshes/malyan_m200_platform.stl | Bin 0 -> 29184 bytes .../malyan_m200/malyan_m200_0.04375.inst.cfg | 22 +++++ .../malyan_m200/malyan_m200_0.0875.inst.cfg | 22 +++++ .../malyan_m200/malyan_m200_0.13125.inst.cfg | 22 +++++ .../malyan_m200/malyan_m200_0.175.inst.cfg | 23 +++++ .../malyan_m200/malyan_m200_0.21875.inst.cfg | 22 +++++ .../malyan_m200/malyan_m200_0.2625.inst.cfg | 22 +++++ .../malyan_m200/malyan_m200_0.30625.inst.cfg | 22 +++++ .../malyan_m200/malyan_m200_0.35.inst.cfg | 23 +++++ resources/variants/malyan_m200_0.15.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.25.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.30.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.35.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.40.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.50.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.60.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.80.inst.cfg | 18 ++++ resources/variants/malyan_m200_1.00.inst.cfg | 18 ++++ 22 files changed, 471 insertions(+) rename resources/definitions/{m180.def.json => malyan_m180.def.json} (98%) create mode 100644 resources/definitions/malyan_m200.def.json create mode 100644 resources/definitions/monoprice_select_mini_v1.def.json create mode 100644 resources/definitions/monoprice_select_mini_v2.def.json create mode 100644 resources/meshes/malyan_m200_platform.stl create mode 100644 resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg create mode 100644 resources/variants/malyan_m200_0.15.inst.cfg create mode 100644 resources/variants/malyan_m200_0.25.inst.cfg create mode 100644 resources/variants/malyan_m200_0.30.inst.cfg create mode 100644 resources/variants/malyan_m200_0.35.inst.cfg create mode 100644 resources/variants/malyan_m200_0.40.inst.cfg create mode 100644 resources/variants/malyan_m200_0.50.inst.cfg create mode 100644 resources/variants/malyan_m200_0.60.inst.cfg create mode 100644 resources/variants/malyan_m200_0.80.inst.cfg create mode 100644 resources/variants/malyan_m200_1.00.inst.cfg diff --git a/resources/definitions/m180.def.json b/resources/definitions/malyan_m180.def.json similarity index 98% rename from resources/definitions/m180.def.json rename to resources/definitions/malyan_m180.def.json index 71aa729b7e..5e0a6038dd 100644 --- a/resources/definitions/m180.def.json +++ b/resources/definitions/malyan_m180.def.json @@ -1,4 +1,5 @@ { + "id": "malyan_m180", "version": 2, "name": "Malyan M180", "inherits": "fdmprinter", diff --git a/resources/definitions/malyan_m200.def.json b/resources/definitions/malyan_m200.def.json new file mode 100644 index 0000000000..f19980a3b7 --- /dev/null +++ b/resources/definitions/malyan_m200.def.json @@ -0,0 +1,90 @@ +{ + "id": "malyan_m200", + "version": 2, + "name": "Malyan M200", + "inherits": "fdmprinter", + "metadata": { + "author": "Brian Corbino", + "manufacturer": "Malyan", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "malyan_m200_platform.stl", + "has_variants": true, + "has_variant_materials": false, + "has_materials": true, + "has_machine_materials": false, + "has_machine_quality": true, + "preferred_variant": "*0.4*", + "preferred_quality": "*0.175*", + "variants_name": "Nozzle size", + "supports_usb_connection": true, + "visible": true, + "first_start_actions": ["MachineSettingsAction"], + "supported_actions": ["MachineSettingsAction"] + }, + + "overrides": { + "machine_name": { "default_value": "Malyan M200" }, + "speed_print": { "default_value": 50 }, + "speed_wall_0": { "value": "round(speed_print * 0.75, 2)" }, + "speed_wall_x": { "value": "speed_print" }, + "speed_support": { "value": "speed_wall_0" }, + "speed_layer_0": { "value": "round(speed_print / 2.0, 2)" }, + "speed_travel": { "default_value": 50 }, + "speed_travel_layer_0": { "default_value": 40 }, + "speed_infill": { "value": "speed_print" }, + "speed_topbottom": {"value": "speed_print / 2"}, + + "layer_height": { "minimum_value": "0.04375", "maximum_value": "machine_nozzle_size * 0.875", "maximum_value_warning": "machine_nozzle_size * 0.48125 + 0.0875", "default_value": 0.13125 }, + "line_width": { "value": "round(machine_nozzle_size * 0.875, 2)" }, + + "material_print_temperature": { "minimum_value": "0" }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "material_bed_temperature": { "minimum_value": "0" }, + "material_bed_temperature_layer_0": { "value": "material_bed_temperature + 5" }, + "material_standby_temperature": { "minimum_value": "0" }, + "machine_show_variants": { "default_value": true }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_start_gcode" : { + "default_value": "G21;(metric values)\nG90;(absolute positioning)\nM82;(set extruder to absolute mode)\nM107;(start with the fan off)\nG28;(Home the printer)\nG92 E0;(Reset the extruder to 0)\nG0 Z5 E5 F500;(Move up and prime the nozzle)\nG0 X-1 Z0;(Move outside the printable area)\nG1 Y60 E8 F500;(Draw a priming/wiping line to the rear)\nG1 X-1;(Move a little closer to the print area)\nG1 Y10 E16 F500;(draw more priming/wiping)\nG1 E15 F250;(Small retract)\nG92 E0;(Zero the extruder)" + }, + "machine_end_gcode" : { + "default_value": "G0 X0 Y127;(Stick out the part)\nM190 S0;(Turn off heat bed, don't wait.)\nG92 E10;(Set extruder to 10)\nG1 E7 F200;(retract 3mm)\nM104 S0;(Turn off nozzle, don't wait)\nG4 S300;(Delay 5 minutes)\nM107;(Turn off part fan)\nM84;(Turn off stepper motors.)" + }, + "machine_width": { "default_value": 120 }, + "machine_depth": { "default_value": 120 }, + "machine_height": { "default_value": 120 }, + "machine_heated_bed": { "default_value": true }, + "machine_center_is_zero": { "default_value": false }, + "material_diameter": { "value": 1.75 }, + "machine_nozzle_size": { + "default_value": 0.4, + "minimum_value": "0.15" + }, + "machine_max_feedrate_x": { "default_value": 150 }, + "machine_max_feedrate_y": { "default_value": 150 }, + "machine_max_feedrate_z": { "default_value": 1.5 }, + "machine_max_feedrate_e": { "default_value": 100 }, + "machine_max_acceleration_x": { "default_value": 800 }, + "machine_max_acceleration_y": { "default_value": 800 }, + "machine_max_acceleration_z": { "default_value": 20 }, + "machine_max_acceleration_e": { "default_value": 10000 }, + "machine_max_jerk_xy": { "default_value": 20 }, + "machine_max_jerk_z": { "default_value": 0.4 }, + "machine_max_jerk_e": { "default_value": 5}, + "adhesion_type": { "default_value": "raft" }, + "raft_margin": { "default_value": 5 }, + "raft_airgap": { "default_value": 0.2625 }, + "raft_base_thickness": { "value": "0.30625" }, + "raft_interface_thickness": { "value": "0.21875" }, + "raft_surface_layers": { "default_value": 1 }, + "skirt_line_count": { "default_value": 2}, + "brim_width" : { "default_value": 5}, + "start_layers_at_same_position": { "default_value": true}, + "retraction_combing": { "default_value": "noskin" }, + "retraction_amount" : { "default_value": 4.5}, + "retraction_speed" : { "default_value": 40}, + "coasting_enable": { "default_value": true }, + "prime_tower_enable": { "default_value": false} + } +} diff --git a/resources/definitions/monoprice_select_mini_v1.def.json b/resources/definitions/monoprice_select_mini_v1.def.json new file mode 100644 index 0000000000..0b76a26c1c --- /dev/null +++ b/resources/definitions/monoprice_select_mini_v1.def.json @@ -0,0 +1,18 @@ +{ + "id": "monoprice_select_mini_v1", + "version": 2, + "name": "Monoprice Select Mini V1", + "inherits": "malyan_m200", + "metadata": { + "author": "Brian Corbino", + "manufacturer": "Monoprice", + "category": "Other", + "file_formats": "text/x-gcode", + "quality_definition": "malyan_m200", + "visible": true + }, + + "overrides": { + "machine_name": { "default_value": "Monoprice Select Mini V1" } + } +} diff --git a/resources/definitions/monoprice_select_mini_v2.def.json b/resources/definitions/monoprice_select_mini_v2.def.json new file mode 100644 index 0000000000..33367aad88 --- /dev/null +++ b/resources/definitions/monoprice_select_mini_v2.def.json @@ -0,0 +1,22 @@ +{ + "id": "monoprice_select_mini_v2", + "version": 2, + "name": "Monoprice Select Mini V2 (E3D)", + "inherits": "malyan_m200", + "metadata": { + "author": "Brian Corbino", + "manufacturer": "Monoprice", + "category": "Other", + "file_formats": "text/x-gcode", + "quality_definition": "malyan_m200", + "visible": true + }, + + "overrides": { + "machine_name": { "default_value": "Monoprice Select Mini V2" }, + "adhesion_type": { "default_value": "brim" }, + "retraction_combing": { "default_value": "noskin" }, + "retraction_amount" : { "default_value": 2.5}, + "retraction_speed" : { "default_value": 40} + } +} diff --git a/resources/meshes/malyan_m200_platform.stl b/resources/meshes/malyan_m200_platform.stl new file mode 100644 index 0000000000000000000000000000000000000000..32b19a09114b7b3dee2ccd2da1e7fac1cb1acaec GIT binary patch literal 29184 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

Kah*fmelOmn**YEV59%c@nVQpwBBRCG? z3dzsQ`pRYmefNr^Xvv)sJi|=WQbzC$GcEM$CoDuzE3RZ7u1{X3IjF@R%LrZLnw{0u zm8`zh9oL+BXFcLNcvUCTE;}Qx8U5vbS?9XH`mC>9C&n3iLQ6T0Vz=ClM#oW0Gn_4D z1kVr=*TJhIFEuDv#qmV2)TTWbEtxJ?&MOi1+m(oeT102BN@tY&j2MIB^D{&tJZ=(V zVXcz9)7FwKK7YHI5!6!N{3Y5nLb>v{mcADehewy>%t0-$QD;J=y*M?yLb$SH4xVu} zrKOcq&#cD?=E|9t7BiCL&>7pJ7SS2OGwv93*iuH6(OG*mw4#rr8S)o#Ok*%t5cHMRZ0CYTi7Y_R1@# z{AC;*!I?uf@K;-b2;UXhn`FnH%})7zE{j%$#;Lf7-K$u`Hkp|P~_%_{KVa_^5$>wGJ;w~F5bmg ztgmiOEj?+}8GhAP zYSZSij3}OzEB&Y~wS0#><|xrNTSQMIe7`JP{HA3Z!R(gWw8+c&Xc@_I5J9bSyp67m zke27fKu0f4BRInmt!nnamrOn1{M_#o#gPzdCj9@pgOH@tw@ic;3s^;q6 zRn2WHJc$|Z>=3LV(bHbh?leN(kr6R4nYrz&R&&SX6fr%+NFm=^uKPbc}WP}TT1qQjb&x}%m``O(rQHi zcA;O-&Efmn?3KqFwIus$AVogsQ!YLQ=CjO<;L}sjiSmTc7Bj*Xl$N_sGA$VqPte`f z(z5Ja4dWOi7_DVlTFoK5=8)E^E(s2w8EO%2j$*aE4d5!{$i?T3NX`g;A?@r+iiQ;X|kM$j%-OQJKvPtO%O`KCE^ zpAl~tW~cdGGV7E%sKp9SBls;c5ww&!7%dUBlo5X3uE=?ZG<{dZJFHmS<2O2q&K!QS zEe?Jy$uC?pf?E8Za~e^`bDODSjf!9OWLIVmYQ-3gIHnQ&3X`7D!^}ai#Npouj5RTy zISdi;3|YB~K8{~mW!8s?{=02@!k99GT8wrY5my%Z7h>fhosh3Uwd zA6+f^8PGIB9RB@8)?+#jo?+GE`XQc7<;dA3%=ENZw8gF@cji#!jzg=AuTkQf@!_(j z57&>lx{r>d7SYojtp7BE{!)wR%pom5Nh=<fbC45Z$wIWszD$Z?63x_DO+X literal 0 HcmV?d00001 diff --git a/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg new file mode 100644 index 0000000000..c19d6f2050 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = M1 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = 2 +quality_type = fine +setting_version = 3 + +[values] +layer_height = 0.04375 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg new file mode 100644 index 0000000000..519e963227 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = M2 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = 1 +quality_type = high +setting_version = 3 + +[values] +layer_height = 0.0875 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg new file mode 100644 index 0000000000..732218cd79 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = M3 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = 0 +quality_type = normal +setting_version = 3 + +[values] +layer_height = 0.13125 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg new file mode 100644 index 0000000000..f27e1ff900 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = M4 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = -1 +quality_type = fast +global_quality = true +setting_version = 3 + +[values] +layer_height = 0.175 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg new file mode 100644 index 0000000000..3ff3b562b2 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = M5 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = -2 +quality_type = faster +setting_version = 3 + +[values] +layer_height = 0.21875 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg new file mode 100644 index 0000000000..881f70521f --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = M6 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = -3 +quality_type = draft +setting_version = 3 + +[values] +layer_height = 0.2625 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg new file mode 100644 index 0000000000..5d81cbc259 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = M7 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = -4 +quality_type = turbo +setting_version = 3 + +[values] +layer_height = 0.30625 +layer_height_0 = 0.30625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg new file mode 100644 index 0000000000..74294ea6f6 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = M8 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = -5 +quality_type = hyper +global_quality = true +setting_version = 3 + +[values] +layer_height = 0.35 +layer_height_0 = 0.35 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/variants/malyan_m200_0.15.inst.cfg b/resources/variants/malyan_m200_0.15.inst.cfg new file mode 100644 index 0000000000..808b8755ea --- /dev/null +++ b/resources/variants/malyan_m200_0.15.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.15 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.15 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.05 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.25.inst.cfg b/resources/variants/malyan_m200_0.25.inst.cfg new file mode 100644 index 0000000000..3847f5c617 --- /dev/null +++ b/resources/variants/malyan_m200_0.25.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.25 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.25 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.1 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.30.inst.cfg b/resources/variants/malyan_m200_0.30.inst.cfg new file mode 100644 index 0000000000..fee8aae40f --- /dev/null +++ b/resources/variants/malyan_m200_0.30.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.30 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.30 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.11 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.35.inst.cfg b/resources/variants/malyan_m200_0.35.inst.cfg new file mode 100644 index 0000000000..dcbb3ed4c0 --- /dev/null +++ b/resources/variants/malyan_m200_0.35.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.35 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.35 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.13 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.40.inst.cfg b/resources/variants/malyan_m200_0.40.inst.cfg new file mode 100644 index 0000000000..6e17dd13a6 --- /dev/null +++ b/resources/variants/malyan_m200_0.40.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.40 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.40 +machine_nozzle_tip_outer_diameter = 1.05 +coasting_volume = 0.15 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.25, 1) +speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = =round(speed_print / 2.25, 1) diff --git a/resources/variants/malyan_m200_0.50.inst.cfg b/resources/variants/malyan_m200_0.50.inst.cfg new file mode 100644 index 0000000000..ce87def1e6 --- /dev/null +++ b/resources/variants/malyan_m200_0.50.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.50 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.50 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.2 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.60.inst.cfg b/resources/variants/malyan_m200_0.60.inst.cfg new file mode 100644 index 0000000000..0ee7c786e8 --- /dev/null +++ b/resources/variants/malyan_m200_0.60.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.60 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.60 +machine_nozzle_tip_outer_diameter = 1.25 +coasting_volume = 0.28 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print * 4 / 3, 1) +speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = =round(speed_print / 2, 1) diff --git a/resources/variants/malyan_m200_0.80.inst.cfg b/resources/variants/malyan_m200_0.80.inst.cfg new file mode 100644 index 0000000000..54f48afdb4 --- /dev/null +++ b/resources/variants/malyan_m200_0.80.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.80 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.80 +machine_nozzle_tip_outer_diameter = 1.35 +coasting_volume = 0.45 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print * 4 / 3, 1) +speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = =round(speed_print / 2, 1) diff --git a/resources/variants/malyan_m200_1.00.inst.cfg b/resources/variants/malyan_m200_1.00.inst.cfg new file mode 100644 index 0000000000..ce0a2d0dfb --- /dev/null +++ b/resources/variants/malyan_m200_1.00.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 1.00 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 1.00 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.63 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) From 80f50dfff579b30f54eeee2205a72e735a8acf2f Mon Sep 17 00:00:00 2001 From: tylergibson Date: Wed, 13 Dec 2017 18:33:18 -0800 Subject: [PATCH 142/551] renaming variants to fix filename conflict, updating quality setting version --- resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg | 2 +- .../{malyan_m200_0.15.inst.cfg => malyan_m200_0.15mm.inst.cfg} | 0 .../{malyan_m200_0.25.inst.cfg => malyan_m200_0.25mm.inst.cfg} | 0 .../{malyan_m200_0.30.inst.cfg => malyan_m200_0.30mm.inst.cfg} | 0 .../{malyan_m200_0.35.inst.cfg => malyan_m200_0.35mm.inst.cfg} | 0 .../{malyan_m200_0.40.inst.cfg => malyan_m200_0.40mm.inst.cfg} | 0 .../{malyan_m200_0.50.inst.cfg => malyan_m200_0.50mm.inst.cfg} | 0 .../{malyan_m200_0.60.inst.cfg => malyan_m200_0.60mm.inst.cfg} | 0 .../{malyan_m200_0.80.inst.cfg => malyan_m200_0.80mm.inst.cfg} | 0 .../{malyan_m200_1.00.inst.cfg => malyan_m200_1.00mm.inst.cfg} | 0 17 files changed, 8 insertions(+), 8 deletions(-) rename resources/variants/{malyan_m200_0.15.inst.cfg => malyan_m200_0.15mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.25.inst.cfg => malyan_m200_0.25mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.30.inst.cfg => malyan_m200_0.30mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.35.inst.cfg => malyan_m200_0.35mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.40.inst.cfg => malyan_m200_0.40mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.50.inst.cfg => malyan_m200_0.50mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.60.inst.cfg => malyan_m200_0.60mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.80.inst.cfg => malyan_m200_0.80mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_1.00.inst.cfg => malyan_m200_1.00mm.inst.cfg} (100%) diff --git a/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg index c19d6f2050..54be6ecbcc 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg @@ -7,7 +7,7 @@ definition = malyan_m200 type = quality weight = 2 quality_type = fine -setting_version = 3 +setting_version = 4 [values] layer_height = 0.04375 diff --git a/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg index 519e963227..568dd796f3 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg @@ -7,7 +7,7 @@ definition = malyan_m200 type = quality weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] layer_height = 0.0875 diff --git a/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg index 732218cd79..1dc436502b 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg @@ -7,7 +7,7 @@ definition = malyan_m200 type = quality weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] layer_height = 0.13125 diff --git a/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg index f27e1ff900..314a8acd83 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -1 quality_type = fast global_quality = true -setting_version = 3 +setting_version = 4 [values] layer_height = 0.175 diff --git a/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg index 3ff3b562b2..a7fedb7e04 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg @@ -7,7 +7,7 @@ definition = malyan_m200 type = quality weight = -2 quality_type = faster -setting_version = 3 +setting_version = 4 [values] layer_height = 0.21875 diff --git a/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg index 881f70521f..441abc3070 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg @@ -7,7 +7,7 @@ definition = malyan_m200 type = quality weight = -3 quality_type = draft -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2625 diff --git a/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg index 5d81cbc259..2588838174 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg @@ -7,7 +7,7 @@ definition = malyan_m200 type = quality weight = -4 quality_type = turbo -setting_version = 3 +setting_version = 4 [values] layer_height = 0.30625 diff --git a/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg index 74294ea6f6..800b6104d9 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -5 quality_type = hyper global_quality = true -setting_version = 3 +setting_version = 4 [values] layer_height = 0.35 diff --git a/resources/variants/malyan_m200_0.15.inst.cfg b/resources/variants/malyan_m200_0.15mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.15.inst.cfg rename to resources/variants/malyan_m200_0.15mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.25.inst.cfg b/resources/variants/malyan_m200_0.25mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.25.inst.cfg rename to resources/variants/malyan_m200_0.25mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.30.inst.cfg b/resources/variants/malyan_m200_0.30mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.30.inst.cfg rename to resources/variants/malyan_m200_0.30mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.35.inst.cfg b/resources/variants/malyan_m200_0.35mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.35.inst.cfg rename to resources/variants/malyan_m200_0.35mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.40.inst.cfg b/resources/variants/malyan_m200_0.40mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.40.inst.cfg rename to resources/variants/malyan_m200_0.40mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.50.inst.cfg b/resources/variants/malyan_m200_0.50mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.50.inst.cfg rename to resources/variants/malyan_m200_0.50mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.60.inst.cfg b/resources/variants/malyan_m200_0.60mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.60.inst.cfg rename to resources/variants/malyan_m200_0.60mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.80.inst.cfg b/resources/variants/malyan_m200_0.80mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.80.inst.cfg rename to resources/variants/malyan_m200_0.80mm.inst.cfg diff --git a/resources/variants/malyan_m200_1.00.inst.cfg b/resources/variants/malyan_m200_1.00mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_1.00.inst.cfg rename to resources/variants/malyan_m200_1.00mm.inst.cfg From 93a3054af0582d0d6230f9d578161464ee64ba02 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Dec 2017 10:38:36 +0100 Subject: [PATCH 143/551] Round layer heights to 2 decimals More difficult than I expected actually... Contributes to issue CURA-4655. --- resources/qml/SidebarSimple.qml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 62cf6f9d34..76d8bb32df 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -183,12 +183,22 @@ Item text: { var result = "" - if(Cura.MachineManager.activeMachine != null){ - - var result = Cura.ProfilesModel.getItem(index).layer_height_without_unit + if(Cura.MachineManager.activeMachine != null) + { + result = Cura.ProfilesModel.getItem(index).layer_height_without_unit if(result == undefined) - result = "" + { + result = ""; + } + else + { + result = Number(Math.round(result + "e+2") + "e-2"); //Round to 2 decimals. Javascript makes this difficult... + if (result == undefined || result != result) //Parse failure. + { + result = ""; + } + } } return result } From f82753b766fafcdf2e082a2c20e5bc2dd5a9a6f6 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Tue, 2 Jan 2018 09:39:20 +0000 Subject: [PATCH 144/551] Move optimize_wall_printing_order from experimental section to shell. Still not enabled by default yet but perhaps in the future after it has been tested more it will be. --- resources/definitions/fdmprinter.def.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 17f8b6826f..141bb48f18 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1168,6 +1168,14 @@ "limit_to_extruder": "wall_0_extruder_nr", "settable_per_mesh": true }, + "optimize_wall_printing_order": + { + "label": "Optimize Wall Printing Order", + "description": "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true + }, "outer_inset_first": { "label": "Outer Before Inner Walls", @@ -5216,14 +5224,6 @@ "description": "experimental!", "children": { - "optimize_wall_printing_order": - { - "label": "Optimize Wall Printing Order", - "description": "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization.", - "type": "bool", - "default_value": false, - "settable_per_mesh": true - }, "support_skip_some_zags": { "label": "Break Up Support In Chunks", From 192db52d4860c495601fc71ca40f4f89b84f5227 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 2 Jan 2018 16:27:13 +0100 Subject: [PATCH 145/551] Spelling We hold American English, at least for user-visible parts. --- 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 508d174cf2..45402c9c40 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") and Preferences.getInstance().getValue("info/send_slice_info"): - self.send_slice_info_message = Message(catalog.i18nc("@info", "Cura collects anonymised slicing statistics. You can disable this in the preferences."), + self.send_slice_info_message = Message(catalog.i18nc("@info", "Cura collects anonymized slicing statistics. You can disable this in the preferences."), lifetime = 0, dismissable = False, title = catalog.i18nc("@info:title", "Collecting Data")) From 5e3666f073504e08da1c9ffbc7072831bd0452dc Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Tue, 2 Jan 2018 17:21:51 +0100 Subject: [PATCH 146/551] Fill out the type hints in NetworkedPrinterOutputDevice.py CL-541 --- .../NetworkedPrinterOutputDevice.py | 81 +++++++++---------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 607d23aa53..84e186dacb 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -9,7 +9,7 @@ from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, pyqtSignal, QUrl, QCoreApplication from time import time -from typing import Callable, Any, Optional +from typing import Callable, Any, Optional, Dict, Tuple from enum import IntEnum from typing import List @@ -27,45 +27,45 @@ class AuthState(IntEnum): class NetworkedPrinterOutputDevice(PrinterOutputDevice): authenticationStateChanged = pyqtSignal() - def __init__(self, device_id, address: str, properties, parent = None): + def __init__(self, device_id, address: str, properties, parent = None) -> None: super().__init__(device_id = device_id, parent = parent) - self._manager = None - self._last_manager_create_time = None + self._manager = None # type: QNetworkAccessManager + self._last_manager_create_time = None # type: float self._recreate_network_manager_time = 30 self._timeout_time = 10 # After how many seconds of no response should a timeout occur? - self._last_response_time = None - self._last_request_time = None + self._last_response_time = None # type: float + self._last_request_time = None # type: float self._api_prefix = "" self._address = address self._properties = properties self._user_agent = "%s/%s " % (Application.getInstance().getApplicationName(), Application.getInstance().getVersion()) - self._onFinishedCallbacks = {} + self._onFinishedCallbacks = {} # type: Dict[str, Callable[[QNetworkReply], None]] self._authentication_state = AuthState.NotAuthenticated - self._cached_multiparts = {} + self._cached_multiparts = {} # type: Dict[int, Tuple[QHttpMultiPart, QNetworkReply]] self._sending_gcode = False self._compressing_gcode = False - self._gcode = [] + self._gcode = [] # type: List[str] - self._connection_state_before_timeout = None + self._connection_state_before_timeout = None # type: Optional[ConnectionState] - def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs) -> None: raise NotImplementedError("requestWrite needs to be implemented") - def setAuthenticationState(self, authentication_state): + def setAuthenticationState(self, authentication_state) -> None: if self._authentication_state != authentication_state: self._authentication_state = authentication_state self.authenticationStateChanged.emit() @pyqtProperty(int, notify=authenticationStateChanged) - def authenticationState(self): + def authenticationState(self) -> int: return self._authentication_state - def _compressDataAndNotifyQt(self, data_to_append): + def _compressDataAndNotifyQt(self, data_to_append: str) -> bytes: compressed_data = gzip.compress(data_to_append.encode("utf-8")) self._progress_message.setProgress(-1) # Tickle the message so that it's clear that it's still being used. QCoreApplication.processEvents() # Ensure that the GUI does not freeze. @@ -75,7 +75,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._last_response_time = time() return compressed_data - def _compressGCode(self): + def _compressGCode(self) -> Optional[bytes]: self._compressing_gcode = True ## Mash the data into single string @@ -87,7 +87,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if not self._compressing_gcode: self._progress_message.hide() # Stop trying to zip / send as abort was called. - return + return None batched_line += line # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. # Compressing line by line in this case is extremely slow, so we need to batch them. @@ -103,7 +103,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._compressing_gcode = False return byte_array_file_data - def _update(self): + def _update(self) -> bool: if self._last_response_time: time_since_last_response = time() - self._last_response_time else: @@ -135,7 +135,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): return True - def _createEmptyRequest(self, target, content_type: Optional[str] = "application/json"): + def _createEmptyRequest(self, target, content_type: Optional[str] = "application/json") -> QNetworkRequest: url = QUrl("http://" + self._address + self._api_prefix + target) request = QNetworkRequest(url) if content_type is not None: @@ -143,7 +143,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) return request - def _createFormPart(self, content_header, data, content_type = None): + def _createFormPart(self, content_header, data, content_type = None) -> QHttpPart: part = QHttpPart() if not content_header.startswith("form-data;"): @@ -158,18 +158,18 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): ## Convenience function to get the username from the OS. # The code was copied from the getpass module, as we try to use as little dependencies as possible. - def _getUserName(self): + def _getUserName(self) -> str: for name in ("LOGNAME", "USER", "LNAME", "USERNAME"): user = os.environ.get(name) if user: return user return "Unknown User" # Couldn't find out username. - def _clearCachedMultiPart(self, reply): + def _clearCachedMultiPart(self, reply: QNetworkReply) -> None: if id(reply) in self._cached_multiparts: del self._cached_multiparts[id(reply)] - def put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): + def put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -178,7 +178,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def get(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): + def get(self, target: str, onFinished: Optional[Callable[[QNetworkReply], None]]) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -187,13 +187,12 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def delete(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): + def delete(self, target: str, onFinished: Optional[Callable[[QNetworkReply], None]]) -> None: if self._manager is None: self._createNetworkManager() self._last_request_time = time() - pass - def post(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + def post(self, target: str, data: str, onFinished: Optional[Callable[[QNetworkReply], None]], onProgress: Callable = None) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -204,7 +203,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[QNetworkReply], None]], onProgress: Callable = None) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target, content_type=None) @@ -223,17 +222,17 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[QNetworkReply], None]], onProgress: Callable = None) -> None: post_part = QHttpPart() post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data) post_part.setBody(body_data) self.postFormWithParts(target, [post_part], onFinished, onProgress) - def _onAuthenticationRequired(self, reply, authenticator): + def _onAuthenticationRequired(self, reply, authenticator) -> None: Logger.log("w", "Request to {url} required authentication, which was not implemented".format(url = reply.url().toString())) - def _createNetworkManager(self): + def _createNetworkManager(self) -> None: Logger.log("d", "Creating network manager") if self._manager: self._manager.finished.disconnect(self.__handleOnFinished) @@ -246,7 +245,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._manager.authenticationRequired.connect(self._onAuthenticationRequired) #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes - def __handleOnFinished(self, reply: QNetworkReply): + def __handleOnFinished(self, reply: QNetworkReply) -> None: # Due to garbage collection, we need to cache certain bits of post operations. # As we don't want to keep them around forever, delete them if we get a reply. if reply.operation() == QNetworkAccessManager.PostOperation: @@ -269,10 +268,10 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): Logger.logException("w", "something went wrong with callback") @pyqtSlot(str, result=str) - def getProperty(self, key): - key = key.encode("utf-8") - if key in self._properties: - return self._properties.get(key, b"").decode("utf-8") + def getProperty(self, key: str) -> str: + bytes_key = key.encode("utf-8") + if bytes_key in self._properties: + return self._properties.get(bytes_key, b"").decode("utf-8") else: return "" @@ -282,25 +281,25 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): ## Get the unique key of this machine # \return key String containing the key of the machine. @pyqtProperty(str, constant=True) - def key(self): + def key(self) -> str: return self._id ## The IP address of the printer. @pyqtProperty(str, constant=True) - def address(self): + def address(self) -> str: return self._properties.get(b"address", b"").decode("utf-8") ## Name of the printer (as returned from the ZeroConf properties) @pyqtProperty(str, constant=True) - def name(self): + def name(self) -> str: return self._properties.get(b"name", b"").decode("utf-8") ## Firmware version (as returned from the ZeroConf properties) @pyqtProperty(str, constant=True) - def firmwareVersion(self): + def firmwareVersion(self) -> str: return self._properties.get(b"firmware_version", b"").decode("utf-8") ## IPadress of this printer @pyqtProperty(str, constant=True) - def ipAddress(self): - return self._address \ No newline at end of file + def ipAddress(self) -> str: + return self._address From ef46f514970edca956f9942cdf35a1a19ad9e4dd Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Jan 2018 13:44:38 +0100 Subject: [PATCH 147/551] Camera delete now triggers the correct function CL-541 --- cura/PrinterOutput/NetworkCamera.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py index ad4fb90dd2..5b28ffd30d 100644 --- a/cura/PrinterOutput/NetworkCamera.py +++ b/cura/PrinterOutput/NetworkCamera.py @@ -89,7 +89,7 @@ class NetworkCamera(QObject): ## Ensure that close gets called when object is destroyed def __del__(self): - self.close() + self.stop() def _onStreamDownloadProgress(self, bytes_received, bytes_total): # An MJPG stream is (for our purpose) a stream of concatenated JPG images. From c1bf87bd8fac98150e720258087a3e1b90095f76 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Jan 2018 13:54:15 +0100 Subject: [PATCH 148/551] Removed commented out code CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 84e186dacb..845696d80c 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -236,14 +236,12 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): Logger.log("d", "Creating network manager") if self._manager: self._manager.finished.disconnect(self.__handleOnFinished) - #self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged) self._manager.authenticationRequired.disconnect(self._onAuthenticationRequired) self._manager = QNetworkAccessManager() self._manager.finished.connect(self.__handleOnFinished) self._last_manager_create_time = time() self._manager.authenticationRequired.connect(self._onAuthenticationRequired) - #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes def __handleOnFinished(self, reply: QNetworkReply) -> None: # Due to garbage collection, we need to cache certain bits of post operations. From e12a2fbd6a8be70da77d09e59501cbb705e0ba85 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Jan 2018 14:07:34 +0100 Subject: [PATCH 149/551] Fixed typing CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 845696d80c..46523e5989 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -178,7 +178,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def get(self, target: str, onFinished: Optional[Callable[[QNetworkReply], None]]) -> None: + def get(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -187,12 +187,12 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def delete(self, target: str, onFinished: Optional[Callable[[QNetworkReply], None]]) -> None: + def delete(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: if self._manager is None: self._createNetworkManager() self._last_request_time = time() - def post(self, target: str, data: str, onFinished: Optional[Callable[[QNetworkReply], None]], onProgress: Callable = None) -> None: + def post(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -203,7 +203,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[QNetworkReply], None]], onProgress: Callable = None) -> None: + def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target, content_type=None) @@ -222,7 +222,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[QNetworkReply], None]], onProgress: Callable = None) -> None: + def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None: post_part = QHttpPart() post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data) post_part.setBody(body_data) From 3173eb6740c9a7612dee1a28c1e885301b1a8688 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Wed, 3 Jan 2018 16:15:12 +0100 Subject: [PATCH 150/551] Avoid mega-tons of object copying when building compressed gcode CL-541 --- .../NetworkedPrinterOutputDevice.py | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 46523e5989..4914473ed1 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -80,28 +80,32 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): ## Mash the data into single string max_chars_per_line = int(1024 * 1024 / 4) # 1/4 MB per line. - byte_array_file_data = b"" - batched_line = "" + file_data_bytes_list = [] + batched_lines = [] + batched_lines_count = 0 for line in self._gcode: if not self._compressing_gcode: self._progress_message.hide() # Stop trying to zip / send as abort was called. return None - batched_line += line + # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. # Compressing line by line in this case is extremely slow, so we need to batch them. - if len(batched_line) < max_chars_per_line: - continue - byte_array_file_data += self._compressDataAndNotifyQt(batched_line) - batched_line = "" + batched_lines.append(line) + batched_lines_count += len(line) + + if batched_lines_count >= max_chars_per_line: + file_data_bytes_list.append(self._compressDataAndNotifyQt("".join(batched_lines))) + batched_lines = [] + batched_lines_count # Don't miss the last batch (If any) - if batched_line: - byte_array_file_data += self._compressDataAndNotifyQt(batched_line) + if len(batched_lines) != 0: + file_data_bytes_list.append(self._compressDataAndNotifyQt("".join(batched_lines))) self._compressing_gcode = False - return byte_array_file_data + return b"".join(file_data_bytes_list) def _update(self) -> bool: if self._last_response_time: From 487fca31dd06a63be85215abc8fa361db8b9b3e4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Jan 2018 16:59:05 +0100 Subject: [PATCH 151/551] Chopped up bunch of functions. As per review request. CL-541 --- .../ClusterUM3OutputDevice.py | 279 ++++++++++-------- 1 file changed, 149 insertions(+), 130 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 9cf83e965a..c87fdaa0ba 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -216,15 +216,13 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def getDateCompleted(self, time_remaining): current_time = time() datetime_completed = datetime.fromtimestamp(current_time + time_remaining) - return (datetime_completed.strftime("%a %b ") + "{day}".format(day=datetime_completed.day)).upper() def _printJobStateChanged(self): username = self._getUserName() if username is None: - # We only want to show notifications if username is set. - return + return # We only want to show notifications if username is set. finished_jobs = [job for job in self._print_jobs if job.state == "wait_cleanup"] @@ -244,144 +242,165 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self.get("print_jobs/", onFinished=self._onGetPrintJobsFinished) def _onGetPrintJobsFinished(self, reply: QNetworkReply): - status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) - if status_code == 200: - try: - result = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid print jobs message: Not valid JSON.") - return - print_jobs_seen = [] - job_list_changed = False - for print_job_data in result: - print_job = None - for job in self._print_jobs: - if job.key == print_job_data["uuid"]: - print_job = job - break + if not checkValidGetReply(reply): + return - if print_job is None: - print_job = PrintJobOutputModel(output_controller = ClusterUM3PrinterOutputController(self), - key = print_job_data["uuid"], - name = print_job_data["name"]) - print_job.stateChanged.connect(self._printJobStateChanged) - job_list_changed = True - self._print_jobs.append(print_job) - print_job.updateTimeTotal(print_job_data["time_total"]) - print_job.updateTimeElapsed(print_job_data["time_elapsed"]) - print_job.updateState(print_job_data["status"]) - print_job.updateOwner(print_job_data["owner"]) - printer = None - if print_job.state != "queued": - # Print job should be assigned to a printer. - printer = self._getPrinterByKey(print_job_data["printer_uuid"]) - else: # Status is queued - # The job can "reserve" a printer if some changes are required. - printer = self._getPrinterByKey(print_job_data["assigned_to"]) + result = loadJsonFromReply(reply) + if result is None: + return - if printer: - printer.updateActivePrintJob(print_job) + print_jobs_seen = [] + job_list_changed = False + for print_job_data in result: + print_job = findByKey(self._print_jobs, print_job_data["uuid"]) - print_jobs_seen.append(print_job) + if print_job is None: + print_job = self._createJobModel() + job_list_changed = True - # Check what jobs need to be removed. - removed_jobs = [print_job for print_job in self._print_jobs if print_job not in print_jobs_seen] - for removed_job in removed_jobs: - if removed_job.assignedPrinter: - removed_job.assignedPrinter.updateActivePrintJob(None) - removed_job.stateChanged.disconnect(self._printJobStateChanged) - self._print_jobs.remove(removed_job) - job_list_changed = True + self._updatePrintJob(print_job, print_job_data) - # Do a single emit for all print job changes. - if job_list_changed: - self.printJobsChanged.emit() + if print_job.state != "queued": # Print job should be assigned to a printer. + printer = self._getPrinterByKey(print_job_data["printer_uuid"]) + else: # The job can "reserve" a printer if some changes are required. + printer = self._getPrinterByKey(print_job_data["assigned_to"]) + + if printer: + printer.updateActivePrintJob(print_job) + + print_jobs_seen.append(print_job) + + # Check what jobs need to be removed. + removed_jobs = [print_job for print_job in self._print_jobs if print_job not in print_jobs_seen] + for removed_job in removed_jobs: + job_list_changed |= self._removeJob(removed_job) + + if job_list_changed: + self.printJobsChanged.emit() # Do a single emit for all print job changes. def _onGetPrintersDataFinished(self, reply: QNetworkReply): - status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) - if status_code == 200: - try: - result = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid printers state message: Not valid JSON.") - return - printer_list_changed = False - # TODO: Ensure that printers that have been removed are also removed locally. + if not checkValidGetReply(reply): + return - printers_seen = [] + result = loadJsonFromReply(reply) + if result is None: + return - for printer_data in result: - uuid = printer_data["uuid"] + printer_list_changed = False + printers_seen = [] - printer = None - for device in self._printers: - if device.key == uuid: - printer = device - break + for printer_data in result: + printer = findByKey(self._printers, printer_data["uuid"]) - if printer is None: - printer = PrinterOutputModel(output_controller=ClusterUM3PrinterOutputController(self), number_of_extruders=self._number_of_extruders) - printer.setCamera(NetworkCamera("http://" + printer_data["ip_address"] + ":8080/?action=stream")) - self._printers.append(printer) - printer_list_changed = True - - printers_seen.append(printer) - - printer.updateName(printer_data["friendly_name"]) - printer.updateKey(uuid) - printer.updateType(printer_data["machine_variant"]) - if not printer_data["enabled"]: - printer.updateState("disabled") - else: - printer.updateState(printer_data["status"]) - - for index in range(0, self._number_of_extruders): - extruder = printer.extruders[index] - try: - extruder_data = printer_data["configuration"][index] - except IndexError: - break - - try: - hotend_id = extruder_data["print_core_id"] - except KeyError: - hotend_id = "" - extruder.updateHotendID(hotend_id) - - material_data = extruder_data["material"] - if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_data["guid"]: - containers = ContainerRegistry.getInstance().findInstanceContainers(type="material", - GUID=material_data["guid"]) - if containers: - color = containers[0].getMetaDataEntry("color_code") - brand = containers[0].getMetaDataEntry("brand") - material_type = containers[0].getMetaDataEntry("material") - name = containers[0].getName() - else: - Logger.log("w", "Unable to find material with guid {guid}. Using data as provided by cluster".format(guid = material_data["guid"])) - # Unknown material. - color = material_data["color"] - brand = material_data["brand"] - material_type = material_data["material"] - name = "Unknown" - - material = MaterialOutputModel(guid = material_data["guid"], - type = material_type, - brand = brand, - color = color, - name = name) - extruder.updateActiveMaterial(material) - removed_printers = [printer for printer in self._printers if printer not in printers_seen] - - for removed_printer in removed_printers: - self._printers.remove(removed_printer) + if printer is None: + printer = self._createPrinterModel(printer_data) printer_list_changed = True - if self._active_printer == removed_printer: - self._active_printer = None - self.activePrinterChanged.emit() - if printer_list_changed: - self.printersChanged.emit() + printers_seen.append(printer) + + self._updatePrinter(printer, printer_data) + + removed_printers = [printer for printer in self._printers if printer not in printers_seen] + for printer in removed_printers: + self._removePrinter(printer) + + if removed_printers or printer_list_changed: + self.printersChanged.emit() + + def _createPrinterModel(self, data): + printer = PrinterOutputModel(output_controller=ClusterUM3PrinterOutputController(self), + number_of_extruders=self._number_of_extruders) + printer.setCamera(NetworkCamera("http://" + data["ip_address"] + ":8080/?action=stream")) + self._printers.append(printer) + return printer + + def _createPrintJobModel(self, data): + print_job = PrintJobOutputModel(output_controller=ClusterUM3PrinterOutputController(self), + key=data["uuid"], name= data["name"]) + print_job.stateChanged.connect(self._printJobStateChanged) + self._print_jobs.append(print_job) + return print_job + + def _updatePrintJob(self, print_job, data): + print_job.updateTimeTotal(data["time_total"]) + print_job.updateTimeElapsed(data["time_elapsed"]) + print_job.updateState(data["status"]) + print_job.updateOwner(data["owner"]) + + def _updatePrinter(self, printer, data): + printer.updateName(data["friendly_name"]) + printer.updateKey(data["uuid"]) + printer.updateType(data["machine_variant"]) + if not data["enabled"]: + printer.updateState("disabled") else: - Logger.log("w", - "Got status code {status_code} while trying to get printer data".format(status_code=status_code)) \ No newline at end of file + printer.updateState(data["status"]) + + for index in range(0, self._number_of_extruders): + extruder = printer.extruders[index] + try: + extruder_data = data["configuration"][index] + except IndexError: + break + + extruder.updateHotendID(extruder_data.get("print_core_id", "")) + + material_data = extruder_data["material"] + if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_data["guid"]: + containers = ContainerRegistry.getInstance().findInstanceContainers(type="material", + GUID=material_data["guid"]) + if containers: + color = containers[0].getMetaDataEntry("color_code") + brand = containers[0].getMetaDataEntry("brand") + material_type = containers[0].getMetaDataEntry("material") + name = containers[0].getName() + else: + Logger.log("w", + "Unable to find material with guid {guid}. Using data as provided by cluster".format( + guid=material_data["guid"])) + color = material_data["color"] + brand = material_data["brand"] + material_type = material_data["material"] + name = "Unknown" + + material = MaterialOutputModel(guid=material_data["guid"], type=material_type, + brand=brand, color=color, name=name) + extruder.updateActiveMaterial(material) + + def _removeJob(self, job): + if job.assignedPrinter: + job.assignedPrinter.updateActivePrintJob(None) + job.stateChanged.disconnect(self._printJobStateChanged) + self._print_jobs.remove(job) + return True + return False + + def _removePrinter(self, printer): + self._printers.remove(printer) + if self._active_printer == printer: + self._active_printer = None + self.activePrinterChanged.emit() + + +def loadJsonFromReply(reply): + try: + result = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.logException("w", "Unable to decode JSON from reply.") + return + return result + + +def checkValidGetReply(reply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + + if status_code != 200: + Logger.log("w", "Got status code {status_code} while trying to get data".format(status_code=status_code)) + return False + return True + + +def findByKey(list, key): + for item in list: + if item.key == key: + return item \ No newline at end of file From 42b50bf74974b07be9d50f99cd6eb09f5d5b03b5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Jan 2018 17:14:52 +0100 Subject: [PATCH 152/551] Fixed typo in function CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index c87fdaa0ba..52f39c42e9 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -255,7 +255,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job = findByKey(self._print_jobs, print_job_data["uuid"]) if print_job is None: - print_job = self._createJobModel() + print_job = self._createPrintJobModel() job_list_changed = True self._updatePrintJob(print_job, print_job_data) From e18b3b36697f4fc6ee571540b4a4f1484faafdc5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 3 Jan 2018 17:29:49 +0100 Subject: [PATCH 153/551] Remove duplicate setting Some merge conflict, I think. Contributes to issue CURA-4523. --- resources/definitions/fdmprinter.def.json | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index cfad51eeb5..15047be75a 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5377,22 +5377,7 @@ "enabled": "support_enable and (support_pattern == 'zigzag') and support_skip_some_zags", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, - "children": { - "support_zag_skip_count": { - "label": "Support Chunk Line Count", - "description": "Skip one in every N connection lines to make the support structure easier to break away.", - "type": "int", - "default_value": 5, - "value": "0 if support_line_distance == 0 else round(support_skip_zag_per_mm / support_line_distance)", - "minimum_value": "1", - "minimum_value_warning": "3", - "enabled": "support_enable and (support_pattern == 'zigzag') and support_skip_some_zags", - "limit_to_extruder": "support_infill_extruder_nr", - "settable_per_mesh": false, - "settable_per_extruder": true - } - } + "settable_per_extruder": true } } }, From faa4af634afd47f04cafbdc97b23e8b57cbc9c3e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 09:58:15 +0100 Subject: [PATCH 154/551] Show pause text even if there is nothing to pause CL-541 --- resources/qml/MonitorButton.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index bd14cc58fe..0e9728da3d 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -277,10 +277,9 @@ Item (["paused", "printing"].indexOf(activePrintJob.state) >= 0) text: { - var result = ""; if (!printerConnected || activePrintJob == null) { - return ""; + return catalog.i18nc("@label:", "Pause"); } if (activePrintJob.state == "paused") From 9e055f03408b88005350ebaabb4153cb928d2d35 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 10:04:00 +0100 Subject: [PATCH 155/551] Added missing parameter CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 52f39c42e9..7aa6ebb03e 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -255,7 +255,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job = findByKey(self._print_jobs, print_job_data["uuid"]) if print_job is None: - print_job = self._createPrintJobModel() + print_job = self._createPrintJobModel(print_job_data) job_list_changed = True self._updatePrintJob(print_job, print_job_data) From 6cf6d51feacb7030c86d0c09eee83e3026f09b2d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 10:06:09 +0100 Subject: [PATCH 156/551] Queued and printing amount now gets updated on state change CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 7aa6ebb03e..0e603d2816 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -232,6 +232,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): job_completed_message = Message(text=job_completed_text, title = i18n_catalog.i18nc("@info:status", "Print finished")) job_completed_message.show() + # Ensure UI gets updated + self.printJobsChanged.emit() + # Keep a list of all completed jobs so we know if something changed next time. self._finished_jobs = finished_jobs From b6ebb804ba81f1e2920cefc7f95524958ed4b355 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 10:13:55 +0100 Subject: [PATCH 157/551] OutputDevice header now shows name of active printer CL-541 --- resources/qml/PrinterOutput/OutputDeviceHeader.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/qml/PrinterOutput/OutputDeviceHeader.qml b/resources/qml/PrinterOutput/OutputDeviceHeader.qml index ca64c79f2b..d6ac863b87 100644 --- a/resources/qml/PrinterOutput/OutputDeviceHeader.qml +++ b/resources/qml/PrinterOutput/OutputDeviceHeader.qml @@ -13,11 +13,12 @@ Item implicitWidth: parent.width implicitHeight: Math.floor(childrenRect.height + UM.Theme.getSize("default_margin").height * 2) property var outputDevice: null + Rectangle { anchors.fill: parent color: UM.Theme.getColor("setting_category") - + property var activePrinter: outputDevice != null ? outputDevice.activePrinter : null Label { id: outputDeviceNameLabel @@ -26,7 +27,7 @@ Item anchors.left: parent.left anchors.top: parent.top anchors.margins: UM.Theme.getSize("default_margin").width - text: outputDevice != null ? outputDevice.name : catalog.i18nc("@info:status", "No printer connected") + text: outputDevice != null ? activePrinter.name : "" } Label { From 4cb7bc03ad7ccff89069dd2a3634c375fcb28620 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 10:30:03 +0100 Subject: [PATCH 158/551] Sidebar tooltips are now visible again CL-541 --- resources/qml/Cura.qml | 46 +++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 0f55ad07fa..0aef23a2e1 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -383,6 +383,29 @@ UM.MainWindow anchors.top: parent.top } + Loader + { + id: main + + anchors + { + top: topbar.bottom + bottom: parent.bottom + left: parent.left + right: sidebar.left + } + + MouseArea + { + visible: UM.Controller.activeStage.mainComponent != "" + anchors.fill: parent + acceptedButtons: Qt.AllButtons + onWheel: wheel.accepted = true + } + + source: UM.Controller.activeStage.mainComponent + } + Loader { id: sidebar @@ -443,29 +466,6 @@ UM.MainWindow } } - Loader - { - id: main - - anchors - { - top: topbar.bottom - bottom: parent.bottom - left: parent.left - right: sidebar.left - } - - MouseArea - { - visible: UM.Controller.activeStage.mainComponent != "" - anchors.fill: parent - acceptedButtons: Qt.AllButtons - onWheel: wheel.accepted = true - } - - source: UM.Controller.activeStage.mainComponent - } - UM.MessageStack { anchors From 2588e11364976ee3133a0103f0496261b4462e45 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Thu, 4 Jan 2018 10:43:50 +0100 Subject: [PATCH 159/551] Improve and simplify how we hold on to form part objects CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 4914473ed1..73bd5e192b 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -45,7 +45,9 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._onFinishedCallbacks = {} # type: Dict[str, Callable[[QNetworkReply], None]] self._authentication_state = AuthState.NotAuthenticated - self._cached_multiparts = {} # type: Dict[int, Tuple[QHttpMultiPart, QNetworkReply]] + # QHttpMultiPart objects need to be kept alive and not garbage collected during the + # HTTP which uses them. We hold references to these QHttpMultiPart objects here. + self._live_multiparts = {} # type: Dict[QNetworkReply, QHttpMultiPart] self._sending_gcode = False self._compressing_gcode = False @@ -170,8 +172,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): return "Unknown User" # Couldn't find out username. def _clearCachedMultiPart(self, reply: QNetworkReply) -> None: - if id(reply) in self._cached_multiparts: - del self._cached_multiparts[id(reply)] + if reply in self._live_multiparts: + del self._live_multiparts[reply] def put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: if self._manager is None: @@ -219,7 +221,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): reply = self._manager.post(request, multi_post_part) - self._cached_multiparts[id(reply)] = (multi_post_part, reply) + self._live_multiparts[reply] = multi_post_part if onProgress is not None: reply.uploadProgress.connect(onProgress) From 4685230d8dda950944e3b2e29a4bdd7c148561da Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 4 Jan 2018 10:59:44 +0100 Subject: [PATCH 160/551] Add missing super init call - CURA-4525 --- cura/Operations/SetBuildPlateNumberOperation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/Operations/SetBuildPlateNumberOperation.py b/cura/Operations/SetBuildPlateNumberOperation.py index c14d737f93..96230639f9 100644 --- a/cura/Operations/SetBuildPlateNumberOperation.py +++ b/cura/Operations/SetBuildPlateNumberOperation.py @@ -8,7 +8,9 @@ from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator ## Simple operation to set the buildplate number of a scenenode. class SetBuildPlateNumberOperation(Operation): + def __init__(self, node: SceneNode, build_plate_nr: int) -> None: + super().__init__() self._node = node self._build_plate_nr = build_plate_nr self._previous_build_plate_nr = None From 3f7d8997a16ee18c8a8e73ede68d084a88b04047 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 4 Jan 2018 11:33:12 +0100 Subject: [PATCH 161/551] Fix icon positions - CURA-4758 --- resources/qml/Settings/SettingCategory.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml index 5430306982..402f76b1c3 100644 --- a/resources/qml/Settings/SettingCategory.qml +++ b/resources/qml/Settings/SettingCategory.qml @@ -110,7 +110,7 @@ Button id: category_arrow anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width * 3 - width / 2 + 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 @@ -223,7 +223,7 @@ Button anchors { right: inheritButton.visible ? inheritButton.left : parent.right - rightMargin: inheritButton.visible? UM.Theme.getSize("default_margin").width / 2 : UM.Theme.getSize("setting_preferences_button_margin").width + rightMargin: inheritButton.visible ? UM.Theme.getSize("default_margin").width / 2 : category_arrow.width + UM.Theme.getSize("default_margin").width * 1.9 // 1.9 because there is a 0.1 difference between the settings and inheritance warning icons verticalCenter: parent.verticalCenter; } @@ -242,7 +242,7 @@ Button anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("setting_preferences_button_margin").width + anchors.rightMargin: category_arrow.width + UM.Theme.getSize("default_margin").width * 2 visible: { From 4cec27b1812e6b12669bb4373b123b409058f16a Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 4 Jan 2018 11:53:34 +0100 Subject: [PATCH 162/551] Fix QML warnings for combo boxes - CURA-4758 --- resources/qml/Settings/SettingComboBox.qml | 2 +- resources/qml/Settings/SettingExtruder.qml | 2 +- resources/qml/Settings/SettingOptionalExtruder.qml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml index 6168668157..325b1f2a30 100644 --- a/resources/qml/Settings/SettingComboBox.qml +++ b/resources/qml/Settings/SettingComboBox.qml @@ -77,7 +77,7 @@ SettingItem anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width anchors.verticalCenter: parent.verticalCenter - anchors.right: indicator.left + anchors.right: downArrow.left text: control.currentText font: UM.Theme.getFont("default") diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml index 3f7f20b2b5..cc47ebea44 100644 --- a/resources/qml/Settings/SettingExtruder.qml +++ b/resources/qml/Settings/SettingExtruder.qml @@ -134,7 +134,7 @@ SettingItem width: height anchors.right: parent.right - anchors.rightMargin: control.indicator.width + UM.Theme.getSize("setting_unit_margin").width + anchors.rightMargin: downArrow.width + UM.Theme.getSize("setting_unit_margin").width anchors.verticalCenter: parent.verticalCenter anchors.margins: UM.Theme.getSize("default_margin").width / 4 diff --git a/resources/qml/Settings/SettingOptionalExtruder.qml b/resources/qml/Settings/SettingOptionalExtruder.qml index 4fa7ac9c6c..9ca3eaaf4f 100644 --- a/resources/qml/Settings/SettingOptionalExtruder.qml +++ b/resources/qml/Settings/SettingOptionalExtruder.qml @@ -153,7 +153,7 @@ SettingItem width: height anchors.right: parent.right - anchors.rightMargin: control.indicator.width + UM.Theme.getSize("setting_unit_margin").width + anchors.rightMargin: downArrow.width + UM.Theme.getSize("setting_unit_margin").width anchors.verticalCenter: parent.verticalCenter anchors.margins: UM.Theme.getSize("default_margin").width / 4 From 2e8ae5c590de74fb47e0170436316bdfa966f814 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 12:54:47 +0100 Subject: [PATCH 163/551] Unsasigned jobs are now also removed from list CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 0e603d2816..244fb90b6b 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -275,6 +275,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # Check what jobs need to be removed. removed_jobs = [print_job for print_job in self._print_jobs if print_job not in print_jobs_seen] + for removed_job in removed_jobs: job_list_changed |= self._removeJob(removed_job) @@ -371,12 +372,15 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): extruder.updateActiveMaterial(material) def _removeJob(self, job): + if job not in self._print_jobs: + return False + if job.assignedPrinter: job.assignedPrinter.updateActivePrintJob(None) job.stateChanged.disconnect(self._printJobStateChanged) - self._print_jobs.remove(job) - return True - return False + self._print_jobs.remove(job) + + return True def _removePrinter(self, printer): self._printers.remove(printer) From 9cb7050681caaf8cc523f3976b914ce06760391d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 4 Jan 2018 12:54:58 +0100 Subject: [PATCH 164/551] Remove unused code CURA-4672 --- cura/PlatformPhysics.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 06d796eed5..e79786dd9c 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -42,7 +42,7 @@ class PlatformPhysics: def _onSceneChanged(self, source): self._change_timer.start() - def _onChangeTimerFinished(self, was_triggered_by_tool=False): + def _onChangeTimerFinished(self): if not self._enabled: return @@ -58,7 +58,6 @@ class PlatformPhysics: # Only check nodes inside build area. nodes = [node for node in nodes if (hasattr(node, "_outside_buildarea") and not node._outside_buildarea)] - active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate random.shuffle(nodes) for node in nodes: @@ -181,4 +180,4 @@ class PlatformPhysics: node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator) self._enabled = True - self._onChangeTimerFinished(True) + self._onChangeTimerFinished() From 3a4445b656babc8d2271db97b9d805a270f2d9ea Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 4 Jan 2018 12:55:56 +0100 Subject: [PATCH 165/551] Fix code style CURA-4672 --- cura/PlatformPhysics.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index e79786dd9c..ddc55302ee 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -34,7 +34,7 @@ class PlatformPhysics: self._change_timer.timeout.connect(self._onChangeTimerFinished) self._move_factor = 1.1 # By how much should we multiply overlap to calculate a new spot? self._max_overlap_checks = 10 # How many times should we try to find a new spot per tick? - self._minimum_gap = 2 # It is a minimum distance between two models, applicable for small models + self._minimum_gap = 2 # It is a minimum distance (in mm) between two models, applicable for small models Preferences.getInstance().addPreference("physics/automatic_push_free", True) Preferences.getInstance().addPreference("physics/automatic_drop_down", True) @@ -71,7 +71,7 @@ class PlatformPhysics: if Preferences.getInstance().getValue("physics/automatic_drop_down") and not (node.getParent() and node.getParent().callDecoration("isGroup")) and node.isEnabled(): #If an object is grouped, don't move it down z_offset = node.callDecoration("getZOffset") if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator) else 0 - move_vector = move_vector.set(y=-bbox.bottom + z_offset) + move_vector = move_vector.set(y = -bbox.bottom + z_offset) # If there is no convex hull for the node, start calculating it and continue. if not node.getDecorator(ConvexHullDecorator): @@ -130,7 +130,7 @@ class PlatformPhysics: overlap = own_convex_hull.translate(move_vector.x, move_vector.z).intersectsPolygon(other_convex_hull) if overlap: # Moving ensured that overlap was still there. Try anew! temp_move_vector = move_vector.set(x = move_vector.x + overlap[0] * self._move_factor, - z = move_vector.z + overlap[1] * self._move_factor) + z = move_vector.z + overlap[1] * self._move_factor) # if the distance between two models less than 2mm then try to find a new factor if abs(temp_move_vector.x - overlap[0]) < self._minimum_gap and abs(temp_move_vector.y - overlap[1]) < self._minimum_gap: @@ -148,7 +148,7 @@ class PlatformPhysics: move_vector = temp_move_vector else: # This can happen in some cases if the object is not yet done with being loaded. - # Simply waiting for the next tick seems to resolve this correctly. + # Simply waiting for the next tick seems to resolve this correctly. overlap = None if not Vector.Null.equals(move_vector, epsilon = 1e-5): From 7b8f951682322155e8fb5b332121d7bcbe6359a4 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 4 Jan 2018 13:02:10 +0100 Subject: [PATCH 166/551] Simplify temp_scale_factor assignment CURA-4672 --- cura/PlatformPhysics.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index ddc55302ee..0ad3cf1328 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -134,13 +134,10 @@ class PlatformPhysics: # if the distance between two models less than 2mm then try to find a new factor if abs(temp_move_vector.x - overlap[0]) < self._minimum_gap and abs(temp_move_vector.y - overlap[1]) < self._minimum_gap: - temp_scale_factor = self._move_factor temp_x_factor = (abs(overlap[0]) + self._minimum_gap) / overlap[0] if overlap[0] != 0 else 0 # find x move_factor, like (3.4 + 2) / 3.4 = 1.58 temp_y_factor = (abs(overlap[1]) + self._minimum_gap) / overlap[1] if overlap[1] != 0 else 0 # find y move_factor - if abs(temp_x_factor) > abs(temp_y_factor): - temp_scale_factor = temp_x_factor - else: - temp_scale_factor = temp_y_factor + + temp_scale_factor = temp_x_factor if abs(temp_x_factor) > abs(temp_y_factor) else temp_y_factor move_vector = move_vector.set(x = move_vector.x + overlap[0] * temp_scale_factor, z = move_vector.z + overlap[1] * temp_scale_factor) From 84adbc5f41ffd8f2648d001b50c35c1b78a017a8 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 4 Jan 2018 13:26:12 +0100 Subject: [PATCH 167/551] Use the 5.8 versions of QtQuick modules in QMLs CURA-4758 --- resources/qml/Settings/SettingCategory.qml | 4 ++-- resources/qml/Settings/SettingCheckBox.qml | 4 ++-- resources/qml/Settings/SettingComboBox.qml | 4 ++-- resources/qml/Settings/SettingExtruder.qml | 4 ++-- resources/qml/Settings/SettingItem.qml | 4 ++-- resources/qml/Settings/SettingOptionalExtruder.qml | 4 ++-- resources/qml/Settings/SettingTextField.qml | 4 ++-- resources/qml/Settings/SettingUnknown.qml | 4 ++-- resources/qml/Settings/SettingView.qml | 2 +- resources/qml/Sidebar.qml | 4 ++-- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml index 402f76b1c3..7804d1f496 100644 --- a/resources/qml/Settings/SettingCategory.qml +++ b/resources/qml/Settings/SettingCategory.qml @@ -1,8 +1,8 @@ // Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.2 -import QtQuick.Controls 2.0 +import QtQuick 2.8 +import QtQuick.Controls 2.1 import UM 1.1 as UM import Cura 1.0 as Cura diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml index 651ee91366..2aad6181d8 100644 --- a/resources/qml/Settings/SettingCheckBox.qml +++ b/resources/qml/Settings/SettingCheckBox.qml @@ -1,9 +1,9 @@ // Copyright (c) 2015 Ultimaker B.V. // Uranium is released under the terms of the LGPLv3 or higher. -import QtQuick 2.1 +import QtQuick 2.8 import QtQuick.Layouts 1.1 -import QtQuick.Controls 2.0 +import QtQuick.Controls 2.1 import UM 1.2 as UM diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml index 325b1f2a30..63d13ae514 100644 --- a/resources/qml/Settings/SettingComboBox.qml +++ b/resources/qml/Settings/SettingComboBox.qml @@ -1,8 +1,8 @@ // Copyright (c) 2015 Ultimaker B.V. // Uranium is released under the terms of the LGPLv3 or higher. -import QtQuick 2.1 -import QtQuick.Controls 2.0 +import QtQuick 2.8 +import QtQuick.Controls 2.1 import UM 1.1 as UM diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml index cc47ebea44..6ad1ce942e 100644 --- a/resources/qml/Settings/SettingExtruder.qml +++ b/resources/qml/Settings/SettingExtruder.qml @@ -1,8 +1,8 @@ // Copyright (c) 2016 Ultimaker B.V. // Uranium is released under the terms of the LGPLv3 or higher. -import QtQuick 2.1 -import QtQuick.Controls 2.0 +import QtQuick 2.8 +import QtQuick.Controls 2.1 import UM 1.1 as UM import Cura 1.0 as Cura diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 278d9a9ce2..1b1f302846 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -1,9 +1,9 @@ // Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.1 +import QtQuick 2.8 import QtQuick.Layouts 1.1 -import QtQuick.Controls 2.0 +import QtQuick.Controls 2.1 import UM 1.1 as UM import Cura 1.0 as Cura diff --git a/resources/qml/Settings/SettingOptionalExtruder.qml b/resources/qml/Settings/SettingOptionalExtruder.qml index 9ca3eaaf4f..3f6182e06c 100644 --- a/resources/qml/Settings/SettingOptionalExtruder.qml +++ b/resources/qml/Settings/SettingOptionalExtruder.qml @@ -1,8 +1,8 @@ // Copyright (c) 2016 Ultimaker B.V. // Uranium is released under the terms of the LGPLv3 or higher. -import QtQuick 2.1 -import QtQuick.Controls 2.0 +import QtQuick 2.8 +import QtQuick.Controls 2.1 import UM 1.1 as UM import Cura 1.0 as Cura diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 2f0c776eb6..30dff2490f 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -1,8 +1,8 @@ // Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.2 -import QtQuick.Controls 2.0 +import QtQuick 2.8 +import QtQuick.Controls 2.1 import UM 1.1 as UM diff --git a/resources/qml/Settings/SettingUnknown.qml b/resources/qml/Settings/SettingUnknown.qml index bca786dc0d..82d54f96b8 100644 --- a/resources/qml/Settings/SettingUnknown.qml +++ b/resources/qml/Settings/SettingUnknown.qml @@ -1,8 +1,8 @@ // Copyright (c) 2015 Ultimaker B.V. // Uranium is released under the terms of the LGPLv3 or higher. -import QtQuick 2.1 -import QtQuick.Controls 2.0 +import QtQuick 2.8 +import QtQuick.Controls 2.1 import UM 1.2 as UM diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 5d39572647..6929614830 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -1,7 +1,7 @@ // Copyright (c) 2017 Ultimaker B.V. // Uranium is released under the terms of the LGPLv3 or higher. -import QtQuick 2.2 +import QtQuick 2.8 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 1b498c6024..326d5a0447 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -1,8 +1,8 @@ // Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.2 -import QtQuick.Controls 2.0 +import QtQuick 2.8 +import QtQuick.Controls 2.1 import QtQuick.Layouts 1.1 import UM 1.2 as UM From 695c7d826706ebc59c707c6bb9eed4a5a25e348f Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Thu, 4 Jan 2018 13:26:13 +0100 Subject: [PATCH 168/551] Rename the `_live_multiparts` to the even better `_kept_alive_multiparts` name CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 73bd5e192b..f2acc2115d 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -47,7 +47,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): # QHttpMultiPart objects need to be kept alive and not garbage collected during the # HTTP which uses them. We hold references to these QHttpMultiPart objects here. - self._live_multiparts = {} # type: Dict[QNetworkReply, QHttpMultiPart] + self._kept_alive_multiparts = {} # type: Dict[QNetworkReply, QHttpMultiPart] self._sending_gcode = False self._compressing_gcode = False @@ -172,8 +172,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): return "Unknown User" # Couldn't find out username. def _clearCachedMultiPart(self, reply: QNetworkReply) -> None: - if reply in self._live_multiparts: - del self._live_multiparts[reply] + if reply in self._kept_alive_multiparts: + del self._kept_alive_multiparts[reply] def put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: if self._manager is None: @@ -221,7 +221,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): reply = self._manager.post(request, multi_post_part) - self._live_multiparts[reply] = multi_post_part + self._kept_alive_multiparts[reply] = multi_post_part if onProgress is not None: reply.uploadProgress.connect(onProgress) From acde48108dc83efa3adb8aba53f7b97fcbe54a86 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 13:31:54 +0100 Subject: [PATCH 169/551] Removed control item CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 244fb90b6b..51e713904b 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -69,14 +69,6 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._finished_jobs = [] - @pyqtProperty(QObject, notify=activePrinterChanged) - def controlItem(self): - if self._active_printer is None: - return super().controlItem - else: - # Let cura use the default. - return None - def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): # Notify the UI that a switch to the print monitor should happen Application.getInstance().getController().setActiveStage("MonitorStage") From b20e35714fafe71b16664ec00ad12e8b1498fcf4 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Thu, 4 Jan 2018 13:33:53 +0100 Subject: [PATCH 170/551] Factor out the code for adding a function for run after a HTTP request CL-541 --- .../NetworkedPrinterOutputDevice.py | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index f2acc2115d..7cf855ee85 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -181,8 +181,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request = self._createEmptyRequest(target) self._last_request_time = time() reply = self._manager.put(request, data.encode()) - if onFinished is not None: - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + self._registerOnFinishedCallback(reply, onFinished) def get(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: if self._manager is None: @@ -190,13 +189,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request = self._createEmptyRequest(target) self._last_request_time = time() reply = self._manager.get(request) - if onFinished is not None: - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - - def delete(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: - if self._manager is None: - self._createNetworkManager() - self._last_request_time = time() + self._registerOnFinishedCallback(reply, onFinished) def post(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None: if self._manager is None: @@ -206,8 +199,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): reply = self._manager.post(request, data) if onProgress is not None: reply.uploadProgress.connect(onProgress) - if onFinished is not None: - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + self._registerOnFinishedCallback(reply, onFinished) def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None: if self._manager is None: @@ -225,8 +217,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onProgress is not None: reply.uploadProgress.connect(onProgress) - if onFinished is not None: - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + self._registerOnFinishedCallback(reply, onFinished) def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None: post_part = QHttpPart() @@ -249,6 +240,10 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._last_manager_create_time = time() self._manager.authenticationRequired.connect(self._onAuthenticationRequired) + def _registerOnFinishedCallback(self, reply: QNetworkReply, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: + if onFinished is not None: + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + def __handleOnFinished(self, reply: QNetworkReply) -> None: # Due to garbage collection, we need to cache certain bits of post operations. # As we don't want to keep them around forever, delete them if we get a reply. From d20895a05594b3ce8f52b42f2100006787652395 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 4 Jan 2018 13:51:45 +0100 Subject: [PATCH 171/551] Fix code style CURA-4758 --- resources/qml/Settings/SettingCategory.qml | 110 +++++++----------- resources/qml/Settings/SettingExtruder.qml | 8 +- .../qml/Settings/SettingOptionalExtruder.qml | 8 +- resources/qml/Sidebar.qml | 22 ++-- 4 files changed, 59 insertions(+), 89 deletions(-) diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml index 7804d1f496..cc7ca9354d 100644 --- a/resources/qml/Settings/SettingCategory.qml +++ b/resources/qml/Settings/SettingCategory.qml @@ -9,24 +9,24 @@ import Cura 1.0 as Cura Button { - id: base; + id: base anchors.left: parent.left anchors.right: parent.right anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width background: Rectangle { - implicitHeight: UM.Theme.getSize("section").height; + implicitHeight: UM.Theme.getSize("section").height color: { - if(base.color) { + if (base.color) { return base.color; - } else if(!base.enabled) { + } else if (!base.enabled) { return UM.Theme.getColor("setting_category_disabled"); - } else if(base.hovered && base.checkable && base.checked) { + } else if (base.hovered && base.checkable && base.checked) { return UM.Theme.getColor("setting_category_active_hover"); - } else if(base.pressed || (base.checkable && base.checked)) { + } else if (base.pressed || (base.checkable && base.checked)) { return UM.Theme.getColor("setting_category_active"); - } else if(base.hovered) { + } else if (base.hovered) { return UM.Theme.getColor("setting_category_hover"); } else { return UM.Theme.getColor("setting_category"); @@ -39,13 +39,13 @@ Button width: parent.width anchors.bottom: parent.bottom color: { - if(!base.enabled) { + if (!base.enabled) { return UM.Theme.getColor("setting_category_disabled_border"); - } else if((base.hovered || base.activeFocus) && base.checkable && base.checked) { + } else if ((base.hovered || base.activeFocus) && base.checkable && base.checked) { return UM.Theme.getColor("setting_category_active_hover_border"); - } else if(base.pressed || (base.checkable && base.checked)) { + } else if (base.pressed || (base.checkable && base.checked)) { return UM.Theme.getColor("setting_category_active_border"); - } else if(base.hovered || base.activeFocus) { + } else if (base.hovered || base.activeFocus) { return UM.Theme.getColor("setting_category_hover_border"); } else { return UM.Theme.getColor("setting_category_border"); @@ -66,7 +66,7 @@ Button //text: definition.label contentItem: Item { - anchors.fill: parent; + anchors.fill: parent anchors.left: parent.left Label { @@ -78,31 +78,22 @@ Button verticalCenter: parent.verticalCenter; } text: definition.label - font: UM.Theme.getFont("setting_category"); + font: UM.Theme.getFont("setting_category") color: { - if(!base.enabled) - { + if (!base.enabled) { return UM.Theme.getColor("setting_category_disabled_text"); - } - else if((base.hovered || base.activeFocus) && base.checkable && base.checked) - { + } else if ((base.hovered || base.activeFocus) && base.checkable && base.checked) { return UM.Theme.getColor("setting_category_active_hover_text"); - } - else if(base.pressed || (base.checkable && base.checked)) - { + } else if (base.pressed || (base.checkable && base.checked)) { return UM.Theme.getColor("setting_category_active_text"); - } - else if(base.hovered || base.activeFocus) - { + } else if (base.hovered || base.activeFocus) { return UM.Theme.getColor("setting_category_hover_text"); - } - else - { + } else { return UM.Theme.getColor("setting_category_text"); } } - fontSizeMode: Text.HorizontalFit; + fontSizeMode: Text.HorizontalFit minimumPointSize: 8 } UM.RecolorImage @@ -117,24 +108,15 @@ Button sourceSize.height: width color: { - if(!base.enabled) - { + if (!base.enabled) { return UM.Theme.getColor("setting_category_disabled_text"); - } - else if((base.hovered || base.activeFocus) && base.checkable && base.checked) - { + } else if ((base.hovered || base.activeFocus) && base.checkable && base.checked) { return UM.Theme.getColor("setting_category_active_hover_text"); - } - else if(base.pressed || (base.checkable && base.checked)) - { + } else if (base.pressed || (base.checkable && base.checked)) { return UM.Theme.getColor("setting_category_active_text"); - } - else if(base.hovered || base.activeFocus) - { + } else if (base.hovered || base.activeFocus) { return UM.Theme.getColor("setting_category_hover_text"); - } - else - { + } else { return UM.Theme.getColor("setting_category_text"); } } @@ -150,24 +132,15 @@ Button anchors.leftMargin: UM.Theme.getSize("default_margin").width color: { - if(!base.enabled) - { + if (!base.enabled) { return UM.Theme.getColor("setting_category_disabled_text"); - } - else if((base.hovered || base.activeFocus) && base.checkable && base.checked) - { + } else if((base.hovered || base.activeFocus) && base.checkable && base.checked) { return UM.Theme.getColor("setting_category_active_hover_text"); - } - else if(base.pressed || (base.checkable && base.checked)) - { + } else if(base.pressed || (base.checkable && base.checked)) { return UM.Theme.getColor("setting_category_active_text"); - } - else if(base.hovered || base.activeFocus) - { + } else if(base.hovered || base.activeFocus) { return UM.Theme.getColor("setting_category_hover_text"); - } - else - { + } else { return UM.Theme.getColor("setting_category_text"); } } @@ -178,18 +151,14 @@ Button sourceSize.height: width + 15 * screenScaleFactor } - checkable: true checked: definition.expanded onClicked: { - if(definition.expanded) - { + if (definition.expanded) { settingDefinitionsModel.collapse(definition.key); - } - else - { + } else { settingDefinitionsModel.expandAll(definition.key); } //Set focus so that tab navigation continues from this point on. @@ -223,13 +192,14 @@ Button anchors { right: inheritButton.visible ? inheritButton.left : parent.right - rightMargin: inheritButton.visible ? UM.Theme.getSize("default_margin").width / 2 : category_arrow.width + UM.Theme.getSize("default_margin").width * 1.9 // 1.9 because there is a 0.1 difference between the settings and inheritance warning icons - verticalCenter: parent.verticalCenter; + // use 1.9 as the factor because there is a 0.1 difference between the settings and inheritance warning icons + rightMargin: inheritButton.visible ? UM.Theme.getSize("default_margin").width / 2 : category_arrow.width + UM.Theme.getSize("default_margin").width * 1.9 + verticalCenter: parent.verticalCenter } - color: UM.Theme.getColor("setting_control_button"); + color: UM.Theme.getColor("setting_control_button") hoverColor: UM.Theme.getColor("setting_control_button_hover") - iconSource: UM.Theme.getIcon("settings"); + iconSource: UM.Theme.getIcon("settings") onClicked: { Cura.Actions.configureSettingVisibility.trigger(definition) @@ -238,7 +208,7 @@ Button UM.SimpleButton { - id: inheritButton; + id: inheritButton anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right @@ -246,12 +216,12 @@ Button visible: { - if(Cura.SettingInheritanceManager.settingsWithInheritanceWarning.indexOf(definition.key) >= 0) + if (Cura.SettingInheritanceManager.settingsWithInheritanceWarning.indexOf(definition.key) >= 0) { var children_with_override = Cura.SettingInheritanceManager.getChildrenKeysWithOverride(definition.key) - for(var i = 0; i < children_with_override.length; i++) + for (var i = 0; i < children_with_override.length; i++) { - if(!settingDefinitionsModel.getVisible(children_with_override[i])) + if (!settingDefinitionsModel.getVisible(children_with_override[i])) { return true } diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml index 6ad1ce942e..b754c3fd74 100644 --- a/resources/qml/Settings/SettingExtruder.qml +++ b/resources/qml/Settings/SettingExtruder.qml @@ -83,11 +83,11 @@ SettingItem { color: { - if(!enabled) + if (!enabled) { return UM.Theme.getColor("setting_control_disabled"); } - if(control.hovered || base.activeFocus) + if (control.hovered || base.activeFocus) { return UM.Theme.getColor("setting_control_highlight"); } @@ -96,11 +96,11 @@ SettingItem border.width: UM.Theme.getSize("default_lining").width border.color: { - if(!enabled) + if (!enabled) { return UM.Theme.getColor("setting_control_disabled_border") } - if(control.hovered || control.activeFocus) + if (control.hovered || control.activeFocus) { return UM.Theme.getColor("setting_control_border_highlight") } diff --git a/resources/qml/Settings/SettingOptionalExtruder.qml b/resources/qml/Settings/SettingOptionalExtruder.qml index 3f6182e06c..3bb2a2f1e0 100644 --- a/resources/qml/Settings/SettingOptionalExtruder.qml +++ b/resources/qml/Settings/SettingOptionalExtruder.qml @@ -102,11 +102,11 @@ SettingItem { color: { - if(!enabled) + if (!enabled) { return UM.Theme.getColor("setting_control_disabled"); } - if(control.hovered || control.activeFocus) + if (control.hovered || control.activeFocus) { return UM.Theme.getColor("setting_control_highlight"); } @@ -115,11 +115,11 @@ SettingItem border.width: UM.Theme.getSize("default_lining").width border.color: { - if(!enabled) + if (!enabled) { return UM.Theme.getColor("setting_control_disabled_border") } - if(control.hovered || control.activeFocus) + if (control.hovered || control.activeFocus) { return UM.Theme.getColor("setting_control_border_highlight") } diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 326d5a0447..e6e0fee023 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -11,9 +11,9 @@ import "Menus" Rectangle { - id: base; + id: base - property int currentModeIndex; + property int currentModeIndex property bool hideSettings: PrintInformation.preSliced property bool hideView: Cura.MachineManager.activeMachineName == "" @@ -77,7 +77,7 @@ Rectangle MouseArea { anchors.fill: parent - acceptedButtons: Qt.AllButtons; + acceptedButtons: Qt.AllButtons onWheel: { @@ -125,7 +125,7 @@ Rectangle Label { id: settingsModeLabel - text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Print Setup disabled\nG-code files cannot be modified"); + text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox", "Print Setup disabled\nG-code files cannot be modified") anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width anchors.top: headerSeparator.bottom @@ -557,19 +557,19 @@ Rectangle SidebarTooltip { - id: tooltip; + id: tooltip } // Setting mode: Recommended or Custom ListModel { - id: modesListModel; + id: modesListModel } SidebarSimple { - id: sidebarSimple; - visible: false; + id: sidebarSimple + visible: false onShowTooltip: base.showTooltip(item, location, text) onHideTooltip: base.hideTooltip() @@ -577,8 +577,8 @@ Rectangle SidebarAdvanced { - id: sidebarAdvanced; - visible: false; + id: sidebarAdvanced + visible: false onShowTooltip: base.showTooltip(item, location, text) onHideTooltip: base.hideTooltip() @@ -596,7 +596,7 @@ Rectangle tooltipText: catalog.i18nc("@tooltip", "Custom Print Setup

Print with finegrained control over every last bit of the slicing process."), item: sidebarAdvanced }) - sidebarContents.replace( modesListModel.get(base.currentModeIndex).item, { "immediate": true }) + sidebarContents.replace(modesListModel.get(base.currentModeIndex).item, { "immediate": true }) var index = Math.floor(UM.Preferences.getValue("cura/active_mode")) if(index) From abdc33a0b9c44f2653a3829df5fd3168c793c0f1 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 4 Jan 2018 14:23:22 +0100 Subject: [PATCH 172/551] CURA-4672 fix auto arrange for small models, they are now rounded up to 1 pixel rasterized --- cura/Arranging/ShapeArray.py | 6 ++++++ tests/TestArrange.py | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/cura/Arranging/ShapeArray.py b/cura/Arranging/ShapeArray.py index 9232c9f22f..6ef92b1743 100644 --- a/cura/Arranging/ShapeArray.py +++ b/cura/Arranging/ShapeArray.py @@ -29,8 +29,14 @@ class ShapeArray: offset_x = int(numpy.amin(flip_vertices[:, 1])) flip_vertices[:, 0] = numpy.add(flip_vertices[:, 0], -offset_y) flip_vertices[:, 1] = numpy.add(flip_vertices[:, 1], -offset_x) + flip_vertices = numpy.ceil(flip_vertices) shape = [int(numpy.amax(flip_vertices[:, 0])), int(numpy.amax(flip_vertices[:, 1]))] + if shape == [0, 0]: + shape = [1, 1] arr = cls.arrayFromPolygon(shape, flip_vertices) + if not numpy.any(arr): + # set at least 1 pixel + arr[0][0] = 1 return cls(arr, offset_x, offset_y) ## Instantiate an offset and hull ShapeArray from a scene node. diff --git a/tests/TestArrange.py b/tests/TestArrange.py index 737305f638..4f6bb64118 100755 --- a/tests/TestArrange.py +++ b/tests/TestArrange.py @@ -118,6 +118,13 @@ def test_arrayFromPolygon2(): assert numpy.any(array) +## Polygon -> array +def test_fromPolygon(): + vertices = numpy.array([[0, 0.5], [0, 0], [0.5, 0]]) + array = ShapeArray.fromPolygon(vertices, scale=0.5) + assert numpy.any(array.arr) + + ## Line definition -> array with true/false def test_check(): base_array = numpy.zeros([5, 5], dtype=float) From c9b8b0333c87ba5021e4d29a3cba120ea1f0ad1d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 14:56:42 +0100 Subject: [PATCH 173/551] Sending prints to a specific printer in the cluster is now possible again CL-541 --- .../ClusterUM3OutputDevice.py | 30 ++++++++++++--- plugins/UM3NetworkPrinting/PrintWindow.qml | 38 +++++++++++-------- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 51e713904b..d13706cc4c 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -62,11 +62,15 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._active_printer = None # type: Optional[PrinterOutputModel] + self._printer_selection_dialog = None + self.setPriority(3) # Make sure the output device gets selected above local file output self.setName(self._id) self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network")) + self._printer_uuid_to_unique_name_mapping = {} + self._finished_jobs = [] def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): @@ -79,11 +83,21 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # Unable to find g-code. Nothing to send return - # TODO; DEBUG - self.sendPrintJob() + if len(self._printers) > 1: + self._spawnPrinterSelectionDialog() + else: + self.sendPrintJob() + + def _spawnPrinterSelectionDialog(self): + if self._printer_selection_dialog is None: + path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "PrintWindow.qml") + self._printer_selection_dialog = Application.getInstance().createQmlComponent(path, {"OutputDevice": self}) + if self._printer_selection_dialog is not None: + self._printer_selection_dialog.show() @pyqtSlot() - def sendPrintJob(self): + @pyqtSlot(str) + def sendPrintJob(self, target_printer = ""): Logger.log("i", "Sending print job to printer.") if self._sending_gcode: self._error_message = Message( @@ -108,9 +122,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): parts = [] # If a specific printer was selected, it should be printed with that machine. - require_printer_name = "" # Todo; actually needs to be set - if require_printer_name: - parts.append(self._createFormPart("name=require_printer_name", bytes(require_printer_name, "utf-8"), "text/plain")) + if target_printer: + target_printer = self._printer_uuid_to_unique_name_mapping[target_printer] + parts.append(self._createFormPart("name=require_printer_name", bytes(target_printer, "utf-8"), "text/plain")) # Add user name to the print_job parts.append(self._createFormPart("name=owner", bytes(self._getUserName(), "utf-8"), "text/plain")) @@ -324,6 +338,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job.updateOwner(data["owner"]) def _updatePrinter(self, printer, data): + # For some unknown reason the cluster wants UUID for everything, except for sending a job directly to a printer. + # Then we suddenly need the unique name. So in order to not have to mess up all the other code, we save a mapping. + self._printer_uuid_to_unique_name_mapping[data["uuid"]] = data["unique_name"] + printer.updateName(data["friendly_name"]) printer.updateKey(data["uuid"]) printer.updateType(data["machine_variant"]) diff --git a/plugins/UM3NetworkPrinting/PrintWindow.qml b/plugins/UM3NetworkPrinting/PrintWindow.qml index 7afe174da2..13d087f930 100644 --- a/plugins/UM3NetworkPrinting/PrintWindow.qml +++ b/plugins/UM3NetworkPrinting/PrintWindow.qml @@ -20,8 +20,24 @@ UM.Dialog visible: true modality: Qt.ApplicationModal + onVisibleChanged: + { + if(visible) + { + resetPrintersModel() + } + } + title: catalog.i18nc("@title:window", "Print over network") - title: catalog.i18nc("@title:window","Print over network") + property var printersModel: ListModel{} + function resetPrintersModel() { + printersModel.append({ name: "Automatic", key: ""}) + + for (var index in OutputDevice.printers) + { + printersModel.append({name: OutputDevice.printers[index].name, key: OutputDevice.printers[index].key}) + } + } Column { @@ -31,8 +47,7 @@ UM.Dialog anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.rightMargin: UM.Theme.getSize("default_margin").width - height: 50 * screenScaleFactor - + height: 50 * screenScaleFactord Label { id: manualPrinterSelectionLabel @@ -42,7 +57,7 @@ UM.Dialog topMargin: UM.Theme.getSize("default_margin").height right: parent.right } - text: "Printer selection" + text: catalog.i18nc("@label", "Printer selection") wrapMode: Text.Wrap height: 20 * screenScaleFactor } @@ -50,18 +65,12 @@ UM.Dialog ComboBox { id: printerSelectionCombobox - model: OutputDevice.printers - textRole: "friendly_name" + model: base.printersModel + textRole: "name" width: parent.width height: 40 * screenScaleFactor Behavior on height { NumberAnimation { duration: 100 } } - - onActivated: - { - var printerData = OutputDevice.printers[index]; - OutputDevice.selectPrinter(printerData.unique_name, printerData.friendly_name); - } } SystemPalette @@ -79,8 +88,6 @@ UM.Dialog enabled: true onClicked: { base.visible = false; - // reset to defaults - OutputDevice.selectAutomaticPrinter() printerSelectionCombobox.currentIndex = 0 } } @@ -93,9 +100,8 @@ UM.Dialog enabled: true onClicked: { base.visible = false; - OutputDevice.sendPrintJob(); + OutputDevice.sendPrintJob(printerSelectionCombobox.model.get(printerSelectionCombobox.currentIndex).key) // reset to defaults - OutputDevice.selectAutomaticPrinter() printerSelectionCombobox.currentIndex = 0 } } From 5e26ecb4589aa602ec68ad2b443b0daf712ee41a Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 4 Jan 2018 14:59:40 +0100 Subject: [PATCH 174/551] CURA-4672 now unbreak arrange for large objects as well :-) --- cura/Arranging/ShapeArray.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/cura/Arranging/ShapeArray.py b/cura/Arranging/ShapeArray.py index 6ef92b1743..68be9a6478 100644 --- a/cura/Arranging/ShapeArray.py +++ b/cura/Arranging/ShapeArray.py @@ -29,12 +29,10 @@ class ShapeArray: offset_x = int(numpy.amin(flip_vertices[:, 1])) flip_vertices[:, 0] = numpy.add(flip_vertices[:, 0], -offset_y) flip_vertices[:, 1] = numpy.add(flip_vertices[:, 1], -offset_x) - flip_vertices = numpy.ceil(flip_vertices) - shape = [int(numpy.amax(flip_vertices[:, 0])), int(numpy.amax(flip_vertices[:, 1]))] - if shape == [0, 0]: - shape = [1, 1] + shape = numpy.array([int(numpy.amax(flip_vertices[:, 0])), int(numpy.amax(flip_vertices[:, 1]))]) + shape[numpy.where(shape == 0)] = 1 arr = cls.arrayFromPolygon(shape, flip_vertices) - if not numpy.any(arr): + if not numpy.ndarray.any(arr): # set at least 1 pixel arr[0][0] = 1 return cls(arr, offset_x, offset_y) From d0ec7d10ce7570b5d1fde84dc126ba8283df6e11 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 15:35:30 +0100 Subject: [PATCH 175/551] Printer discovery shows if a cluster is actually set up as a host CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 6 ++++++ plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index d13706cc4c..4283042bf2 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -73,6 +73,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._finished_jobs = [] + self._cluster_size = int(properties.get(b"cluster_size", 0)) + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): # Notify the UI that a switch to the print monitor should happen Application.getInstance().getController().setActiveStage("MonitorStage") @@ -95,6 +97,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): if self._printer_selection_dialog is not None: self._printer_selection_dialog.show() + @pyqtProperty(int, constant=True) + def clusterSize(self): + return self._cluster_size + @pyqtSlot() @pyqtSlot(str) def sendPrintJob(self, target_printer = ""): diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index be62e68f03..c639c25007 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -240,7 +240,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): # or "Legacy" UM3 device. cluster_size = int(properties.get(b"cluster_size", -1)) - if cluster_size > 0: + if cluster_size >= 0: device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties) else: device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) From 4f224a4311bd34fb4dd80f073ade1384d1d426a4 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 4 Jan 2018 16:12:39 +0100 Subject: [PATCH 176/551] CURA-4525 do not show build plate view item when disabled --- resources/qml/Menus/ViewMenu.qml | 1 + resources/qml/ObjectsList.qml | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index 72bc42bfb0..afc80dd314 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -50,6 +50,7 @@ Menu { id: buildPlateMenu; title: catalog.i18nc("@action:inmenu menubar:view","&Build plate"); + visible: UM.Preferences.getValue("cura/use_multi_build_plate") Instantiator { model: Cura.BuildPlateModel diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index 04afbe2fb0..a02ea2288d 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -231,7 +231,6 @@ Rectangle tooltip: ''; anchors { - //top: buildPlateSelection.bottom; topMargin: UM.Theme.getSize("default_margin").height; left: parent.left; leftMargin: UM.Theme.getSize("default_margin").height; From 2dad18a9ba5c1f547150d2e04b83369de13e12f5 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 4 Jan 2018 16:26:39 +0100 Subject: [PATCH 177/551] CURA-4761 allow for space for scrollbar in per object settings --- plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index ea126bfd44..5bdb6d4cb0 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -111,7 +111,7 @@ Item { ScrollView { height: parent.height - width: UM.Theme.getSize("setting").width + width: UM.Theme.getSize("setting").width + UM.Theme.getSize("default_margin").width style: UM.Theme.styles.scrollview ListView From 564a97d5a80545f5eebdc63de7c48a1a435ad2ea Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 4 Jan 2018 17:20:57 +0100 Subject: [PATCH 178/551] Account for getConvexHullTransformedVertices returning None It returns None if there are no vertices. --- cura/Scene/ConvexHullDecorator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index 3a563c2764..94045652f5 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -177,7 +177,7 @@ class ConvexHullDecorator(SceneNodeDecorator): # Do not throw away vertices: the convex hull may be too small and objects can collide. # vertex_data = vertex_data[vertex_data[:,1] >= -0.01] - if len(vertex_data) >= 4: + if vertex_data and len(vertex_data) >= 4: # Round the vertex data to 1/10th of a mm, then remove all duplicate vertices # This is done to greatly speed up further convex hull calculations as the convex hull # becomes much less complex when dealing with highly detailed models. From 2c45efb70de003b431707aadfc2a3cb37e4dc39c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 4 Jan 2018 17:23:43 +0100 Subject: [PATCH 179/551] Simplify code flow a bit Use if branches for the unhappy flow, so that it's clear that this behaves as an early-out. This also prevents the need for declaring variables out of scope, which is not an issue with Python anyway. --- cura/Scene/ConvexHullDecorator.py | 67 +++++++++++++++---------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index 94045652f5..f6b9372259 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -160,48 +160,47 @@ class ConvexHullDecorator(SceneNodeDecorator): return offset_hull else: + if not self._node.getMeshData(): #Node has no mesh data, so just return an empty Polygon. + return Polygon([]) + offset_hull = None - mesh = None - world_transform = None - if self._node.getMeshData(): - mesh = self._node.getMeshData() - world_transform = self._node.getWorldTransformation() + mesh = self._node.getMeshData() + world_transform = self._node.getWorldTransformation() - # Check the cache - if mesh is self._2d_convex_hull_mesh and world_transform == self._2d_convex_hull_mesh_world_transform: - return self._2d_convex_hull_mesh_result + # Check the cache + if mesh is self._2d_convex_hull_mesh and world_transform == self._2d_convex_hull_mesh_world_transform: + return self._2d_convex_hull_mesh_result - vertex_data = mesh.getConvexHullTransformedVertices(world_transform) - # Don't use data below 0. - # TODO; We need a better check for this as this gives poor results for meshes with long edges. - # Do not throw away vertices: the convex hull may be too small and objects can collide. - # vertex_data = vertex_data[vertex_data[:,1] >= -0.01] + vertex_data = mesh.getConvexHullTransformedVertices(world_transform) + # Don't use data below 0. + # TODO; We need a better check for this as this gives poor results for meshes with long edges. + # Do not throw away vertices: the convex hull may be too small and objects can collide. + # vertex_data = vertex_data[vertex_data[:,1] >= -0.01] - if vertex_data and len(vertex_data) >= 4: - # Round the vertex data to 1/10th of a mm, then remove all duplicate vertices - # This is done to greatly speed up further convex hull calculations as the convex hull - # becomes much less complex when dealing with highly detailed models. - vertex_data = numpy.round(vertex_data, 1) + if not vertex_data or len(vertex_data) < 4: + return Polygon([]) + # Round the vertex data to 1/10th of a mm, then remove all duplicate vertices + # This is done to greatly speed up further convex hull calculations as the convex hull + # becomes much less complex when dealing with highly detailed models. + vertex_data = numpy.round(vertex_data, 1) - vertex_data = vertex_data[:, [0, 2]] # Drop the Y components to project to 2D. + vertex_data = vertex_data[:, [0, 2]] # Drop the Y components to project to 2D. - # Grab the set of unique points. - # - # This basically finds the unique rows in the array by treating them as opaque groups of bytes - # which are as long as the 2 float64s in each row, and giving this view to numpy.unique() to munch. - # See http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array - vertex_byte_view = numpy.ascontiguousarray(vertex_data).view( - numpy.dtype((numpy.void, vertex_data.dtype.itemsize * vertex_data.shape[1]))) - _, idx = numpy.unique(vertex_byte_view, return_index=True) - vertex_data = vertex_data[idx] # Select the unique rows by index. + # Grab the set of unique points. + # + # This basically finds the unique rows in the array by treating them as opaque groups of bytes + # which are as long as the 2 float64s in each row, and giving this view to numpy.unique() to munch. + # See http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array + vertex_byte_view = numpy.ascontiguousarray(vertex_data).view( + numpy.dtype((numpy.void, vertex_data.dtype.itemsize * vertex_data.shape[1]))) + _, idx = numpy.unique(vertex_byte_view, return_index=True) + vertex_data = vertex_data[idx] # Select the unique rows by index. - hull = Polygon(vertex_data) + hull = Polygon(vertex_data) - if len(vertex_data) >= 3: - convex_hull = hull.getConvexHull() - offset_hull = self._offsetHull(convex_hull) - else: - return Polygon([]) # Node has no mesh data, so just return an empty Polygon. + if len(vertex_data) >= 3: + convex_hull = hull.getConvexHull() + offset_hull = self._offsetHull(convex_hull) # Store the result in the cache self._2d_convex_hull_mesh = mesh From 63f7902fca7b2dd90600b15aab59b6bac676964b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Jan 2018 09:16:03 +0100 Subject: [PATCH 180/551] Revert "Simplify code flow a bit" This reverts commit 2c45efb70de003b431707aadfc2a3cb37e4dc39c. --- cura/Scene/ConvexHullDecorator.py | 67 ++++++++++++++++--------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index f6b9372259..94045652f5 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -160,47 +160,48 @@ class ConvexHullDecorator(SceneNodeDecorator): return offset_hull else: - if not self._node.getMeshData(): #Node has no mesh data, so just return an empty Polygon. - return Polygon([]) - offset_hull = None - mesh = self._node.getMeshData() - world_transform = self._node.getWorldTransformation() + mesh = None + world_transform = None + if self._node.getMeshData(): + mesh = self._node.getMeshData() + world_transform = self._node.getWorldTransformation() - # Check the cache - if mesh is self._2d_convex_hull_mesh and world_transform == self._2d_convex_hull_mesh_world_transform: - return self._2d_convex_hull_mesh_result + # Check the cache + if mesh is self._2d_convex_hull_mesh and world_transform == self._2d_convex_hull_mesh_world_transform: + return self._2d_convex_hull_mesh_result - vertex_data = mesh.getConvexHullTransformedVertices(world_transform) - # Don't use data below 0. - # TODO; We need a better check for this as this gives poor results for meshes with long edges. - # Do not throw away vertices: the convex hull may be too small and objects can collide. - # vertex_data = vertex_data[vertex_data[:,1] >= -0.01] + vertex_data = mesh.getConvexHullTransformedVertices(world_transform) + # Don't use data below 0. + # TODO; We need a better check for this as this gives poor results for meshes with long edges. + # Do not throw away vertices: the convex hull may be too small and objects can collide. + # vertex_data = vertex_data[vertex_data[:,1] >= -0.01] - if not vertex_data or len(vertex_data) < 4: - return Polygon([]) - # Round the vertex data to 1/10th of a mm, then remove all duplicate vertices - # This is done to greatly speed up further convex hull calculations as the convex hull - # becomes much less complex when dealing with highly detailed models. - vertex_data = numpy.round(vertex_data, 1) + if vertex_data and len(vertex_data) >= 4: + # Round the vertex data to 1/10th of a mm, then remove all duplicate vertices + # This is done to greatly speed up further convex hull calculations as the convex hull + # becomes much less complex when dealing with highly detailed models. + vertex_data = numpy.round(vertex_data, 1) - vertex_data = vertex_data[:, [0, 2]] # Drop the Y components to project to 2D. + vertex_data = vertex_data[:, [0, 2]] # Drop the Y components to project to 2D. - # Grab the set of unique points. - # - # This basically finds the unique rows in the array by treating them as opaque groups of bytes - # which are as long as the 2 float64s in each row, and giving this view to numpy.unique() to munch. - # See http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array - vertex_byte_view = numpy.ascontiguousarray(vertex_data).view( - numpy.dtype((numpy.void, vertex_data.dtype.itemsize * vertex_data.shape[1]))) - _, idx = numpy.unique(vertex_byte_view, return_index=True) - vertex_data = vertex_data[idx] # Select the unique rows by index. + # Grab the set of unique points. + # + # This basically finds the unique rows in the array by treating them as opaque groups of bytes + # which are as long as the 2 float64s in each row, and giving this view to numpy.unique() to munch. + # See http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array + vertex_byte_view = numpy.ascontiguousarray(vertex_data).view( + numpy.dtype((numpy.void, vertex_data.dtype.itemsize * vertex_data.shape[1]))) + _, idx = numpy.unique(vertex_byte_view, return_index=True) + vertex_data = vertex_data[idx] # Select the unique rows by index. - hull = Polygon(vertex_data) + hull = Polygon(vertex_data) - if len(vertex_data) >= 3: - convex_hull = hull.getConvexHull() - offset_hull = self._offsetHull(convex_hull) + if len(vertex_data) >= 3: + convex_hull = hull.getConvexHull() + offset_hull = self._offsetHull(convex_hull) + else: + return Polygon([]) # Node has no mesh data, so just return an empty Polygon. # Store the result in the cache self._2d_convex_hull_mesh = mesh From 502332ee3e3492665a481a40745805649a532549 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Jan 2018 09:17:02 +0100 Subject: [PATCH 181/551] Revert "Account for getConvexHullTransformedVertices returning None" This reverts commit 564a97d5a80545f5eebdc63de7c48a1a435ad2ea. --- cura/Scene/ConvexHullDecorator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index 94045652f5..3a563c2764 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -177,7 +177,7 @@ class ConvexHullDecorator(SceneNodeDecorator): # Do not throw away vertices: the convex hull may be too small and objects can collide. # vertex_data = vertex_data[vertex_data[:,1] >= -0.01] - if vertex_data and len(vertex_data) >= 4: + if len(vertex_data) >= 4: # Round the vertex data to 1/10th of a mm, then remove all duplicate vertices # This is done to greatly speed up further convex hull calculations as the convex hull # becomes much less complex when dealing with highly detailed models. From 47ba8b098c8f86c8b40f5ce12a92c00d29de3ab3 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 5 Jan 2018 11:51:12 +0100 Subject: [PATCH 182/551] Apply to layers shadow shader the same changes than in the default layer shader, so that the shadow layers are correctly shown in simulation view --- plugins/SimulationView/layers3d_shadow.shader | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/plugins/SimulationView/layers3d_shadow.shader b/plugins/SimulationView/layers3d_shadow.shader index ad75fcf9d0..15136fcf3f 100644 --- a/plugins/SimulationView/layers3d_shadow.shader +++ b/plugins/SimulationView/layers3d_shadow.shader @@ -145,35 +145,42 @@ geometry41core = myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert)); + //And reverse so that the line is also visible from the back side. + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); EndPrimitive(); } else { // All normal lines are rendered as 3d tubes. - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); EndPrimitive(); // left side - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head)); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); EndPrimitive(); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); EndPrimitive(); From 65e87625466d50a8c7dd4f3234b899e8028abdde Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 5 Jan 2018 11:53:38 +0100 Subject: [PATCH 183/551] Fix layer height slider update issue CURA-4758 --- resources/qml/SidebarSimple.qml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 7aca25160a..74c2bf1ec1 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -70,6 +70,18 @@ Item onActiveVariantChanged: qualityModel.update() } + Connections { + target: base + onVisibleChanged: + { + // update needs to be called when the widgets are visible, otherwise the step width calculation + // will fail because the width of an invisible item is 0. + if (visible) { + qualityModel.update(); + } + } + } + ListModel { id: qualityModel From 223d9b6025f8d74cef42b9e0b3edbc5e20c90e43 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 5 Jan 2018 11:54:17 +0100 Subject: [PATCH 184/551] Update QtQuick import versions CURA-4758 --- resources/qml/Sidebar.qml | 2 +- resources/qml/SidebarAdvanced.qml | 5 ++--- resources/qml/SidebarSimple.qml | 8 ++++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index e6e0fee023..e1c0a07f89 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -3,7 +3,7 @@ import QtQuick 2.8 import QtQuick.Controls 2.1 -import QtQuick.Layouts 1.1 +import QtQuick.Layouts 1.3 import UM 1.2 as UM import Cura 1.0 as Cura diff --git a/resources/qml/SidebarAdvanced.qml b/resources/qml/SidebarAdvanced.qml index 95f218639b..f214e425b1 100644 --- a/resources/qml/SidebarAdvanced.qml +++ b/resources/qml/SidebarAdvanced.qml @@ -1,9 +1,8 @@ // Copyright (c) 2015 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.0 - -import QtQuick.Controls 1.2 +import QtQuick 2.8 +import QtQuick.Controls 2.1 import "Settings" diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 74c2bf1ec1..7e86b10207 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -1,10 +1,10 @@ // Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.2 -import QtQuick.Controls 1.1 -import QtQuick.Controls.Styles 1.1 -import QtQuick.Layouts 1.1 +import QtQuick 2.8 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Layouts 1.3 import UM 1.2 as UM import Cura 1.2 as Cura From 8c98ab027a7c53dd9840f17abc14316c04a16095 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 5 Jan 2018 11:54:46 +0100 Subject: [PATCH 185/551] Fix code style CURA-4758 --- resources/qml/SidebarSimple.qml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 7e86b10207..ac124c8911 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -11,7 +11,7 @@ import Cura 1.2 as Cura Item { - id: base; + id: base signal showTooltip(Item item, point location, string text); signal hideTooltip(); @@ -115,7 +115,7 @@ Item if (Cura.SimpleModeSettingsManager.isProfileUserCreated) { qualityModel.qualitySliderActiveIndex = -1 } else { - qualityModel.qualitySliderActiveIndex = i + qualityModel.qualitySliderActiveIndex = i } qualityModel.existingQualityProfile = 1 @@ -195,11 +195,10 @@ Item text: { var result = "" - if(Cura.MachineManager.activeMachine != null){ + if (Cura.MachineManager.activeMachine != null) { + result = Cura.ProfilesModel.getItem(index).layer_height_without_unit - var result = Cura.ProfilesModel.getItem(index).layer_height_without_unit - - if(result == undefined) + if (result == undefined) result = "" } return result From b20c6c6ac7a123c7da0b1c486e3af87a27f6391f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Jan 2018 13:02:00 +0100 Subject: [PATCH 186/551] Use isinstance instead of type checking for SceneNode isinstance also checks for subclasses. In our case, SceneNode was just extended to CuraSceneNode so this test was failing. Contributes to issue CURA-4766. --- 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 32e3867300..351843ae14 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -270,7 +270,7 @@ class ExtruderManager(QObject): return [] # Get the extruders of all printable meshes in the scene - meshes = [node for node in DepthFirstIterator(scene_root) if type(node) is SceneNode and node.isSelectable()] + meshes = [node for node in DepthFirstIterator(scene_root) if isinstance(node, SceneNode) and node.isSelectable()] for mesh in meshes: extruder_stack_id = mesh.callDecoration("getActiveExtruder") if not extruder_stack_id: From fefb20deb786d94ca807e6011ea9ca21d62bca46 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Jan 2018 13:33:40 +0100 Subject: [PATCH 187/551] Don't start slicing again if you can't slice Contributes to issue CURA-4766. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 74dd515951..ff6c196c2d 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -204,7 +204,6 @@ class CuraEngineBackend(QObject, Backend): if self._process_layers_job: Logger.log("d", " ## Process layers job still busy, trying later") - self._invokeSlice() return # see if we really have to slice @@ -214,7 +213,6 @@ class CuraEngineBackend(QObject, Backend): num_objects = self._numObjects() if build_plate_to_be_sliced not in num_objects or num_objects[build_plate_to_be_sliced] == 0: Logger.log("d", "Build plate %s has 0 objects to be sliced, skipping", build_plate_to_be_sliced) - self._invokeSlice() return self._stored_layer_data = [] From a8ad956c927df2eaa4140ee88eacb69851bd07f8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Jan 2018 13:34:39 +0100 Subject: [PATCH 188/551] Erase gcode of build plates that are determined to be empty You don't want to start a new slice, but you should still erase the g-code there. Contributes to issue CURA-4525. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index ff6c196c2d..4491008997 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -206,12 +206,16 @@ class CuraEngineBackend(QObject, Backend): Logger.log("d", " ## Process layers job still busy, trying later") return + if not hasattr(self._scene, "gcode_list"): + self._scene.gcode_list = {} + # see if we really have to slice active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate build_plate_to_be_sliced = self._build_plates_to_be_sliced.pop(0) Logger.log("d", "Going to slice build plate [%s]!" % build_plate_to_be_sliced) num_objects = self._numObjects() if build_plate_to_be_sliced not in num_objects or num_objects[build_plate_to_be_sliced] == 0: + self._scene.gcode_list[build_plate_to_be_sliced] = [] Logger.log("d", "Build plate %s has 0 objects to be sliced, skipping", build_plate_to_be_sliced) return @@ -229,8 +233,6 @@ class CuraEngineBackend(QObject, Backend): self.processingProgress.emit(0.0) self.backendStateChange.emit(BackendState.NotStarted) - if not hasattr(self._scene, "gcode_list"): - self._scene.gcode_list = {} self._scene.gcode_list[build_plate_to_be_sliced] = [] #[] indexed by build plate number self._slicing = True self.slicingStarted.emit() From a717960695bb35789e166ab1d6281d317bef50ff Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Jan 2018 13:46:05 +0100 Subject: [PATCH 189/551] Disallow negative branch angles The engine can't really handle that any more. Contributes to issue CURA-4523. --- resources/definitions/fdmprinter.def.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index e3a1c0892a..6eef6b1e9b 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3854,12 +3854,11 @@ "support_tree_branch_diameter_angle": { "label": "Tree Support Branch Diameter Angle", - "description": "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A negative angle makes them thinner towards the bottom, so be careful as they might disappear. A small positive angle can increase stability of the tree support.", + "description": "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support.", "unit": "°", "type": "float", - "minimum_value": "-89.9999", + "minimum_value": "0", "maximum_value": "89.9999", - "minimum_value_warning": "0", "maximum_value_warning": "15", "default_value": 5, "limit_to_extruder": "support_infill_extruder_nr", From 5dad6cab2c546d0d04ea92f5b909be912f4282d6 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 5 Jan 2018 14:00:23 +0100 Subject: [PATCH 190/551] If the model is:some per mesh settings or outside of the buildplate show message, CURA-4525 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 4491008997..44c39db69f 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -357,6 +357,18 @@ class CuraEngineBackend(QObject, Backend): else: self.backendStateChange.emit(BackendState.NotStarted) + if job.getResult() == StartSliceJob.StartJobResult.NothingToSlice: + if Application.getInstance().platformActivity: + self._error_message = Message(catalog.i18nc("@info:status", "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit."), + title = catalog.i18nc("@info:title", "Unable to slice")) + self._error_message.show() + self.backendStateChange.emit(BackendState.Error) + else: + self.backendStateChange.emit(BackendState.NotStarted) + pass + self._invokeSlice() + return + # Preparation completed, send it to the backend. self._socket.sendMessage(job.getSliceMessage()) From 39921795cee3e79d74267cd2092ecea4c0fee97a Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 5 Jan 2018 14:46:16 +0100 Subject: [PATCH 191/551] Properly align printer not connected label from top --- resources/qml/PrinterOutput/OutputDeviceHeader.qml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/resources/qml/PrinterOutput/OutputDeviceHeader.qml b/resources/qml/PrinterOutput/OutputDeviceHeader.qml index d6ac863b87..bc9a44e245 100644 --- a/resources/qml/PrinterOutput/OutputDeviceHeader.qml +++ b/resources/qml/PrinterOutput/OutputDeviceHeader.qml @@ -19,6 +19,7 @@ Item anchors.fill: parent color: UM.Theme.getColor("setting_category") property var activePrinter: outputDevice != null ? outputDevice.activePrinter : null + Label { id: outputDeviceNameLabel @@ -29,6 +30,7 @@ Item anchors.margins: UM.Theme.getSize("default_margin").width text: outputDevice != null ? activePrinter.name : "" } + Label { id: outputDeviceAddressLabel @@ -39,6 +41,7 @@ Item anchors.right: parent.right anchors.margins: UM.Theme.getSize("default_margin").width } + Label { text: outputDevice != null ? outputDevice.connectionText : catalog.i18nc("@info:status", "The printer is not connected.") @@ -49,6 +52,8 @@ Item anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.top: parent.top + anchors.topMargin: UM.Theme.getSize("default_margin").height } } } \ No newline at end of file From 784a17149f48da575a7b8f5a2e1be4e78a9d1a69 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 5 Jan 2018 15:20:42 +0100 Subject: [PATCH 192/551] Don't show save to file if not possible to slice CURA-4525 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 44c39db69f..0ca500ecec 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -198,7 +198,6 @@ class CuraEngineBackend(QObject, Backend): self._slice_start_time = time() if not self._build_plates_to_be_sliced: self.processingProgress.emit(1.0) - self.backendStateChange.emit(BackendState.Done) Logger.log("w", "Slice unnecessary, nothing has changed that needs reslicing.") return From 1a520a041b0719c86db91d12e3e3fb8df9bef18c Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 5 Jan 2018 16:27:57 +0100 Subject: [PATCH 193/551] CURA-4768 Allow groups of models to be included in the select all and arrange tools. --- cura/CuraApplication.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 476b5d3708..8aeeb9c1e8 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1020,7 +1020,7 @@ class CuraApplication(QtApplication): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) if not node.isSelectable(): continue # i.e. node with layer data - if not node.callDecoration("isSliceable"): + if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"): continue # i.e. node with layer data Selection.add(node) @@ -1092,7 +1092,7 @@ class CuraApplication(QtApplication): continue # Node that doesnt have a mesh and is not a group. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) - if not node.callDecoration("isSliceable"): + if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"): continue # i.e. node with layer data nodes.append(node) @@ -1119,7 +1119,7 @@ class CuraApplication(QtApplication): continue # Node that doesnt have a mesh and is not a group. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) - if not node.callDecoration("isSliceable"): + if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"): continue # i.e. node with layer data # Skip nodes that are too big if node.getBoundingBox().width < self._volume.getBoundingBox().width or node.getBoundingBox().depth < self._volume.getBoundingBox().depth: @@ -1142,7 +1142,7 @@ class CuraApplication(QtApplication): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) if not node.isSelectable(): continue # i.e. node with layer data - if not node.callDecoration("isSliceable"): + if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"): continue # i.e. node with layer data if node.callDecoration("getBuildPlateNumber") == active_build_plate: # Skip nodes that are too big @@ -1166,7 +1166,7 @@ class CuraApplication(QtApplication): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) if not node.isSelectable(): continue # i.e. node with layer data - if not node.callDecoration("isSliceable"): + if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"): continue # i.e. node with layer data if node in nodes: # exclude selected node from fixed_nodes continue From c839bc175998707ec1ddddb4464298ff2884d812 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 5 Jan 2018 16:53:18 +0100 Subject: [PATCH 194/551] Groups of objects are taken into account and are shown in the object list instead of each model separatelly. Contributes to CURA-4525 --- cura/ObjectsModel.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/cura/ObjectsModel.py b/cura/ObjectsModel.py index 2e83ee9033..7efbb8e5b9 100644 --- a/cura/ObjectsModel.py +++ b/cura/ObjectsModel.py @@ -24,16 +24,28 @@ class ObjectsModel(ListModel): nodes = [] filter_current_build_plate = Preferences.getInstance().getValue("view/filter_current_build_plate") active_build_plate_number = self._build_plate_number + group_nr = 1 for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): + if not issubclass(type(node), SceneNode): continue - if not node.callDecoration("isSliceable"): + if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): + continue + if node.getParent() and node.getParent().callDecoration("isGroup"): + continue # Grouped nodes don't need resetting as their parent (the group) is resetted) + if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"): continue node_build_plate_number = node.callDecoration("getBuildPlateNumber") if filter_current_build_plate and node_build_plate_number != active_build_plate_number: continue + + if not node.callDecoration("isGroup"): + name = node.getName() + else: + name = "Group #" + str(group_nr) + group_nr += 1 + nodes.append({ - "name": node.getName(), + "name": name, "isSelected": Selection.isSelected(node), "isOutsideBuildArea": node.isOutsideBuildArea(), "buildPlateNumber": node_build_plate_number, From ab2450630701714f85d522214260e3574bc06931 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 5 Jan 2018 17:05:11 +0100 Subject: [PATCH 195/551] Add string to cura I18N catalog. Contributes to CURA-4525 --- cura/ObjectsModel.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/ObjectsModel.py b/cura/ObjectsModel.py index 7efbb8e5b9..5218127fc5 100644 --- a/cura/ObjectsModel.py +++ b/cura/ObjectsModel.py @@ -4,7 +4,9 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection from UM.Preferences import Preferences +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") ## Keep track of all objects in the project class ObjectsModel(ListModel): @@ -41,7 +43,7 @@ class ObjectsModel(ListModel): if not node.callDecoration("isGroup"): name = node.getName() else: - name = "Group #" + str(group_nr) + name = catalog.i18nc("@label", "Group #{group_nr}").format(group_nr = str(group_nr)) group_nr += 1 nodes.append({ From 7ad15c7dd2771bdf1815ec78126b58ae4071348d Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 5 Jan 2018 17:25:04 +0100 Subject: [PATCH 196/551] Allow adding support-specific settings for support meshes in Per Model Settings --- .../PerObjectSettingsPanel.qml | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 5bdb6d4cb0..b4e7a46e00 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -18,6 +18,9 @@ Item { width: childrenRect.width; height: childrenRect.height; + property var all_categories_except_support: [ "machine_settings", "resolution", "shell", "infill", "material", "speed", + "travel", "cooling", "platform_adhesion", "dual", "meshfix", "blackmagic", "experimental"] + Column { id: items @@ -106,7 +109,7 @@ Item { id: currentSettings property int maximumHeight: 200 * screenScaleFactor height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight) - visible: ["support_mesh", "anti_overhang_mesh"].indexOf(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type) == -1 + visible: meshTypeSelection.model.get(meshTypeSelection.currentIndex).type != "anti_overhang_mesh" ScrollView { @@ -124,7 +127,15 @@ Item { id: addedSettingsModel; containerId: Cura.MachineManager.activeDefinitionId expanded: [ "*" ] - exclude: [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ] + exclude: { + var excluded_settings = [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]; + + if(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh") + { + excluded_settings = excluded_settings.concat(base.all_categories_except_support); + } + return excluded_settings; + } visibilityHandler: Cura.PerObjectSettingVisibilityHandler { @@ -306,7 +317,18 @@ Item { } } - onClicked: settingPickDialog.visible = true; + onClicked: + { + settingPickDialog.visible = true; + if (meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh") + { + settingPickDialog.additional_excluded_settings = base.all_categories_except_support; + } + else + { + settingPickDialog.additional_excluded_settings = [] + } + } } } @@ -315,9 +337,10 @@ Item { id: settingPickDialog title: catalog.i18nc("@title:window", "Select Settings to Customize for this model") - width: screenScaleFactor * 360; + width: screenScaleFactor * 360 property string labelFilter: "" + property var additional_excluded_settings onVisibilityChanged: { @@ -394,7 +417,12 @@ Item { } visibilityHandler: UM.SettingPreferenceVisibilityHandler {} expanded: [ "*" ] - exclude: [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ] + exclude: + { + var excluded_settings = [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]; + excluded_settings = excluded_settings.concat(settingPickDialog.additional_excluded_settings); + return excluded_settings; + } } delegate:Loader { From 8bd6afad1fe5a5dc0a1de8b2ee5bbcc4deb4d158 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 5 Jan 2018 18:33:05 +0100 Subject: [PATCH 197/551] Render support meshes with a vertical stripe... ...so they are easier to tell apart from normal meshes, especially for single extrusion printers --- plugins/SolidView/SolidView.py | 16 ++++++++++++++++ resources/shaders/striped.shader | 14 +++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index e156e655ce..50ff2864b7 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -28,6 +28,7 @@ class SolidView(View): self._enabled_shader = None self._disabled_shader = None self._non_printing_shader = None + self._support_mesh_shader = None self._extruders_model = ExtrudersModel() self._theme = None @@ -54,6 +55,11 @@ class SolidView(View): self._non_printing_shader.setUniformValue("u_diffuseColor", Color(*self._theme.getColor("model_non_printing").getRgb())) self._non_printing_shader.setUniformValue("u_opacity", 0.6) + if not self._support_mesh_shader: + self._support_mesh_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "striped.shader")) + self._support_mesh_shader.setUniformValue("u_vertical_stripes", True) + self._support_mesh_shader.setUniformValue("u_width", 5.0) + global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: support_extruder_nr = global_container_stack.getProperty("support_extruder_nr", "value") @@ -117,6 +123,16 @@ class SolidView(View): renderer.queueNode(node, shader = self._non_printing_shader, transparent = True) elif getattr(node, "_outside_buildarea", False): renderer.queueNode(node, shader = self._disabled_shader) + elif per_mesh_stack and per_mesh_stack.getProperty("support_mesh", "value"): + # Render support meshes with a vertical stripe that is darker + shade_factor = 0.6 + uniforms["diffuse_color_2"] = [ + uniforms["diffuse_color"][0] * shade_factor, + uniforms["diffuse_color"][1] * shade_factor, + uniforms["diffuse_color"][2] * shade_factor, + 1.0 + ] + renderer.queueNode(node, shader = self._support_mesh_shader, uniforms = uniforms) else: renderer.queueNode(node, shader = self._enabled_shader, uniforms = uniforms) if node.callDecoration("isGroup") and Selection.isSelected(node): diff --git a/resources/shaders/striped.shader b/resources/shaders/striped.shader index ce7d14e39e..7cf5a62c3f 100644 --- a/resources/shaders/striped.shader +++ b/resources/shaders/striped.shader @@ -32,6 +32,7 @@ fragment = uniform highp vec3 u_viewPosition; uniform mediump float u_width; + uniform mediump bool u_vertical_stripes; varying highp vec3 v_position; varying highp vec3 v_vertex; @@ -40,7 +41,9 @@ fragment = void main() { mediump vec4 finalColor = vec4(0.0); - mediump vec4 diffuseColor = (mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2; + mediump vec4 diffuseColor = u_vertical_stripes ? + (((mod(v_vertex.x, u_width) < (u_width / 2.)) ^^ (mod(v_vertex.z, u_width) < (u_width / 2.))) ? u_diffuseColor1 : u_diffuseColor2) : + ((mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2); /* Ambient Component */ finalColor += u_ambientColor; @@ -98,6 +101,7 @@ fragment41core = uniform highp vec3 u_viewPosition; uniform mediump float u_width; + uniform mediump bool u_vertical_stripes; in highp vec3 v_position; in highp vec3 v_vertex; @@ -108,7 +112,9 @@ fragment41core = void main() { mediump vec4 finalColor = vec4(0.0); - mediump vec4 diffuseColor = (mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2; + mediump vec4 diffuseColor = u_vertical_stripes ? + (((mod(v_vertex.x, u_width) < (u_width / 2.)) ^^ (mod(v_vertex.z, u_width) < (u_width / 2.))) ? u_diffuseColor1 : u_diffuseColor2) : + ((mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2); /* Ambient Component */ finalColor += u_ambientColor; @@ -138,6 +144,7 @@ u_diffuseColor2 = [0.5, 0.5, 0.5, 1.0] u_specularColor = [0.4, 0.4, 0.4, 1.0] u_shininess = 20.0 u_width = 5.0 +u_vertical_stripes = 0 [bindings] u_modelMatrix = model_matrix @@ -145,7 +152,8 @@ u_viewProjectionMatrix = view_projection_matrix u_normalMatrix = normal_matrix u_viewPosition = view_position u_lightPosition = light_0_position -u_diffuseColor = diffuse_color +u_diffuseColor1 = diffuse_color +u_diffuseColor2 = diffuse_color_2 [attributes] a_vertex = vertex From fbe128bbb75bb52f4fe9a2234c22de57687b7512 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 5 Jan 2018 21:38:54 +0100 Subject: [PATCH 198/551] Hide options for Support, Anti overhang, etc Mesh if their settings are disabled --- .../PerObjectSettingsPanel.qml | 50 ++++++++++++++++--- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index b4e7a46e00..a38112724e 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -42,6 +42,13 @@ Item { verticalAlignment: Text.AlignVCenter } + UM.SettingPropertyProvider + { + id: meshTypePropertyProvider + containerStackId: Cura.MachineManager.activeMachineId + watchedProperties: [ "enabled" ] + } + ComboBox { id: meshTypeSelection @@ -52,36 +59,55 @@ Item { model: ListModel { id: meshTypeModel - Component.onCompleted: + Component.onCompleted: meshTypeSelection.populateModel() + } + + function populateModel() + { + meshTypeModel.append({ + type: "", + text: catalog.i18nc("@label", "Normal model") + }); + meshTypePropertyProvider.key = "support_mesh"; + if(meshTypePropertyProvider.properties.enabled == "True") { - meshTypeModel.append({ - type: "", - text: catalog.i18nc("@label", "Normal model") - }); meshTypeModel.append({ type: "support_mesh", text: catalog.i18nc("@label", "Print as support") }); + } + meshTypePropertyProvider.key = "anti_overhang_mesh"; + if(meshTypePropertyProvider.properties.enabled == "True") + { meshTypeModel.append({ type: "anti_overhang_mesh", text: catalog.i18nc("@label", "Don't support overlap with other models") }); + } + meshTypePropertyProvider.key = "cutting_mesh"; + if(meshTypePropertyProvider.properties.enabled == "True") + { meshTypeModel.append({ type: "cutting_mesh", text: catalog.i18nc("@label", "Modify settings for overlap with other models") }); + } + meshTypePropertyProvider.key = "infill_mesh"; + if(meshTypePropertyProvider.properties.enabled == "True") + { meshTypeModel.append({ type: "infill_mesh", text: catalog.i18nc("@label", "Modify settings for infill of other models") }); - - meshTypeSelection.updateCurrentIndex(); } + + meshTypeSelection.updateCurrentIndex(); } function updateCurrentIndex() { var mesh_type = UM.ActiveTool.properties.getValue("MeshType"); + meshTypeSelection.currentIndex = -1; for(var index=0; index < meshTypeSelection.model.count; index++) { if(meshTypeSelection.model.get(index).type == mesh_type) @@ -94,6 +120,16 @@ Item { } } + Connections + { + target: Cura.MachineManager + onGlobalContainerChanged: + { + meshTypeSelection.model.clear(); + meshTypeSelection.populateModel(); + } + } + Connections { target: UM.Selection From 8dd5b166f439b5d0f2d5282baea468134343f576 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sat, 6 Jan 2018 22:46:59 +0100 Subject: [PATCH 199/551] Move 'Drop Down Support Mesh" to "Support" section... ... so it can be added as a per model setting for Support Meshes --- 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 6eef6b1e9b..08c8b75869 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4233,6 +4233,18 @@ "limit_to_extruder": "support_infill_extruder_nr", "enabled": "support_enable and support_use_towers", "settable_per_mesh": true + }, + "support_mesh_drop_down": + { + "label": "Drop Down Support Mesh", + "description": "Make support everywhere below the support mesh, so that there's no overhang in the support mesh.", + "type": "bool", + "default_value": true, + "enabled": "support_mesh", + "settable_per_mesh": true, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": false } } }, @@ -5261,18 +5273,6 @@ "settable_per_meshgroup": false, "settable_globally": false }, - "support_mesh_drop_down": - { - "label": "Drop Down Support Mesh", - "description": "Make support everywhere below the support mesh, so that there's no overhang in the support mesh.", - "type": "bool", - "default_value": true, - "enabled": "support_mesh", - "settable_per_mesh": true, - "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": false - }, "anti_overhang_mesh": { "label": "Anti Overhang Mesh", From 3708c37b6022af916bd1ac60868d144eb0abf284 Mon Sep 17 00:00:00 2001 From: Anton Midyukov Date: Sun, 7 Jan 2018 17:17:32 +0700 Subject: [PATCH 200/551] Activation workaround Linux+NVidia proprietary drivers for all distributions --- cura_app.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura_app.py b/cura_app.py index b5844055ab..6d1ff6ab6b 100755 --- a/cura_app.py +++ b/cura_app.py @@ -40,11 +40,11 @@ import faulthandler if Platform.isLinux(): # Needed for platform.linux_distribution, which is not available on Windows and OSX # For Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826 linux_distro_name = platform.linux_distribution()[0].lower() - if linux_distro_name in ("debian", "ubuntu", "linuxmint", "fedora"): # TODO: Needs a "if X11_GFX == 'nvidia'" here. The workaround is only needed on Ubuntu+NVidia drivers. Other drivers are not affected, but fine with this fix. - import ctypes - from ctypes.util import find_library - libGL = find_library("GL") - ctypes.CDLL(libGL, ctypes.RTLD_GLOBAL) + # TODO: Needs a "if X11_GFX == 'nvidia'" here. The workaround is only needed on Ubuntu+NVidia drivers. Other drivers are not affected, but fine with this fix. + import ctypes + from ctypes.util import find_library + libGL = find_library("GL") + ctypes.CDLL(libGL, ctypes.RTLD_GLOBAL) # When frozen, i.e. installer version, don't let PYTHONPATH mess up the search path for DLLs. if Platform.isWindows() and hasattr(sys, "frozen"): From c885341e5a3b88e865db8d8de86fc7f3097622f3 Mon Sep 17 00:00:00 2001 From: Tyler Gibson Date: Sun, 7 Jan 2018 22:39:54 -0800 Subject: [PATCH 201/551] Removing nozzle variants, adding material definitions --- resources/definitions/malyan_m200.def.json | 17 +++++--------- .../monoprice_select_mini_v1.def.json | 2 +- .../monoprice_select_mini_v2.def.json | 9 +++++--- .../abs/malyan_m200_abs_draft.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_fast.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_high.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_normal.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_superdraft.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_thickerdraft.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_ultra.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_verydraft.inst.cfg | 15 ++++++++++++ .../malyan_m200_global_Draft_Quality.inst.cfg | 23 +++++++++++++++++++ .../malyan_m200_global_Fast_Quality.inst.cfg | 23 +++++++++++++++++++ .../malyan_m200_global_High_Quality.inst.cfg | 23 +++++++++++++++++++ ...malyan_m200_global_Normal_Quality.inst.cfg | 23 +++++++++++++++++++ ...an_m200_global_SuperDraft_Quality.inst.cfg | 23 +++++++++++++++++++ ..._m200_global_ThickerDraft_Quality.inst.cfg | 23 +++++++++++++++++++ .../malyan_m200_global_Ultra_Quality.inst.cfg | 23 +++++++++++++++++++ ...yan_m200_global_VeryDraft_Quality.inst.cfg | 23 +++++++++++++++++++ .../petg/malyan_m200_petg_draft.inst.cfg | 11 +++++++++ .../petg/malyan_m200_petg_fast.inst.cfg | 11 +++++++++ .../petg/malyan_m200_petg_high.inst.cfg | 11 +++++++++ .../petg/malyan_m200_petg_normal.inst.cfg | 11 +++++++++ .../petg/malyan_m200_petg_superdraft.inst.cfg | 11 +++++++++ .../malyan_m200_petg_thickerdraft.inst.cfg | 11 +++++++++ .../petg/malyan_m200_petg_ultra.inst.cfg | 11 +++++++++ .../petg/malyan_m200_petg_verydraft.inst.cfg | 11 +++++++++ .../pla/malyan_m200_pla_draft.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_fast.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_high.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_normal.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_superdraft.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_thickerdraft.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_ultra.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_verydraft.inst.cfg | 15 ++++++++++++ ...onoprice_select_mini_v2_abs_draft.inst.cfg | 15 ++++++++++++ ...monoprice_select_mini_v2_abs_fast.inst.cfg | 15 ++++++++++++ ...monoprice_select_mini_v2_abs_high.inst.cfg | 15 ++++++++++++ ...noprice_select_mini_v2_abs_normal.inst.cfg | 15 ++++++++++++ ...ice_select_mini_v2_abs_superdraft.inst.cfg | 15 ++++++++++++ ...e_select_mini_v2_abs_thickerdraft.inst.cfg | 15 ++++++++++++ ...onoprice_select_mini_v2_abs_ultra.inst.cfg | 15 ++++++++++++ ...rice_select_mini_v2_abs_verydraft.inst.cfg | 15 ++++++++++++ ...lect_mini_v2_global_Draft_Quality.inst.cfg | 23 +++++++++++++++++++ ...elect_mini_v2_global_Fast_Quality.inst.cfg | 23 +++++++++++++++++++ ...elect_mini_v2_global_High_Quality.inst.cfg | 23 +++++++++++++++++++ ...ect_mini_v2_global_Normal_Quality.inst.cfg | 23 +++++++++++++++++++ ...mini_v2_global_SuperDraft_Quality.inst.cfg | 23 +++++++++++++++++++ ...ni_v2_global_ThickerDraft_Quality.inst.cfg | 23 +++++++++++++++++++ ...lect_mini_v2_global_Ultra_Quality.inst.cfg | 23 +++++++++++++++++++ ..._mini_v2_global_VeryDraft_Quality.inst.cfg | 23 +++++++++++++++++++ ...oprice_select_mini_v2_nylon_draft.inst.cfg | 11 +++++++++ ...noprice_select_mini_v2_nylon_fast.inst.cfg | 11 +++++++++ ...noprice_select_mini_v2_nylon_high.inst.cfg | 11 +++++++++ ...price_select_mini_v2_nylon_normal.inst.cfg | 11 +++++++++ ...e_select_mini_v2_nylon_superdraft.inst.cfg | 11 +++++++++ ...select_mini_v2_nylon_thickerdraft.inst.cfg | 11 +++++++++ ...oprice_select_mini_v2_nylon_ultra.inst.cfg | 11 +++++++++ ...ce_select_mini_v2_nylon_verydraft.inst.cfg | 11 +++++++++ ...monoprice_select_mini_v2_pc_draft.inst.cfg | 15 ++++++++++++ .../monoprice_select_mini_v2_pc_fast.inst.cfg | 15 ++++++++++++ .../monoprice_select_mini_v2_pc_high.inst.cfg | 15 ++++++++++++ ...onoprice_select_mini_v2_pc_normal.inst.cfg | 15 ++++++++++++ ...rice_select_mini_v2_pc_superdraft.inst.cfg | 15 ++++++++++++ ...ce_select_mini_v2_pc_thickerdraft.inst.cfg | 15 ++++++++++++ ...monoprice_select_mini_v2_pc_ultra.inst.cfg | 15 ++++++++++++ ...price_select_mini_v2_pc_verydraft.inst.cfg | 15 ++++++++++++ ...noprice_select_mini_v2_petg_draft.inst.cfg | 11 +++++++++ ...onoprice_select_mini_v2_petg_fast.inst.cfg | 11 +++++++++ ...onoprice_select_mini_v2_petg_high.inst.cfg | 11 +++++++++ ...oprice_select_mini_v2_petg_normal.inst.cfg | 11 +++++++++ ...ce_select_mini_v2_petg_superdraft.inst.cfg | 11 +++++++++ ..._select_mini_v2_petg_thickerdraft.inst.cfg | 11 +++++++++ ...noprice_select_mini_v2_petg_ultra.inst.cfg | 11 +++++++++ ...ice_select_mini_v2_petg_verydraft.inst.cfg | 11 +++++++++ ...onoprice_select_mini_v2_pla_draft.inst.cfg | 11 +++++++++ ...monoprice_select_mini_v2_pla_fast.inst.cfg | 11 +++++++++ ...monoprice_select_mini_v2_pla_high.inst.cfg | 11 +++++++++ ...noprice_select_mini_v2_pla_normal.inst.cfg | 11 +++++++++ ...ice_select_mini_v2_pla_superdraft.inst.cfg | 11 +++++++++ ...e_select_mini_v2_pla_thickerdraft.inst.cfg | 11 +++++++++ ...onoprice_select_mini_v2_pla_ultra.inst.cfg | 11 +++++++++ ...rice_select_mini_v2_pla_verydraft.inst.cfg | 11 +++++++++ .../variants/malyan_m200_0.15mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.25mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.30mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.35mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.40mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.50mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.60mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.80mm.inst.cfg | 18 --------------- .../variants/malyan_m200_1.00mm.inst.cfg | 18 --------------- 92 files changed, 1213 insertions(+), 177 deletions(-) create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_draft.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_fast.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_high.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_normal.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_superdraft.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_thickerdraft.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_ultra.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_verydraft.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_Draft_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_Fast_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_High_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_Normal_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_SuperDraft_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_ThickerDraft_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_Ultra_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_VeryDraft_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_draft.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_fast.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_high.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_normal.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_superdraft.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_thickerdraft.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_ultra.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_verydraft.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_draft.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_fast.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_high.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_normal.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_superdraft.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_thickerdraft.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_ultra.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_verydraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_draft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_fast.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_high.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_normal.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_superdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_thickerdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_ultra.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_verydraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Draft_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Fast_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_High_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Normal_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_SuperDraft_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_ThickerDraft_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Ultra_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_VeryDraft_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_draft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_fast.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_high.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_normal.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_superdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_thickerdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_ultra.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_verydraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_draft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_fast.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_high.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_normal.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_superdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_thickerdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_ultra.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_verydraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_draft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_fast.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_high.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_normal.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_superdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_thickerdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_ultra.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_verydraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_draft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_fast.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_high.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_normal.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_superdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_thickerdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_ultra.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_verydraft.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.15mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.25mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.30mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.35mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.40mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.50mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.60mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.80mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_1.00mm.inst.cfg diff --git a/resources/definitions/malyan_m200.def.json b/resources/definitions/malyan_m200.def.json index f19980a3b7..9aae3a5244 100644 --- a/resources/definitions/malyan_m200.def.json +++ b/resources/definitions/malyan_m200.def.json @@ -4,19 +4,14 @@ "name": "Malyan M200", "inherits": "fdmprinter", "metadata": { - "author": "Brian Corbino", + "author": "Brian Corbino, Tyler Gibson", "manufacturer": "Malyan", "category": "Other", "file_formats": "text/x-gcode", "platform": "malyan_m200_platform.stl", - "has_variants": true, - "has_variant_materials": false, - "has_materials": true, - "has_machine_materials": false, "has_machine_quality": true, - "preferred_variant": "*0.4*", - "preferred_quality": "*0.175*", - "variants_name": "Nozzle size", + "has_materials": true, + "preferred_quality": "*normal*", "supports_usb_connection": true, "visible": true, "first_start_actions": ["MachineSettingsAction"], @@ -39,9 +34,9 @@ "line_width": { "value": "round(machine_nozzle_size * 0.875, 2)" }, "material_print_temperature": { "minimum_value": "0" }, - "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "material_print_temperature_layer_0": { "value": "min(material_print_temperature + 5, 245)" }, "material_bed_temperature": { "minimum_value": "0" }, - "material_bed_temperature_layer_0": { "value": "material_bed_temperature + 5" }, + "material_bed_temperature_layer_0": { "value": "min(material_bed_temperature + 5, 70)" }, "material_standby_temperature": { "minimum_value": "0" }, "machine_show_variants": { "default_value": true }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, @@ -59,7 +54,7 @@ "material_diameter": { "value": 1.75 }, "machine_nozzle_size": { "default_value": 0.4, - "minimum_value": "0.15" + "minimum_value": 0.15 }, "machine_max_feedrate_x": { "default_value": 150 }, "machine_max_feedrate_y": { "default_value": 150 }, diff --git a/resources/definitions/monoprice_select_mini_v1.def.json b/resources/definitions/monoprice_select_mini_v1.def.json index 0b76a26c1c..7264f0a6fc 100644 --- a/resources/definitions/monoprice_select_mini_v1.def.json +++ b/resources/definitions/monoprice_select_mini_v1.def.json @@ -4,7 +4,7 @@ "name": "Monoprice Select Mini V1", "inherits": "malyan_m200", "metadata": { - "author": "Brian Corbino", + "author": "Brian Corbino, Tyler Gibson", "manufacturer": "Monoprice", "category": "Other", "file_formats": "text/x-gcode", diff --git a/resources/definitions/monoprice_select_mini_v2.def.json b/resources/definitions/monoprice_select_mini_v2.def.json index 33367aad88..a935cb5a73 100644 --- a/resources/definitions/monoprice_select_mini_v2.def.json +++ b/resources/definitions/monoprice_select_mini_v2.def.json @@ -4,11 +4,13 @@ "name": "Monoprice Select Mini V2 (E3D)", "inherits": "malyan_m200", "metadata": { - "author": "Brian Corbino", + "author": "Tyler Gibson", "manufacturer": "Monoprice", "category": "Other", "file_formats": "text/x-gcode", - "quality_definition": "malyan_m200", + "has_machine_quality": true, + "has_materials": true, + "preferred_quality": "*normal*", "visible": true }, @@ -17,6 +19,7 @@ "adhesion_type": { "default_value": "brim" }, "retraction_combing": { "default_value": "noskin" }, "retraction_amount" : { "default_value": 2.5}, - "retraction_speed" : { "default_value": 40} + "retraction_speed" : { "default_value": 40}, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, } } diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_draft.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_draft.inst.cfg new file mode 100644 index 0000000000..19cc9fd00d --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_draft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fast +definition = malyan_m200 + +[metadata] +type = quality +quality_type = draft +material = generic_abs_175 +weight = -2 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_fast.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_fast.inst.cfg new file mode 100644 index 0000000000..5677a0d58d --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_fast.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Normal +definition = malyan_m200 + +[metadata] +type = quality +quality_type = fast +material = generic_abs_175 +weight = -1 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_high.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_high.inst.cfg new file mode 100644 index 0000000000..7798b3f545 --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_high.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Finer +definition = malyan_m200 + +[metadata] +type = quality +quality_type = high +material = generic_abs_175 +weight = 1 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_normal.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_normal.inst.cfg new file mode 100644 index 0000000000..c87c66c813 --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_normal.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fine +definition = malyan_m200 + +[metadata] +type = quality +quality_type = normal +material = generic_abs_175 +weight = 0 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_superdraft.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_superdraft.inst.cfg new file mode 100644 index 0000000000..e6e3cfcd6c --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_superdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = superdraft +material = generic_abs_175 +weight = -5 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_thickerdraft.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_thickerdraft.inst.cfg new file mode 100644 index 0000000000..fb08013809 --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_thickerdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_abs_175 +weight = -3 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_ultra.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_ultra.inst.cfg new file mode 100644 index 0000000000..385d852688 --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_ultra.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Ultra Fine +definition = malyan_m200 + +[metadata] +type = quality +quality_type = ultra +material = generic_abs_175 +weight = 2 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_verydraft.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_verydraft.inst.cfg new file mode 100644 index 0000000000..7026391fb6 --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_verydraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Low Detail Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = verydraft +material = generic_abs_175 +weight = -4 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/malyan_m200_global_Draft_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_Draft_Quality.inst.cfg new file mode 100644 index 0000000000..d3104caa87 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_Draft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Fast +definition = malyan_m200 + +[metadata] +type = quality +weight = -2 +quality_type = draft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.21875 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_Fast_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_Fast_Quality.inst.cfg new file mode 100644 index 0000000000..aec535bd71 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_Fast_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal +definition = malyan_m200 + +[metadata] +type = quality +weight = -1 +quality_type = fast +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.175 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_High_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_High_Quality.inst.cfg new file mode 100644 index 0000000000..ca202862a2 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_High_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Finer +definition = malyan_m200 + +[metadata] +type = quality +weight = 1 +quality_type = high +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.0875 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_Normal_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..7076718903 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_Normal_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Fine +definition = malyan_m200 + +[metadata] +type = quality +weight = 0 +quality_type = normal +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.13125 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_SuperDraft_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_SuperDraft_Quality.inst.cfg new file mode 100644 index 0000000000..7dfbdb5886 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_SuperDraft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = malyan_m200 + +[metadata] +type = quality +weight = -5 +quality_type = superdraft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.35 +layer_height_0 = 0.35 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_ThickerDraft_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_ThickerDraft_Quality.inst.cfg new file mode 100644 index 0000000000..2fbf82b128 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_ThickerDraft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Draft +definition = malyan_m200 + +[metadata] +type = quality +weight = -3 +quality_type = thickerdraft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.2625 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_Ultra_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_Ultra_Quality.inst.cfg new file mode 100644 index 0000000000..90e589cca5 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_Ultra_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Ultra Fine +definition = malyan_m200 + +[metadata] +type = quality +weight = 2 +quality_type = ultra +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.04375 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_VeryDraft_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_VeryDraft_Quality.inst.cfg new file mode 100644 index 0000000000..1210ee214b --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_VeryDraft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Low Detail Draft +definition = malyan_m200 + +[metadata] +type = quality +weight = -4 +quality_type = verydraft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.30625 +layer_height_0 = 0.30625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_draft.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_draft.inst.cfg new file mode 100644 index 0000000000..aef83471ba --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_draft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fast +definition = malyan_m200 + +[metadata] +type = quality +quality_type = draft +material = generic_petg_175 +weight = -2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_fast.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_fast.inst.cfg new file mode 100644 index 0000000000..3c7fc2c239 --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_fast.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Normal +definition = malyan_m200 + +[metadata] +type = quality +quality_type = fast +material = generic_petg_175 +weight = -1 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_high.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_high.inst.cfg new file mode 100644 index 0000000000..eb1654eae3 --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_high.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Finer +definition = malyan_m200 + +[metadata] +type = quality +quality_type = high +material = generic_petg_175 +weight = 1 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_normal.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_normal.inst.cfg new file mode 100644 index 0000000000..53e60d2d62 --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_normal.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fine +definition = malyan_m200 + +[metadata] +type = quality +quality_type = normal +material = generic_petg_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_superdraft.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_superdraft.inst.cfg new file mode 100644 index 0000000000..d2a96386ae --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_superdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = superdraft +material = generic_petg_175 +weight = -5 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_thickerdraft.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_thickerdraft.inst.cfg new file mode 100644 index 0000000000..e2f37ae43b --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_thickerdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_petg_175 +weight = -3 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_ultra.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_ultra.inst.cfg new file mode 100644 index 0000000000..0fa89f2569 --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_ultra.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Ultra Fine +definition = malyan_m200 + +[metadata] +type = quality +quality_type = ultra +material = generic_petg_175 +weight = 2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_verydraft.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_verydraft.inst.cfg new file mode 100644 index 0000000000..84bedf5c14 --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_verydraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Low Detail Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = verydraft +material = generic_petg_175 +weight = -4 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_draft.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_draft.inst.cfg new file mode 100644 index 0000000000..4f221eceb7 --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_draft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fast +definition = malyan_m200 + +[metadata] +type = quality +quality_type = draft +material = generic_pla_175 +weight = -2 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_fast.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_fast.inst.cfg new file mode 100644 index 0000000000..3097fe055a --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_fast.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Normal +definition = malyan_m200 + +[metadata] +type = quality +quality_type = fast +material = generic_pla_175 +weight = -1 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_high.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_high.inst.cfg new file mode 100644 index 0000000000..062c120ad0 --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_high.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Finer +definition = malyan_m200 + +[metadata] +type = quality +quality_type = high +material = generic_pla_175 +weight = 1 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_normal.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_normal.inst.cfg new file mode 100644 index 0000000000..e01141ed9e --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_normal.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fine +definition = malyan_m200 + +[metadata] +type = quality +quality_type = normal +material = generic_pla_175 +weight = 0 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_superdraft.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_superdraft.inst.cfg new file mode 100644 index 0000000000..53eb4380eb --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_superdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = superdraft +material = generic_pla_175 +weight = -5 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_thickerdraft.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_thickerdraft.inst.cfg new file mode 100644 index 0000000000..32d2b419bc --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_thickerdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_pla_175 +weight = -3 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_ultra.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_ultra.inst.cfg new file mode 100644 index 0000000000..3865059254 --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_ultra.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Ultra Fine +definition = malyan_m200 + +[metadata] +type = quality +quality_type = ultra +material = generic_pla_175 +weight = 2 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_verydraft.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_verydraft.inst.cfg new file mode 100644 index 0000000000..a624c056be --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_verydraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Low Detail Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = verydraft +material = generic_pla_175 +weight = -4 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_draft.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_draft.inst.cfg new file mode 100644 index 0000000000..a63256573a --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_draft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fast +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = draft +material = generic_abs_175 +weight = -2 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_fast.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_fast.inst.cfg new file mode 100644 index 0000000000..49f4486596 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_fast.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Normal +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = fast +material = generic_abs_175 +weight = -1 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_high.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_high.inst.cfg new file mode 100644 index 0000000000..eab16a8e2b --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_high.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Finer +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = high +material = generic_abs_175 +weight = 1 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_normal.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_normal.inst.cfg new file mode 100644 index 0000000000..03aeb4067b --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_normal.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = normal +material = generic_abs_175 +weight = 0 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_superdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_superdraft.inst.cfg new file mode 100644 index 0000000000..148f53ba73 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_superdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = superdraft +material = generic_abs_175 +weight = -5 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_thickerdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_thickerdraft.inst.cfg new file mode 100644 index 0000000000..e2ad71a360 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_thickerdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_abs_175 +weight = -3 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_ultra.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_ultra.inst.cfg new file mode 100644 index 0000000000..7ebdf80baf --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_ultra.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Ultra Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_abs_175 +weight = 2 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_verydraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_verydraft.inst.cfg new file mode 100644 index 0000000000..9965ae8bcf --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_verydraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Low Detail Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = verydraft +material = generic_abs_175 +weight = -4 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Draft_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Draft_Quality.inst.cfg new file mode 100644 index 0000000000..b7d0faa2c7 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Draft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Fast +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = -2 +quality_type = draft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.21875 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Fast_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Fast_Quality.inst.cfg new file mode 100644 index 0000000000..f7f338e4c9 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Fast_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = -1 +quality_type = fast +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.175 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_High_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_High_Quality.inst.cfg new file mode 100644 index 0000000000..4a37a1afd8 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_High_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Finer +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = 1 +quality_type = high +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.0875 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Normal_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..b8e545adcf --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Normal_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = 0 +quality_type = normal +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.13125 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_SuperDraft_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_SuperDraft_Quality.inst.cfg new file mode 100644 index 0000000000..0ef9db5875 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_SuperDraft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = -5 +quality_type = superdraft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.35 +layer_height_0 = 0.35 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_ThickerDraft_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_ThickerDraft_Quality.inst.cfg new file mode 100644 index 0000000000..4dd3a7aafe --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_ThickerDraft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = -3 +quality_type = thickerdraft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.2625 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Ultra_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Ultra_Quality.inst.cfg new file mode 100644 index 0000000000..337f0d06bc --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Ultra_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Ultra Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = 2 +quality_type = ultra +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.04375 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_VeryDraft_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_VeryDraft_Quality.inst.cfg new file mode 100644 index 0000000000..e884077069 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_VeryDraft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Low Detail Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = -4 +quality_type = verydraft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.30625 +layer_height_0 = 0.30625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_draft.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_draft.inst.cfg new file mode 100644 index 0000000000..4a03c17a63 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_draft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fast +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = draft +material = generic_nylon_175 +weight = -2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_fast.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_fast.inst.cfg new file mode 100644 index 0000000000..1c04f77b8b --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_fast.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Normal +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = fast +material = generic_nylon_175 +weight = -1 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_high.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_high.inst.cfg new file mode 100644 index 0000000000..d57516598a --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_high.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Finer +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = high +material = generic_nylon_175 +weight = 1 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_normal.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_normal.inst.cfg new file mode 100644 index 0000000000..308ea86311 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_normal.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = normal +material = generic_nylon_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_superdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_superdraft.inst.cfg new file mode 100644 index 0000000000..db4f3ca907 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_superdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = superdraft +material = generic_nylon_175 +weight = -5 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_thickerdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_thickerdraft.inst.cfg new file mode 100644 index 0000000000..9a1afc0e48 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_thickerdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_nylon_175 +weight = -3 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_ultra.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_ultra.inst.cfg new file mode 100644 index 0000000000..3453671a72 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_ultra.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Ultra Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = ultra +material = generic_nylon_175 +weight = 2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_verydraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_verydraft.inst.cfg new file mode 100644 index 0000000000..ee2531fc4e --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_verydraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Low Detail Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = verydraft +material = generic_nylon_175 +weight = -4 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_draft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_draft.inst.cfg new file mode 100644 index 0000000000..aa5fc7844d --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_draft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fast +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = draft +material = generic_pc_175 +weight = -2 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_fast.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_fast.inst.cfg new file mode 100644 index 0000000000..232c4ab6f3 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_fast.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Normal +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = fast +material = generic_pc_175 +weight = -1 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_high.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_high.inst.cfg new file mode 100644 index 0000000000..aa9da322fb --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_high.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Finer +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = high +material = generic_pc_175 +weight = 1 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_normal.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_normal.inst.cfg new file mode 100644 index 0000000000..145b21221b --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_normal.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = normal +material = generic_pc_175 +weight = 0 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_superdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_superdraft.inst.cfg new file mode 100644 index 0000000000..b6e53bda62 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_superdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = superdraft +material = generic_pc_175 +weight = -5 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_thickerdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_thickerdraft.inst.cfg new file mode 100644 index 0000000000..055228ab13 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_thickerdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_pc_175 +weight = -3 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_ultra.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_ultra.inst.cfg new file mode 100644 index 0000000000..a3e99b998e --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_ultra.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Ultra Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = ultra +material = generic_pc_175 +weight = 2 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_verydraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_verydraft.inst.cfg new file mode 100644 index 0000000000..73f5a2f2c9 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_verydraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Low Detail Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = verydraft +material = generic_pc_175 +weight = -4 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_draft.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_draft.inst.cfg new file mode 100644 index 0000000000..8a33e03310 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_draft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fast +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = draft +material = generic_petg_175 +weight = -2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_fast.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_fast.inst.cfg new file mode 100644 index 0000000000..fb084fa08e --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_fast.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Normal +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = fast +material = generic_petg_175 +weight = -1 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_high.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_high.inst.cfg new file mode 100644 index 0000000000..16891f6f43 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_high.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Finer +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = high +material = generic_petg_175 +weight = 1 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_normal.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_normal.inst.cfg new file mode 100644 index 0000000000..bb2f0b47a8 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_normal.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = normal +material = generic_petg_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_superdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_superdraft.inst.cfg new file mode 100644 index 0000000000..78ca1b6b7a --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_superdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = superdraft +material = generic_petg_175 +weight = -5 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_thickerdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_thickerdraft.inst.cfg new file mode 100644 index 0000000000..69606ff913 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_thickerdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_petg_175 +weight = -3 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_ultra.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_ultra.inst.cfg new file mode 100644 index 0000000000..7c5ac599c8 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_ultra.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Ultra Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = ultra +material = generic_petg_175 +weight = 2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_verydraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_verydraft.inst.cfg new file mode 100644 index 0000000000..ed0c2510f5 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_verydraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Low Detail Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = verydraft +material = generic_petg_175 +weight = -4 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_draft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_draft.inst.cfg new file mode 100644 index 0000000000..04a955cf6c --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_draft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fast +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = draft +material = generic_pla_175 +weight = -2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_fast.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_fast.inst.cfg new file mode 100644 index 0000000000..6efc0935e2 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_fast.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Normal +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = fast +material = generic_pla_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_high.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_high.inst.cfg new file mode 100644 index 0000000000..8fe2371e5d --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_high.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Finer +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = high +material = generic_pla_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_normal.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_normal.inst.cfg new file mode 100644 index 0000000000..01351154c4 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_normal.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = normal +material = generic_pla_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_superdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_superdraft.inst.cfg new file mode 100644 index 0000000000..adfced9787 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_superdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = superdraft +material = generic_pla_175 +weight = -5 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_thickerdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_thickerdraft.inst.cfg new file mode 100644 index 0000000000..f4522c9778 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_thickerdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_pla_175 +weight = -3 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_ultra.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_ultra.inst.cfg new file mode 100644 index 0000000000..2fa8eb7f81 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_ultra.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Ultra Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = ultra +material = generic_pla_175 +weight = 2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_verydraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_verydraft.inst.cfg new file mode 100644 index 0000000000..e59cf4a490 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_verydraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Low Detail Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = verydraft +material = generic_pla_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/variants/malyan_m200_0.15mm.inst.cfg b/resources/variants/malyan_m200_0.15mm.inst.cfg deleted file mode 100644 index 808b8755ea..0000000000 --- a/resources/variants/malyan_m200_0.15mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.15 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.15 -machine_nozzle_tip_outer_diameter = 0.8 -coasting_volume = 0.05 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.2, 1) -speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.25mm.inst.cfg b/resources/variants/malyan_m200_0.25mm.inst.cfg deleted file mode 100644 index 3847f5c617..0000000000 --- a/resources/variants/malyan_m200_0.25mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.25 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.25 -machine_nozzle_tip_outer_diameter = 0.8 -coasting_volume = 0.1 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.2, 1) -speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.30mm.inst.cfg b/resources/variants/malyan_m200_0.30mm.inst.cfg deleted file mode 100644 index fee8aae40f..0000000000 --- a/resources/variants/malyan_m200_0.30mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.30 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.30 -machine_nozzle_tip_outer_diameter = 0.8 -coasting_volume = 0.11 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.2, 1) -speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.35mm.inst.cfg b/resources/variants/malyan_m200_0.35mm.inst.cfg deleted file mode 100644 index dcbb3ed4c0..0000000000 --- a/resources/variants/malyan_m200_0.35mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.35 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.35 -machine_nozzle_tip_outer_diameter = 0.8 -coasting_volume = 0.13 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.2, 1) -speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.40mm.inst.cfg b/resources/variants/malyan_m200_0.40mm.inst.cfg deleted file mode 100644 index 6e17dd13a6..0000000000 --- a/resources/variants/malyan_m200_0.40mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.40 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.40 -machine_nozzle_tip_outer_diameter = 1.05 -coasting_volume = 0.15 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.25, 1) -speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) -speed_topbottom = =round(speed_print / 2.25, 1) diff --git a/resources/variants/malyan_m200_0.50mm.inst.cfg b/resources/variants/malyan_m200_0.50mm.inst.cfg deleted file mode 100644 index ce87def1e6..0000000000 --- a/resources/variants/malyan_m200_0.50mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.50 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.50 -machine_nozzle_tip_outer_diameter = 0.8 -coasting_volume = 0.2 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.2, 1) -speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.60mm.inst.cfg b/resources/variants/malyan_m200_0.60mm.inst.cfg deleted file mode 100644 index 0ee7c786e8..0000000000 --- a/resources/variants/malyan_m200_0.60mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.60 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.60 -machine_nozzle_tip_outer_diameter = 1.25 -coasting_volume = 0.28 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print * 4 / 3, 1) -speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) -speed_topbottom = =round(speed_print / 2, 1) diff --git a/resources/variants/malyan_m200_0.80mm.inst.cfg b/resources/variants/malyan_m200_0.80mm.inst.cfg deleted file mode 100644 index 54f48afdb4..0000000000 --- a/resources/variants/malyan_m200_0.80mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.80 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.80 -machine_nozzle_tip_outer_diameter = 1.35 -coasting_volume = 0.45 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print * 4 / 3, 1) -speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) -speed_topbottom = =round(speed_print / 2, 1) diff --git a/resources/variants/malyan_m200_1.00mm.inst.cfg b/resources/variants/malyan_m200_1.00mm.inst.cfg deleted file mode 100644 index ce0a2d0dfb..0000000000 --- a/resources/variants/malyan_m200_1.00mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 1.00 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 1.00 -machine_nozzle_tip_outer_diameter = 0.8 -coasting_volume = 0.63 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.2, 1) -speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = =round(speed_print / 1.5, 1) From 2ca06f383e9d65a2b396f395427756ecbf8fafef Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 8 Jan 2018 09:41:18 +0100 Subject: [PATCH 202/551] USB printers also get their name set CL-541 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 1e28e252d1..100438e948 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -232,6 +232,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): num_extruders = container_stack.getProperty("machine_extruder_count", "value") # Ensure that a printer is created. self._printers = [PrinterOutputModel(output_controller=USBPrinterOuptutController(self), number_of_extruders=num_extruders)] + self._printers[0].updateName(container_stack.getName()) self.setConnectionState(ConnectionState.connected) self._update_thread.start() From 733d6234e6d821ca552c70106c47d027db4ed6ec Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 8 Jan 2018 11:13:16 +0100 Subject: [PATCH 203/551] CURA-4525 moved experimental preferences to bottom with its own label; all settings are by default off --- cura/CuraApplication.py | 4 +- resources/qml/Preferences/GeneralPage.qml | 71 ++++++++++++++--------- 2 files changed, 45 insertions(+), 30 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 8aeeb9c1e8..3013f6e116 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -319,7 +319,7 @@ class CuraApplication(QtApplication): 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.addPreference("cura/arrange_objects_on_load", True) + preferences.addPreference("cura/not_arrange_objects_on_load", False) preferences.addPreference("cura/use_multi_build_plate", False) preferences.addPreference("cura/currency", "€") @@ -1428,7 +1428,7 @@ class CuraApplication(QtApplication): self.fileLoaded.emit(filename) arrange_objects_on_load = ( not Preferences.getInstance().getValue("cura/use_multi_build_plate") or - Preferences.getInstance().getValue("cura/arrange_objects_on_load")) + not Preferences.getInstance().getValue("cura/not_arrange_objects_on_load")) target_build_plate = self.getBuildPlateModel().activeBuildPlate if arrange_objects_on_load else -1 for original_node in nodes: diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index e5ed9e46c5..ac5cacdbf6 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -453,34 +453,6 @@ UM.PreferencesPage text: catalog.i18nc("@label","Opening and saving files") } - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip","Use multi build plate functionality (EXPERIMENTAL)") - - CheckBox - { - id: useMultiBuildPlateCheckbox - text: catalog.i18nc("@option:check","Use multi build plate functionality (EXPERIMENTAL, restart)") - checked: boolCheck(UM.Preferences.getValue("cura/use_multi_build_plate")) - onCheckedChanged: UM.Preferences.setValue("cura/use_multi_build_plate", checked) - } - } - - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip","Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)") - - CheckBox - { - id: arrangeOnLoadCheckbox - text: catalog.i18nc("@option:check","Arrange objects on load (EXPERIMENTAL)") - checked: boolCheck(UM.Preferences.getValue("cura/arrange_objects_on_load")) - onCheckedChanged: UM.Preferences.setValue("cura/arrange_objects_on_load", checked) - } - } - UM.TooltipArea { width: childrenRect.width height: childrenRect.height @@ -688,6 +660,49 @@ UM.PreferencesPage onCheckedChanged: UM.Preferences.setValue("info/send_slice_info", checked) } } + + Item + { + //: Spacer + height: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("default_margin").height + } + + Label + { + font.bold: true + text: catalog.i18nc("@label","Experimental") + } + + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip","Use multi build plate functionality") + + CheckBox + { + id: useMultiBuildPlateCheckbox + text: catalog.i18nc("@option:check","Use multi build plate functionality (restart required)") + checked: boolCheck(UM.Preferences.getValue("cura/use_multi_build_plate")) + onCheckedChanged: UM.Preferences.setValue("cura/use_multi_build_plate", checked) + } + } + + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip","Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)") + + CheckBox + { + id: arrangeOnLoadCheckbox + text: catalog.i18nc("@option:check","Do not arrange objects on load") + checked: boolCheck(UM.Preferences.getValue("cura/not_arrange_objects_on_load")) + onCheckedChanged: UM.Preferences.setValue("cura/not_arrange_objects_on_load", checked) + } + } + + } } } From e638c21acbaf53a79aaf742ede3a6feacfd9c059 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 8 Jan 2018 11:30:57 +0100 Subject: [PATCH 204/551] CURA-4525 fix selected object will select correct build plate (not only visualization) --- cura/Scene/CuraSceneController.py | 6 +++--- resources/qml/ObjectsList.qml | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index 65723db52c..7931e13659 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -75,11 +75,11 @@ class CuraSceneController(QObject): # Single select item = self._objects_model.getItem(index) node = item["node"] - Selection.clear() - Selection.add(node) build_plate_number = node.callDecoration("getBuildPlateNumber") if build_plate_number is not None and build_plate_number != -1: - self._build_plate_model.setActiveBuildPlate(build_plate_number) + self.setActiveBuildPlate(build_plate_number) + Selection.clear() + Selection.add(node) self._last_selected_index = index diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index a02ea2288d..87f76774da 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -105,7 +105,6 @@ Rectangle topMargin: UM.Theme.getSize("default_margin").height; left: parent.left; leftMargin: UM.Theme.getSize("default_margin").height; - //bottom: objectsList.top; bottomMargin: UM.Theme.getSize("default_margin").height; } From df1bf419d93a909fcceeb052ed2daaf668b3d728 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 8 Jan 2018 11:44:30 +0100 Subject: [PATCH 205/551] Don't show "active print" header if no printer is connected CL-541 --- resources/qml/PrintMonitor.qml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 6fc4d8847d..471729192e 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -106,6 +106,7 @@ Column { label: catalog.i18nc("@label", "Active print") width: base.width + visible: activePrinter != null } @@ -114,6 +115,7 @@ Column label: catalog.i18nc("@label", "Job Name") value: activePrintJob != null ? activePrintJob.name : "" width: base.width + visible: activePrinter != null } MonitorItem @@ -121,6 +123,7 @@ Column label: catalog.i18nc("@label", "Printing Time") value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal) : "" width:base.width + visible: activePrinter != null } MonitorItem From 52b75b58e791ea5cdc5ff019daffd09fdc126ce5 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 8 Jan 2018 13:25:39 +0100 Subject: [PATCH 206/551] CURA-4525 allow for empty build plates between filled build plates --- 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 0ca500ecec..28ca793855 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -215,8 +215,9 @@ class CuraEngineBackend(QObject, Backend): num_objects = self._numObjects() if build_plate_to_be_sliced not in num_objects or num_objects[build_plate_to_be_sliced] == 0: self._scene.gcode_list[build_plate_to_be_sliced] = [] - Logger.log("d", "Build plate %s has 0 objects to be sliced, skipping", build_plate_to_be_sliced) - return + Logger.log("d", "Build plate %s has no objects to be sliced, skipping", build_plate_to_be_sliced) + if self._build_plates_to_be_sliced: + self._invokeSlice() self._stored_layer_data = [] self._stored_optimized_layer_data[build_plate_to_be_sliced] = [] From 86eb9c73bad0d20b1e04ba984fa25dde21ad7a6e Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 8 Jan 2018 13:40:46 +0100 Subject: [PATCH 207/551] CURA-4525 do not send empty build plates gcode; direct calling slice when skipping empty build plate --- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- .../UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 28ca793855..249b2f6cbb 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -217,7 +217,7 @@ class CuraEngineBackend(QObject, Backend): self._scene.gcode_list[build_plate_to_be_sliced] = [] Logger.log("d", "Build plate %s has no objects to be sliced, skipping", build_plate_to_be_sliced) if self._build_plates_to_be_sliced: - self._invokeSlice() + return self.slice() self._stored_layer_data = [] self._stored_optimized_layer_data[build_plate_to_be_sliced] = [] diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index 05069d1c0d..6eb89d69a4 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -282,6 +282,9 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte nodes, file_name, filter_by_machine, file_handler, kwargs = self._request_job output_build_plate_number = self._job_list.pop(0) gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list")[output_build_plate_number] + if not gcode: # Empty build plate + Logger.log("d", "Skipping empty job (build plate number %d).", output_build_plate_number) + return self.sendPrintJob() self._send_gcode_start = time.time() Logger.log("d", "Sending print job [%s] to host, build plate [%s]..." % (file_name, output_build_plate_number)) From 99de75a3fdafd5b1d653b638364dba2d61041712 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 8 Jan 2018 13:44:20 +0100 Subject: [PATCH 208/551] Fixed connection label state CL-541 --- cura/PrinterOutputDevice.py | 6 ++++++ plugins/USBPrinting/USBPrinterOutputDevice.py | 1 + resources/qml/PrinterOutput/OutputDeviceHeader.qml | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index b4e67f6297..2aa6fb382e 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -64,6 +64,12 @@ class PrinterOutputDevice(QObject, OutputDevice): self._connection_state = ConnectionState.closed + self._address = "" + + @pyqtProperty(str, constant = True) + def address(self): + return self._address + def materialHotendChangedMessage(self, callback): Logger.log("w", "materialHotendChangedMessage needs to be implemented, returning 'Yes'") callback(QMessageBox.Yes) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 100438e948..c43d9a826b 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -44,6 +44,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._serial = None # type: Optional[Serial] self._serial_port = serial_port + self._address = serial_port self._timeout = 3 diff --git a/resources/qml/PrinterOutput/OutputDeviceHeader.qml b/resources/qml/PrinterOutput/OutputDeviceHeader.qml index bc9a44e245..d5ce32786c 100644 --- a/resources/qml/PrinterOutput/OutputDeviceHeader.qml +++ b/resources/qml/PrinterOutput/OutputDeviceHeader.qml @@ -44,7 +44,7 @@ Item Label { - text: outputDevice != null ? outputDevice.connectionText : catalog.i18nc("@info:status", "The printer is not connected.") + text: outputDevice != null ? "" : catalog.i18nc("@info:status", "The printer is not connected.") color: outputDevice != null && outputDevice.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") font: UM.Theme.getFont("very_small") wrapMode: Text.WordWrap From 164e5fdc8e4afe102fd8c41a82e858d9fd9323e1 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 8 Jan 2018 13:55:42 +0100 Subject: [PATCH 209/551] CURA-4525 change active build plate if that build plate does not exist anymore; disable context menu items for build plates when no selection --- cura/Scene/CuraSceneController.py | 7 +++++++ resources/qml/Menus/ContextMenu.qml | 2 ++ 2 files changed, 9 insertions(+) diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index 7931e13659..e594752f1e 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -41,6 +41,13 @@ class CuraSceneController(QObject): self._build_plate_model.setMaxBuildPlate(self._max_build_plate) build_plates = [{"name": "Build Plate %d" % (i + 1), "buildPlateNumber": i} for i in range(self._max_build_plate + 1)] self._build_plate_model.setItems(build_plates) + if self._active_build_plate > self._max_build_plate: + build_plate_number = 0 + if self._last_selected_index >= 0: # go to the buildplate of the item you last selected + item = self._objects_model.getItem(self._last_selected_index) + node = item["node"] + build_plate_number = node.callDecoration("getBuildPlateNumber") + self.setActiveBuildPlate(build_plate_number) # self.buildPlateItemsChanged.emit() # TODO: necessary after setItems? def _calcMaxBuildPlate(self): diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 1a4b421572..b5f51f4d63 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -47,6 +47,7 @@ Menu { model: Cura.BuildPlateModel MenuItem { + enabled: UM.Selection.hasSelection text: Cura.BuildPlateModel.getItem(index).name; onTriggered: CuraActions.setBuildPlateForSelection(Cura.BuildPlateModel.getItem(index).buildPlateNumber); checkable: true @@ -58,6 +59,7 @@ Menu } MenuItem { + enabled: UM.Selection.hasSelection text: "New build plate"; onTriggered: { CuraActions.setBuildPlateForSelection(Cura.BuildPlateModel.maxBuildPlate + 1); From c1cb86a334b1c6a7d70fa033664073fead69152d Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 8 Jan 2018 14:00:06 +0100 Subject: [PATCH 210/551] CURA-4525 remove initial 'Unable to slice' --- plugins/CuraEngineBackend/CuraEngineBackend.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 249b2f6cbb..ba68687c1e 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -217,7 +217,8 @@ class CuraEngineBackend(QObject, Backend): self._scene.gcode_list[build_plate_to_be_sliced] = [] Logger.log("d", "Build plate %s has no objects to be sliced, skipping", build_plate_to_be_sliced) if self._build_plates_to_be_sliced: - return self.slice() + self.slice() + return self._stored_layer_data = [] self._stored_optimized_layer_data[build_plate_to_be_sliced] = [] From 584f477b54d08df58d0a8f40ea619d3d4f886e11 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 8 Jan 2018 14:28:09 +0100 Subject: [PATCH 211/551] CURA-4525 fix deleting last item --- cura/Scene/CuraSceneController.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index e594752f1e..c3e27ca3dd 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -45,8 +45,9 @@ class CuraSceneController(QObject): build_plate_number = 0 if self._last_selected_index >= 0: # go to the buildplate of the item you last selected item = self._objects_model.getItem(self._last_selected_index) - node = item["node"] - build_plate_number = node.callDecoration("getBuildPlateNumber") + if "node" in item: + node = item["node"] + build_plate_number = node.callDecoration("getBuildPlateNumber") self.setActiveBuildPlate(build_plate_number) # self.buildPlateItemsChanged.emit() # TODO: necessary after setItems? From d05f4a493b57042b5a9dd08c11a768994b364d92 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 8 Jan 2018 14:41:39 +0100 Subject: [PATCH 212/551] CURA-4525 fix qml undefined QString --- resources/qml/ObjectsList.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index 87f76774da..489e38e8d7 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -138,7 +138,7 @@ Rectangle anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width width: parent.width - 2 * UM.Theme.getSize("default_margin").width - 30 - text: Cura.ObjectsModel.getItem(index) ? Cura.ObjectsModel.getItem(index).name : ""; + text: (index >= 0) && Cura.ObjectsModel.getItem(index) ? Cura.ObjectsModel.getItem(index).name : ""; color: Cura.ObjectsModel.getItem(index).isSelected ? palette.highlightedText : (Cura.ObjectsModel.getItem(index).isOutsideBuildArea ? palette.mid : palette.text) elide: Text.ElideRight } From c8cef9583e9801b1a4a60c2095654f80df9a0b47 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 8 Jan 2018 16:18:41 +0100 Subject: [PATCH 213/551] rename scene.gcode_list to gcode_dict CURA-4741 With the multi build plate feature, scene.gcode_list is now a dict which stores a list of gcode for a build plate, so it makes more sense to have it renamed to "gcode_dict" because it's not a list. --- .../CuraEngineBackend/CuraEngineBackend.py | 16 ++++++------- plugins/CuraEngineBackend/ProcessGCodeJob.py | 4 +++- plugins/GCodeReader/FlavorParser.py | 5 +++- plugins/GCodeWriter/GCodeWriter.py | 5 +++- .../NetworkClusterPrinterOutputDevice.py | 23 +++++++++++-------- .../NetworkPrinterOutputDevice.py | 2 +- plugins/USBPrinting/USBPrinterOutputDevice.py | 5 +++- 7 files changed, 37 insertions(+), 23 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index ba68687c1e..c612e889a4 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -205,8 +205,8 @@ class CuraEngineBackend(QObject, Backend): Logger.log("d", " ## Process layers job still busy, trying later") return - if not hasattr(self._scene, "gcode_list"): - self._scene.gcode_list = {} + if not hasattr(self._scene, "gcode_dict"): + self._scene.gcode_dict = {} # see if we really have to slice active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate @@ -214,7 +214,7 @@ class CuraEngineBackend(QObject, Backend): Logger.log("d", "Going to slice build plate [%s]!" % build_plate_to_be_sliced) num_objects = self._numObjects() if build_plate_to_be_sliced not in num_objects or num_objects[build_plate_to_be_sliced] == 0: - self._scene.gcode_list[build_plate_to_be_sliced] = [] + self._scene.gcode_dict[build_plate_to_be_sliced] = [] Logger.log("d", "Build plate %s has no objects to be sliced, skipping", build_plate_to_be_sliced) if self._build_plates_to_be_sliced: self.slice() @@ -234,7 +234,7 @@ class CuraEngineBackend(QObject, Backend): self.processingProgress.emit(0.0) self.backendStateChange.emit(BackendState.NotStarted) - self._scene.gcode_list[build_plate_to_be_sliced] = [] #[] indexed by build plate number + self._scene.gcode_dict[build_plate_to_be_sliced] = [] #[] indexed by build plate number self._slicing = True self.slicingStarted.emit() @@ -393,7 +393,7 @@ class CuraEngineBackend(QObject, Backend): self.backendStateChange.emit(BackendState.Disabled) gcode_list = node.callDecoration("getGCodeList") if gcode_list is not None: - self._scene.gcode_list[node.callDecoration("getBuildPlateNumber")] = gcode_list + self._scene.gcode_dict[node.callDecoration("getBuildPlateNumber")] = gcode_list if self._use_timer == enable_timer: return self._use_timer @@ -560,7 +560,7 @@ class CuraEngineBackend(QObject, Backend): self.backendStateChange.emit(BackendState.Done) self.processingProgress.emit(1.0) - gcode_list = self._scene.gcode_list[self._start_slice_job_build_plate] + gcode_list = self._scene.gcode_dict[self._start_slice_job_build_plate] for index, line in enumerate(gcode_list): replaced = line.replace("{print_time}", str(Application.getInstance().getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.ISO8601))) replaced = replaced.replace("{filament_amount}", str(Application.getInstance().getPrintInformation().materialLengths)) @@ -590,14 +590,14 @@ class CuraEngineBackend(QObject, Backend): # # \param message The protobuf message containing g-code, encoded as UTF-8. def _onGCodeLayerMessage(self, message): - self._scene.gcode_list[self._start_slice_job_build_plate].append(message.data.decode("utf-8", "replace")) + self._scene.gcode_dict[self._start_slice_job_build_plate].append(message.data.decode("utf-8", "replace")) ## Called when a g-code prefix message is received from the engine. # # \param message The protobuf message containing the g-code prefix, # encoded as UTF-8. def _onGCodePrefixMessage(self, message): - self._scene.gcode_list[self._start_slice_job_build_plate].insert(0, message.data.decode("utf-8", "replace")) + self._scene.gcode_dict[self._start_slice_job_build_plate].insert(0, message.data.decode("utf-8", "replace")) ## Creates a new socket connection. def _createSocket(self): diff --git a/plugins/CuraEngineBackend/ProcessGCodeJob.py b/plugins/CuraEngineBackend/ProcessGCodeJob.py index 4974907c30..ed430f8fa9 100644 --- a/plugins/CuraEngineBackend/ProcessGCodeJob.py +++ b/plugins/CuraEngineBackend/ProcessGCodeJob.py @@ -12,4 +12,6 @@ class ProcessGCodeLayerJob(Job): self._message = message def run(self): - self._scene.gcode_list.append(self._message.data.decode("utf-8", "replace")) + active_build_plate_id = Application.getInstance().getBuildPlateModel().activeBuildPlate + gcode_list = self._scene.gcode_dict[active_build_plate_id] + gcode_list.append(self._message.data.decode("utf-8", "replace")) diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index fa5d6da243..a05c4e1d63 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -430,7 +430,10 @@ class FlavorParser: gcode_list_decorator.setGCodeList(gcode_list) scene_node.addDecorator(gcode_list_decorator) - Application.getInstance().getController().getScene().gcode_list = gcode_list + # gcode_dict stores gcode_lists for a number of build plates. + active_build_plate_id = Application.getInstance().getBuildPlateModel().activeBuildPlate + gcode_dict = {active_build_plate_id: gcode_list} + Application.getInstance().getController().getScene().gcode_dict = gcode_dict Logger.log("d", "Finished parsing %s" % file_name) self._message.hide() diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index ad23f2c8ee..f0e5c88f37 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -61,7 +61,10 @@ class GCodeWriter(MeshWriter): active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate scene = Application.getInstance().getController().getScene() - gcode_list = getattr(scene, "gcode_list")[active_build_plate] + gcode_dict = getattr(scene, "gcode_dict") + if not gcode_dict: + return False + gcode_list = gcode_dict.get(active_build_plate) if gcode_list: for gcode in gcode_list: stream.write(gcode) diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index 6eb89d69a4..6665380f45 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -244,8 +244,8 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._request_job = [nodes, file_name, filter_by_machine, file_handler, kwargs] # the build plates to be sent - gcodes = getattr(Application.getInstance().getController().getScene(), "gcode_list") - self._job_list = list(gcodes.keys()) + gcode_dict = getattr(Application.getInstance().getController().getScene(), "gcode_dict") + self._job_list = list(gcode_dict.keys()) Logger.log("d", "build plates to be sent to printer: %s", (self._job_list)) if self._stage != OutputStage.ready: @@ -281,11 +281,14 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte def sendPrintJob(self): nodes, file_name, filter_by_machine, file_handler, kwargs = self._request_job output_build_plate_number = self._job_list.pop(0) - gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list")[output_build_plate_number] - if not gcode: # Empty build plate + gcode_dict = getattr(Application.getInstance().getController().getScene(), "gcode_dict")[output_build_plate_number] + if not gcode_dict: # Empty build plate Logger.log("d", "Skipping empty job (build plate number %d).", output_build_plate_number) return self.sendPrintJob() + active_build_plate_id = Application.getInstance().getBuildPlateModel().activeBuildPlate + gcode_list = gcode_dict[active_build_plate_id] + self._send_gcode_start = time.time() Logger.log("d", "Sending print job [%s] to host, build plate [%s]..." % (file_name, output_build_plate_number)) @@ -302,7 +305,7 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte require_printer_name = self._selected_printer["unique_name"] - new_request = self._buildSendPrintJobHttpRequest(require_printer_name, gcode) + new_request = self._buildSendPrintJobHttpRequest(require_printer_name, gcode_list) if new_request is None or self._stage != OutputStage.uploading: return self._request = new_request @@ -310,7 +313,7 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._reply.uploadProgress.connect(self._onUploadProgress) # See _finishedPrintJobPostRequest() - def _buildSendPrintJobHttpRequest(self, require_printer_name, gcode): + def _buildSendPrintJobHttpRequest(self, require_printer_name, gcode_list): api_url = QUrl(self._api_base_uri + "print_jobs/") request = QNetworkRequest(api_url) # Create multipart request and add the g-code. @@ -321,7 +324,7 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte part.setHeader(QNetworkRequest.ContentDispositionHeader, 'form-data; name="file"; filename="%s"' % (self._file_name)) - compressed_gcode = self._compressGcode(gcode) + compressed_gcode = self._compressGcode(gcode_list) if compressed_gcode is None: return None # User aborted print, so stop trying. @@ -339,7 +342,7 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._addUserAgentHeader(request) return request - def _compressGcode(self, gcode): + def _compressGcode(self, gcode_list): self._compressing_print = True batched_line = "" max_chars_per_line = int(1024 * 1024 / 4) # 1 / 4 MB @@ -354,11 +357,11 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._last_response_time = time.time() return compressed_data - if gcode is None: + if gcode_list is None: Logger.log("e", "Unable to find sliced gcode, returning empty.") return byte_array_file_data - for line in gcode: + for line in gcode_list: if not self._compressing_print: self._progress_message.hide() return None # Stop trying to zip, abort was called. diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index de0a06527e..6b8946b755 100755 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -676,7 +676,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): self._print_finished = True self.writeStarted.emit(self) active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate - self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list")[active_build_plate] + self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_dict")[active_build_plate] print_information = Application.getInstance().getPrintInformation() warnings = [] # There might be multiple things wrong. Keep a list of all the stuff we need to warn about. diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 1930f5402b..f4f5478216 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -163,7 +163,10 @@ class USBPrinterOutputDevice(PrinterOutputDevice): def startPrint(self): self.writeStarted.emit(self) - gcode_list = getattr( Application.getInstance().getController().getScene(), "gcode_list") + active_build_plate_id = Application.getInstance().getBuildPlateModel().activeBuildPlate + gcode_dict = getattr(Application.getInstance().getController().getScene(), "gcode_dict") + gcode_list = gcode_dict[active_build_plate_id] + self._updateJobState("printing") self.printGCode(gcode_list) From 4c8c4c78da77cb3eb86fe078e4cba5eb62c122fb Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 9 Jan 2018 09:16:21 +0100 Subject: [PATCH 214/551] CURA-4772 Create a CuraSceneNode instead of a SceneNode when reading a GCode. Avoid creating an empty CuraSceneNode if the node is already an instance of it. --- cura/CuraApplication.py | 4 +++- plugins/GCodeReader/FlavorParser.py | 8 ++++---- plugins/SimulationView/SimulationPass.py | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 8aeeb9c1e8..b28e17f792 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1432,7 +1432,9 @@ class CuraApplication(QtApplication): target_build_plate = self.getBuildPlateModel().activeBuildPlate if arrange_objects_on_load else -1 for original_node in nodes: - node = CuraSceneNode() # We want our own CuraSceneNode + + # Create a CuraSceneNode just if the original node is not that type + node = original_node if isinstance(original_node, CuraSceneNode) else CuraSceneNode() node.setMeshData(original_node.getMeshData()) node.setSelectable(True) diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index fa5d6da243..0cd49e2fca 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -8,14 +8,14 @@ from UM.Logger import Logger from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Math.Vector import Vector from UM.Message import Message -from UM.Scene.SceneNode import SceneNode +from cura.Scene.CuraSceneNode import CuraSceneNode from UM.i18n import i18nCatalog from UM.Preferences import Preferences catalog = i18nCatalog("cura") from cura import LayerDataBuilder -from cura import LayerDataDecorator +from cura.LayerDataDecorator import LayerDataDecorator from cura.LayerPolygon import LayerPolygon from cura.Scene.GCodeListDecorator import GCodeListDecorator from cura.Settings.ExtruderManager import ExtruderManager @@ -292,7 +292,7 @@ class FlavorParser: # We obtain the filament diameter from the selected printer to calculate line widths self._filament_diameter = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") - scene_node = SceneNode() + scene_node = CuraSceneNode() # Override getBoundingBox function of the sceneNode, as this node should return a bounding box, but there is no # real data to calculate it from. scene_node.getBoundingBox = self._getNullBoundingBox @@ -422,7 +422,7 @@ class FlavorParser: material_color_map[0, :] = [0.0, 0.7, 0.9, 1.0] material_color_map[1, :] = [0.7, 0.9, 0.0, 1.0] layer_mesh = self._layer_data_builder.build(material_color_map) - decorator = LayerDataDecorator.LayerDataDecorator() + decorator = LayerDataDecorator() decorator.setLayerData(layer_mesh) scene_node.addDecorator(decorator) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index b453020ffa..c9c1443bfe 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -106,7 +106,7 @@ class SimulationPass(RenderPass): nozzle_node = node nozzle_node.setVisible(False) - elif issubclass(type(node), SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible() and node.callDecoration("getBuildPlateNumber") == active_build_plate: + elif issubclass(type(node), SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: continue From 117c467829c27833a8e0fbc555114aa243e4f468 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 9 Jan 2018 09:39:15 +0100 Subject: [PATCH 215/551] Fix: Per mesh setting combobox did not save selected option CURA-4760 --- .../PerObjectSettingVisibilityHandler.py | 9 +++++++++ plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 2 ++ 2 files changed, 11 insertions(+) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index badca13468..c7e4deaaa7 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal +from UM.FlameProfiler import pyqtSlot from UM.Application import Application from UM.Settings.ContainerRegistry import ContainerRegistry @@ -21,6 +22,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand self._selected_object_id = None self._node = None self._stack = None + self._skip_setting = None def setSelectedObjectId(self, id): if id != self._selected_object_id: @@ -36,6 +38,10 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand def selectedObjectId(self): return self._selected_object_id + @pyqtSlot(str) + def setSkipSetting(self, setting_name): + self._skip_setting = setting_name + def setVisible(self, visible): if not self._node: return @@ -50,6 +56,9 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand # Remove all instances that are not in visibility list for instance in all_instances: + # exceptionally skip setting + if self._skip_setting is not None and self._skip_setting == instance.definition.key: + continue if instance.definition.key not in visible: settings.removeInstance(instance.definition.key) visibility_changed = True diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 5bdb6d4cb0..2b7b6cd541 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -324,6 +324,8 @@ Item { // force updating the model to sync it with addedSettingsModel if(visible) { + // Set skip setting, it will prevent from restting selected mesh_type + contents.model.visibilityHandler.setSkipSetting(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type) listview.model.forceUpdate() } } From a85fd0c996bb49392a7595d63225130a73651f5b Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 9 Jan 2018 10:26:13 +0100 Subject: [PATCH 216/551] Stop ignoring post processing plugin --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 71e83433cf..a91d3f9377 100644 --- a/.gitignore +++ b/.gitignore @@ -47,7 +47,6 @@ plugins/Doodle3D-cura-plugin plugins/FlatProfileExporter plugins/GodMode plugins/OctoPrintPlugin -plugins/PostProcessingPlugin plugins/ProfileFlattener plugins/X3GWriter From 1f2007554de56741b516373362ec77d02ef9caee Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 9 Jan 2018 10:27:28 +0100 Subject: [PATCH 217/551] Add post processing source files to main repo --- plugins/PostProcessingPlugin | 1 + 1 file changed, 1 insertion(+) create mode 160000 plugins/PostProcessingPlugin diff --git a/plugins/PostProcessingPlugin b/plugins/PostProcessingPlugin new file mode 160000 index 0000000000..476c04484f --- /dev/null +++ b/plugins/PostProcessingPlugin @@ -0,0 +1 @@ +Subproject commit 476c04484f998b4defe42e62d8925d66a626973e From 9c9c46aade61b26af21fb50b2a7c3d80d856f085 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 9 Jan 2018 10:30:02 +0100 Subject: [PATCH 218/551] Remove submodule --- plugins/PostProcessingPlugin | 1 - 1 file changed, 1 deletion(-) delete mode 160000 plugins/PostProcessingPlugin diff --git a/plugins/PostProcessingPlugin b/plugins/PostProcessingPlugin deleted file mode 160000 index 476c04484f..0000000000 --- a/plugins/PostProcessingPlugin +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 476c04484f998b4defe42e62d8925d66a626973e From 6c0fb110fe842758c7cc20dae7edc055d5c8ad8c Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 9 Jan 2018 10:31:12 +0100 Subject: [PATCH 219/551] Add post processing source files --- .../PostProcessingPlugin.py | 206 +++++++ .../PostProcessingPlugin.qml | 501 ++++++++++++++++++ plugins/PostProcessingPlugin/README.md | 2 + plugins/PostProcessingPlugin/Script.py | 111 ++++ plugins/PostProcessingPlugin/__init__.py | 11 + plugins/PostProcessingPlugin/plugin.json | 8 + .../PostProcessingPlugin/postprocessing.svg | 47 ++ .../scripts/BQ_PauseAtHeight.py | 48 ++ .../scripts/ColorChange.py | 76 +++ .../scripts/ExampleScript.py | 43 ++ .../scripts/PauseAtHeight.py | 221 ++++++++ .../scripts/PauseAtHeightforRepetier.py | 169 ++++++ .../scripts/SearchAndReplace.py | 56 ++ .../PostProcessingPlugin/scripts/Stretch.py | 469 ++++++++++++++++ .../PostProcessingPlugin/scripts/TweakAtZ.py | 495 +++++++++++++++++ 15 files changed, 2463 insertions(+) create mode 100644 plugins/PostProcessingPlugin/PostProcessingPlugin.py create mode 100644 plugins/PostProcessingPlugin/PostProcessingPlugin.qml create mode 100644 plugins/PostProcessingPlugin/README.md create mode 100644 plugins/PostProcessingPlugin/Script.py create mode 100644 plugins/PostProcessingPlugin/__init__.py create mode 100644 plugins/PostProcessingPlugin/plugin.json create mode 100644 plugins/PostProcessingPlugin/postprocessing.svg create mode 100644 plugins/PostProcessingPlugin/scripts/BQ_PauseAtHeight.py create mode 100644 plugins/PostProcessingPlugin/scripts/ColorChange.py create mode 100644 plugins/PostProcessingPlugin/scripts/ExampleScript.py create mode 100644 plugins/PostProcessingPlugin/scripts/PauseAtHeight.py create mode 100644 plugins/PostProcessingPlugin/scripts/PauseAtHeightforRepetier.py create mode 100644 plugins/PostProcessingPlugin/scripts/SearchAndReplace.py create mode 100644 plugins/PostProcessingPlugin/scripts/Stretch.py create mode 100644 plugins/PostProcessingPlugin/scripts/TweakAtZ.py diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.py b/plugins/PostProcessingPlugin/PostProcessingPlugin.py new file mode 100644 index 0000000000..657e5c5387 --- /dev/null +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.py @@ -0,0 +1,206 @@ +# Copyright (c) 2015 Jaime van Kessel, Ultimaker B.V. +# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal, pyqtSlot + +from UM.PluginRegistry import PluginRegistry +from UM.Resources import Resources +from UM.Application import Application +from UM.Extension import Extension +from UM.Logger import Logger + +import os.path +import pkgutil +import sys +import importlib.util + +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("cura") + + +## The post processing plugin is an Extension type plugin that enables pre-written scripts to post process generated +# g-code files. +class PostProcessingPlugin(QObject, Extension): + def __init__(self, parent = None): + super().__init__(parent) + self.addMenuItem(i18n_catalog.i18n("Modify G-Code"), self.showPopup) + self._view = None + + # Loaded scripts are all scripts that can be used + self._loaded_scripts = {} + self._script_labels = {} + + # Script list contains instances of scripts in loaded_scripts. + # There can be duplicates, which will be executed in sequence. + self._script_list = [] + self._selected_script_index = -1 + + Application.getInstance().getOutputDeviceManager().writeStarted.connect(self.execute) + + selectedIndexChanged = pyqtSignal() + @pyqtProperty("QVariant", notify = selectedIndexChanged) + def selectedScriptDefinitionId(self): + try: + return self._script_list[self._selected_script_index].getDefinitionId() + except: + return "" + + @pyqtProperty("QVariant", notify=selectedIndexChanged) + def selectedScriptStackId(self): + try: + return self._script_list[self._selected_script_index].getStackId() + except: + return "" + + ## Execute all post-processing scripts on the gcode. + def execute(self, output_device): + scene = Application.getInstance().getController().getScene() + gcode_dict = getattr(scene, "gcode_dict") + if not gcode_dict: + return + + # get gcode list for the active build plate + active_build_plate_id = Application.getInstance().getBuildPlateModel().activeBuildPlate + gcode_list = gcode_dict[active_build_plate_id] + if not gcode_list: + return + + if ";POSTPROCESSED" not in gcode_list[0]: + for script in self._script_list: + try: + gcode_list = script.execute(gcode_list) + except Exception: + Logger.logException("e", "Exception in post-processing script.") + if len(self._script_list): # Add comment to g-code if any changes were made. + gcode_list[0] += ";POSTPROCESSED\n" + gcode_dict[active_build_plate_id] = gcode_list + setattr(scene, "gcode_dict", gcode_dict) + else: + Logger.log("e", "Already post processed") + + @pyqtSlot(int) + def setSelectedScriptIndex(self, index): + self._selected_script_index = index + self.selectedIndexChanged.emit() + + @pyqtProperty(int, notify = selectedIndexChanged) + def selectedScriptIndex(self): + return self._selected_script_index + + @pyqtSlot(int, int) + def moveScript(self, index, new_index): + if new_index < 0 or new_index > len(self._script_list) - 1: + return # nothing needs to be done + else: + # Magical switch code. + self._script_list[new_index], self._script_list[index] = self._script_list[index], self._script_list[new_index] + self.scriptListChanged.emit() + self.selectedIndexChanged.emit() #Ensure that settings are updated + self._propertyChanged() + + ## Remove a script from the active script list by index. + @pyqtSlot(int) + def removeScriptByIndex(self, index): + self._script_list.pop(index) + if len(self._script_list) - 1 < self._selected_script_index: + self._selected_script_index = len(self._script_list) - 1 + self.scriptListChanged.emit() + self.selectedIndexChanged.emit() # Ensure that settings are updated + self._propertyChanged() + + ## Load all scripts from provided path. + # This should probably only be done on init. + # \param path Path to check for scripts. + def loadAllScripts(self, path): + scripts = pkgutil.iter_modules(path = [path]) + for loader, script_name, ispkg in scripts: + # Iterate over all scripts. + if script_name not in sys.modules: + spec = importlib.util.spec_from_file_location(__name__ + "." + script_name, os.path.join(path, script_name + ".py")) + loaded_script = importlib.util.module_from_spec(spec) + spec.loader.exec_module(loaded_script) + sys.modules[script_name] = loaded_script + + loaded_class = getattr(loaded_script, script_name) + temp_object = loaded_class() + Logger.log("d", "Begin loading of script: %s", script_name) + try: + setting_data = temp_object.getSettingData() + if "name" in setting_data and "key" in setting_data: + self._script_labels[setting_data["key"]] = setting_data["name"] + self._loaded_scripts[setting_data["key"]] = loaded_class + else: + Logger.log("w", "Script %s.py has no name or key", script_name) + self._script_labels[script_name] = script_name + self._loaded_scripts[script_name] = loaded_class + except AttributeError: + Logger.log("e", "Script %s.py is not a recognised script type. Ensure it inherits Script", script_name) + except NotImplementedError: + Logger.log("e", "Script %s.py has no implemented settings", script_name) + self.loadedScriptListChanged.emit() + + loadedScriptListChanged = pyqtSignal() + @pyqtProperty("QVariantList", notify = loadedScriptListChanged) + def loadedScriptList(self): + return sorted(list(self._loaded_scripts.keys())) + + @pyqtSlot(str, result = str) + def getScriptLabelByKey(self, key): + return self._script_labels[key] + + scriptListChanged = pyqtSignal() + @pyqtProperty("QVariantList", notify = scriptListChanged) + def scriptList(self): + script_list = [script.getSettingData()["key"] for script in self._script_list] + return script_list + + @pyqtSlot(str) + def addScriptToList(self, key): + Logger.log("d", "Adding script %s to list.", key) + new_script = self._loaded_scripts[key]() + self._script_list.append(new_script) + self.setSelectedScriptIndex(len(self._script_list) - 1) + self.scriptListChanged.emit() + self._propertyChanged() + + ## Creates the view used by show popup. The view is saved because of the fairly aggressive garbage collection. + def _createView(self): + Logger.log("d", "Creating post processing plugin view.") + + ## Load all scripts in the scripts folders + for root in [PluginRegistry.getInstance().getPluginPath("PostProcessingPlugin"), Resources.getStoragePath(Resources.Preferences)]: + try: + path = os.path.join(root, "scripts") + if not os.path.isdir(path): + try: + os.makedirs(path) + except OSError: + Logger.log("w", "Unable to create a folder for scripts: " + path) + continue + + self.loadAllScripts(path) + except Exception as e: + Logger.logException("e", "Exception occurred while loading post processing plugin: {error_msg}".format(error_msg = str(e))) + + # Create the plugin dialog component + path = os.path.join(PluginRegistry.getInstance().getPluginPath("PostProcessingPlugin"), "PostProcessingPlugin.qml") + self._view = Application.getInstance().createQmlComponent(path, {"manager": self}) + Logger.log("d", "Post processing view created.") + + # Create the save button component + Application.getInstance().addAdditionalComponent("saveButton", self._view.findChild(QObject, "postProcessingSaveAreaButton")) + + ## Show the (GUI) popup of the post processing plugin. + def showPopup(self): + if self._view is None: + self._createView() + self._view.show() + + ## Property changed: trigger re-slice + # To do this we use the global container stack propertyChanged. + # Re-slicing is necessary for setting changes in this plugin, because the changes + # are applied only once per "fresh" gcode + def _propertyChanged(self): + global_container_stack = Application.getInstance().getGlobalContainerStack() + global_container_stack.propertyChanged.emit("post_processing_plugin", "value") + + diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml new file mode 100644 index 0000000000..d64d60a04a --- /dev/null +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml @@ -0,0 +1,501 @@ +// Copyright (c) 2015 Jaime van Kessel, Ultimaker B.V. +// The PostProcessingPlugin 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 QtQuick.Dialogs 1.1 +import QtQuick.Window 2.2 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +UM.Dialog +{ + id: dialog + + title: catalog.i18nc("@title:window", "Post Processing Plugin") + width: 700 * screenScaleFactor; + height: 500 * screenScaleFactor; + minimumWidth: 400 * screenScaleFactor; + minimumHeight: 250 * screenScaleFactor; + + Item + { + UM.I18nCatalog{id: catalog; name:"cura"} + id: base + property int columnWidth: Math.floor((base.width / 2) - UM.Theme.getSize("default_margin").width) + property int textMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) + property string activeScriptName + SystemPalette{ id: palette } + SystemPalette{ id: disabledPalette; colorGroup: SystemPalette.Disabled } + anchors.fill: parent + + ExclusiveGroup + { + id: selectedScriptGroup + } + Item + { + id: activeScripts + anchors.left: parent.left + width: base.columnWidth + height: parent.height + + Label + { + id: activeScriptsHeader + text: catalog.i18nc("@label", "Post Processing Scripts") + anchors.top: parent.top + anchors.topMargin: base.textMargin + anchors.left: parent.left + anchors.leftMargin: base.textMargin + anchors.right: parent.right + anchors.rightMargin: base.textMargin + font: UM.Theme.getFont("large") + } + ListView + { + id: activeScriptsList + anchors.top: activeScriptsHeader.bottom + anchors.topMargin: base.textMargin + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right: parent.right + anchors.rightMargin: base.textMargin + height: childrenRect.height + model: manager.scriptList + delegate: Item + { + width: parent.width + height: activeScriptButton.height + Button + { + id: activeScriptButton + text: manager.getScriptLabelByKey(modelData.toString()) + exclusiveGroup: selectedScriptGroup + checkable: true + checked: { + if (manager.selectedScriptIndex == index) + { + base.activeScriptName = manager.getScriptLabelByKey(modelData.toString()) + return true + } + else + { + return false + } + } + onClicked: + { + forceActiveFocus() + manager.setSelectedScriptIndex(index) + base.activeScriptName = manager.getScriptLabelByKey(modelData.toString()) + } + width: parent.width + height: UM.Theme.getSize("setting").height + style: ButtonStyle + { + background: Rectangle + { + color: activeScriptButton.checked ? palette.highlight : "transparent" + width: parent.width + height: parent.height + } + label: Label + { + wrapMode: Text.Wrap + text: control.text + color: activeScriptButton.checked ? palette.highlightedText : palette.text + } + } + } + Button + { + id: removeButton + text: "x" + width: 20 * screenScaleFactor + height: 20 * screenScaleFactor + anchors.right:parent.right + anchors.rightMargin: base.textMargin + anchors.verticalCenter: parent.verticalCenter + onClicked: manager.removeScriptByIndex(index) + style: ButtonStyle + { + label: Item + { + UM.RecolorImage + { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: Math.floor(control.width / 2.7) + height: Math.floor(control.height / 2.7) + sourceSize.width: width + sourceSize.height: width + color: palette.text + source: UM.Theme.getIcon("cross1") + } + } + } + } + Button + { + id: downButton + text: "" + anchors.right: removeButton.left + anchors.verticalCenter: parent.verticalCenter + enabled: index != manager.scriptList.length - 1 + width: 20 * screenScaleFactor + height: 20 * screenScaleFactor + onClicked: + { + if (manager.selectedScriptIndex == index) + { + manager.setSelectedScriptIndex(index + 1) + } + return manager.moveScript(index, index + 1) + } + style: ButtonStyle + { + label: Item + { + UM.RecolorImage + { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: Math.floor(control.width / 2.5) + height: Math.floor(control.height / 2.5) + sourceSize.width: width + sourceSize.height: width + color: control.enabled ? palette.text : disabledPalette.text + source: UM.Theme.getIcon("arrow_bottom") + } + } + } + } + Button + { + id: upButton + text: "" + enabled: index != 0 + width: 20 * screenScaleFactor + height: 20 * screenScaleFactor + anchors.right: downButton.left + anchors.verticalCenter: parent.verticalCenter + onClicked: + { + if (manager.selectedScriptIndex == index) + { + manager.setSelectedScriptIndex(index - 1) + } + return manager.moveScript(index, index - 1) + } + style: ButtonStyle + { + label: Item + { + UM.RecolorImage + { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: Math.floor(control.width / 2.5) + height: Math.floor(control.height / 2.5) + sourceSize.width: width + sourceSize.height: width + color: control.enabled ? palette.text : disabledPalette.text + source: UM.Theme.getIcon("arrow_top") + } + } + } + } + } + } + Button + { + id: addButton + text: catalog.i18nc("@action", "Add a script") + anchors.left: parent.left + anchors.leftMargin: base.textMargin + anchors.top: activeScriptsList.bottom + anchors.topMargin: base.textMargin + menu: scriptsMenu + style: ButtonStyle + { + label: Label + { + text: control.text + } + } + } + Menu + { + id: scriptsMenu + + Instantiator + { + model: manager.loadedScriptList + + MenuItem + { + text: manager.getScriptLabelByKey(modelData.toString()) + onTriggered: manager.addScriptToList(modelData.toString()) + } + + onObjectAdded: scriptsMenu.insertItem(index, object); + onObjectRemoved: scriptsMenu.removeItem(object); + } + } + } + + Rectangle + { + color: UM.Theme.getColor("sidebar") + anchors.left: activeScripts.right + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right: parent.right + height: parent.height + id: settingsPanel + + Label + { + id: scriptSpecsHeader + text: manager.selectedScriptIndex == -1 ? catalog.i18nc("@label", "Settings") : base.activeScriptName + anchors.top: parent.top + anchors.topMargin: base.textMargin + anchors.left: parent.left + anchors.leftMargin: base.textMargin + anchors.right: parent.right + anchors.rightMargin: base.textMargin + height: 20 * screenScaleFactor + font: UM.Theme.getFont("large") + color: UM.Theme.getColor("text") + } + + ScrollView + { + id: scrollView + anchors.top: scriptSpecsHeader.bottom + anchors.topMargin: settingsPanel.textMargin + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + visible: manager.selectedScriptDefinitionId != "" + style: UM.Theme.styles.scrollview; + + ListView + { + id: listview + spacing: UM.Theme.getSize("default_lining").height + model: UM.SettingDefinitionsModel + { + id: definitionsModel; + containerId: manager.selectedScriptDefinitionId + showAll: true + } + delegate:Loader + { + id: settingLoader + + width: parent.width + height: + { + if(provider.properties.enabled == "True") + { + if(model.type != undefined) + { + return UM.Theme.getSize("section").height; + } + else + { + return 0; + } + } + else + { + return 0; + } + + } + Behavior on height { NumberAnimation { duration: 100 } } + opacity: provider.properties.enabled == "True" ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 100 } } + enabled: opacity > 0 + property var definition: model + property var settingDefinitionsModel: definitionsModel + property var propertyProvider: provider + property var globalPropertyProvider: inheritStackProvider + + //Qt5.4.2 and earlier has a bug where this causes a crash: https://bugreports.qt.io/browse/QTBUG-35989 + //In addition, while it works for 5.5 and higher, the ordering of the actual combo box drop down changes, + //causing nasty issues when selecting different options. So disable asynchronous loading of enum type completely. + asynchronous: model.type != "enum" && model.type != "extruder" + + onLoaded: { + settingLoader.item.showRevertButton = false + settingLoader.item.showInheritButton = false + settingLoader.item.showLinkedSettingIcon = false + settingLoader.item.doDepthIndentation = true + settingLoader.item.doQualityUserSettingEmphasis = false + } + + sourceComponent: + { + switch(model.type) + { + case "int": + return settingTextField + case "float": + return settingTextField + case "enum": + return settingComboBox + case "extruder": + return settingExtruder + case "bool": + return settingCheckBox + case "str": + return settingTextField + case "category": + return settingCategory + default: + return settingUnknown + } + } + + UM.SettingPropertyProvider + { + id: provider + containerStackId: manager.selectedScriptStackId + key: model.key ? model.key : "None" + watchedProperties: [ "value", "enabled", "state", "validationState" ] + storeIndex: 0 + } + + // Specialty provider that only watches global_inherits (we cant filter on what property changed we get events + // so we bypass that to make a dedicated provider). + UM.SettingPropertyProvider + { + id: inheritStackProvider + containerStackId: Cura.MachineManager.activeMachineId + key: model.key ? model.key : "None" + watchedProperties: [ "limit_to_extruder" ] + } + + Connections + { + target: item + + onShowTooltip: + { + tooltip.text = text; + var position = settingLoader.mapToItem(settingsPanel, settingsPanel.x, 0); + tooltip.show(position); + tooltip.target.x = position.x + 1 + } + + onHideTooltip: + { + tooltip.hide(); + } + } + + } + } + } + } + + Cura.SidebarTooltip + { + id: tooltip + } + + Component + { + id: settingTextField; + + Cura.SettingTextField { } + } + + Component + { + id: settingComboBox; + + Cura.SettingComboBox { } + } + + Component + { + id: settingExtruder; + + Cura.SettingExtruder { } + } + + Component + { + id: settingCheckBox; + + Cura.SettingCheckBox { } + } + + Component + { + id: settingCategory; + + Cura.SettingCategory { } + } + + Component + { + id: settingUnknown; + + Cura.SettingUnknown { } + } + } + rightButtons: Button + { + text: catalog.i18nc("@action:button", "Close") + iconName: "dialog-close" + onClicked: dialog.accept() + } + + Button { + objectName: "postProcessingSaveAreaButton" + visible: activeScriptsList.count > 0 + height: UM.Theme.getSize("save_button_save_to_button").height + width: height + tooltip: catalog.i18nc("@info:tooltip", "Change active post-processing scripts") + onClicked: dialog.show() + + style: ButtonStyle { + background: Rectangle { + id: deviceSelectionIcon + border.width: UM.Theme.getSize("default_lining").width + border.color: !control.enabled ? UM.Theme.getColor("action_button_disabled_border") : + control.pressed ? UM.Theme.getColor("action_button_active_border") : + control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border") + color: !control.enabled ? UM.Theme.getColor("action_button_disabled") : + control.pressed ? UM.Theme.getColor("action_button_active") : + control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button") + Behavior on color { ColorAnimation { duration: 50; } } + anchors.left: parent.left + anchors.leftMargin: Math.floor(UM.Theme.getSize("save_button_text_margin").width / 2); + width: parent.height + height: parent.height + + UM.RecolorImage { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: Math.floor(parent.width / 2) + height: Math.floor(parent.height / 2) + sourceSize.width: width + sourceSize.height: height + color: !control.enabled ? UM.Theme.getColor("action_button_disabled_text") : + control.pressed ? UM.Theme.getColor("action_button_active_text") : + control.hovered ? UM.Theme.getColor("action_button_hovered_text") : UM.Theme.getColor("action_button_text"); + source: "postprocessing.svg" + } + } + label: Label{ } + } + } +} \ No newline at end of file diff --git a/plugins/PostProcessingPlugin/README.md b/plugins/PostProcessingPlugin/README.md new file mode 100644 index 0000000000..988f40007d --- /dev/null +++ b/plugins/PostProcessingPlugin/README.md @@ -0,0 +1,2 @@ +# PostProcessingPlugin +A post processing plugin for Cura diff --git a/plugins/PostProcessingPlugin/Script.py b/plugins/PostProcessingPlugin/Script.py new file mode 100644 index 0000000000..7d603ba11f --- /dev/null +++ b/plugins/PostProcessingPlugin/Script.py @@ -0,0 +1,111 @@ +# Copyright (c) 2015 Jaime van Kessel +# Copyright (c) 2017 Ultimaker B.V. +# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +from UM.Logger import Logger +from UM.Signal import Signal, signalemitter +from UM.i18n import i18nCatalog + +# Setting stuff import +from UM.Application import Application +from UM.Settings.ContainerStack import ContainerStack +from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.DefinitionContainer import DefinitionContainer +from UM.Settings.ContainerRegistry import ContainerRegistry + +import re +import json +import collections +i18n_catalog = i18nCatalog("cura") + + +## Base class for scripts. All scripts should inherit the script class. +@signalemitter +class Script: + def __init__(self): + super().__init__() + self._settings = None + self._stack = None + + setting_data = self.getSettingData() + self._stack = ContainerStack(stack_id = str(id(self))) + self._stack.setDirty(False) # This stack does not need to be saved. + + + ## Check if the definition of this script already exists. If not, add it to the registry. + if "key" in setting_data: + definitions = ContainerRegistry.getInstance().findDefinitionContainers(id = setting_data["key"]) + if definitions: + # Definition was found + self._definition = definitions[0] + else: + self._definition = DefinitionContainer(setting_data["key"]) + self._definition.deserialize(json.dumps(setting_data)) + ContainerRegistry.getInstance().addContainer(self._definition) + self._stack.addContainer(self._definition) + self._instance = InstanceContainer(container_id="ScriptInstanceContainer") + self._instance.setDefinition(self._definition.getId()) + self._instance.addMetaDataEntry("setting_version", self._definition.getMetaDataEntry("setting_version", default = 0)) + self._stack.addContainer(self._instance) + self._stack.propertyChanged.connect(self._onPropertyChanged) + + ContainerRegistry.getInstance().addContainer(self._stack) + + settingsLoaded = Signal() + valueChanged = Signal() # Signal emitted whenever a value of a setting is changed + + def _onPropertyChanged(self, key, property_name): + if property_name == "value": + self.valueChanged.emit() + + # Property changed: trigger reslice + # To do this we use the global container stack propertyChanged. + # Reslicing is necessary for setting changes in this plugin, because the changes + # are applied only once per "fresh" gcode + global_container_stack = Application.getInstance().getGlobalContainerStack() + global_container_stack.propertyChanged.emit(key, property_name) + + ## Needs to return a dict that can be used to construct a settingcategory file. + # See the example script for an example. + # It follows the same style / guides as the Uranium settings. + # Scripts can either override getSettingData directly, or use getSettingDataString + # to return a string that will be parsed as json. The latter has the benefit over + # returning a dict in that the order of settings is maintained. + def getSettingData(self): + setting_data = self.getSettingDataString() + if type(setting_data) == str: + setting_data = json.loads(setting_data, object_pairs_hook = collections.OrderedDict) + return setting_data + + def getSettingDataString(self): + raise NotImplementedError() + + def getDefinitionId(self): + if self._stack: + return self._stack.getBottom().getId() + + def getStackId(self): + if self._stack: + return self._stack.getId() + + ## Convenience function that retrieves value of a setting from the stack. + def getSettingValueByKey(self, key): + return self._stack.getProperty(key, "value") + + ## Convenience function that finds the value in a line of g-code. + # When requesting key = x from line "G1 X100" the value 100 is returned. + def getValue(self, line, key, default = None): + if not key in line or (';' in line and line.find(key) > line.find(';')): + return default + sub_part = line[line.find(key) + 1:] + m = re.search('^-?[0-9]+\.?[0-9]*', sub_part) + if m is None: + return default + try: + return float(m.group(0)) + except: + return default + + ## This is called when the script is executed. + # It gets a list of g-code strings and needs to return a (modified) list. + def execute(self, data): + raise NotImplementedError() diff --git a/plugins/PostProcessingPlugin/__init__.py b/plugins/PostProcessingPlugin/__init__.py new file mode 100644 index 0000000000..85f1126136 --- /dev/null +++ b/plugins/PostProcessingPlugin/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) 2015 Jaime van Kessel, Ultimaker B.V. +# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. + +from . import PostProcessingPlugin +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") +def getMetaData(): + return {} + +def register(app): + return {"extension": PostProcessingPlugin.PostProcessingPlugin()} \ No newline at end of file diff --git a/plugins/PostProcessingPlugin/plugin.json b/plugins/PostProcessingPlugin/plugin.json new file mode 100644 index 0000000000..ebfef8145a --- /dev/null +++ b/plugins/PostProcessingPlugin/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Post Processing", + "author": "Ultimaker", + "version": "2.2", + "api": 4, + "description": "Extension that allows for user created scripts for post processing", + "catalog": "cura" +} \ No newline at end of file diff --git a/plugins/PostProcessingPlugin/postprocessing.svg b/plugins/PostProcessingPlugin/postprocessing.svg new file mode 100644 index 0000000000..f55face4a9 --- /dev/null +++ b/plugins/PostProcessingPlugin/postprocessing.svg @@ -0,0 +1,47 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/plugins/PostProcessingPlugin/scripts/BQ_PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/BQ_PauseAtHeight.py new file mode 100644 index 0000000000..fb59378206 --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/BQ_PauseAtHeight.py @@ -0,0 +1,48 @@ +from ..Script import Script +class BQ_PauseAtHeight(Script): + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name":"Pause at height (BQ Printers)", + "key": "BQ_PauseAtHeight", + "metadata":{}, + "version": 2, + "settings": + { + "pause_height": + { + "label": "Pause height", + "description": "At what height should the pause occur", + "unit": "mm", + "type": "float", + "default_value": 5.0 + } + } + }""" + + def execute(self, data): + x = 0. + y = 0. + current_z = 0. + pause_z = self.getSettingValueByKey("pause_height") + for layer in data: + lines = layer.split("\n") + for line in lines: + if self.getValue(line, 'G') == 1 or self.getValue(line, 'G') == 0: + current_z = self.getValue(line, 'Z') + if current_z != None: + if current_z >= pause_z: + prepend_gcode = ";TYPE:CUSTOM\n" + prepend_gcode += "; -- Pause at height (%.2f mm) --\n" % pause_z + + # Insert Pause gcode + prepend_gcode += "M25 ; Pauses the print and waits for the user to resume it\n" + + index = data.index(layer) + layer = prepend_gcode + layer + data[index] = layer # Override the data of this layer with the modified data + return data + break + return data diff --git a/plugins/PostProcessingPlugin/scripts/ColorChange.py b/plugins/PostProcessingPlugin/scripts/ColorChange.py new file mode 100644 index 0000000000..8db45f4033 --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/ColorChange.py @@ -0,0 +1,76 @@ +# This PostProcessing Plugin script is released +# under the terms of the AGPLv3 or higher + +from ..Script import Script +#from UM.Logger import Logger +# from cura.Settings.ExtruderManager import ExtruderManager + +class ColorChange(Script): + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name":"Color Change", + "key": "ColorChange", + "metadata": {}, + "version": 2, + "settings": + { + "layer_number": + { + "label": "Layer", + "description": "At what layer should color change occur. This will be before the layer starts printing. Specify multiple color changes with a comma.", + "unit": "", + "type": "str", + "default_value": "1" + }, + + "initial_retract": + { + "label": "Initial Retraction", + "description": "Initial filament retraction distance", + "unit": "mm", + "type": "float", + "default_value": 300.0 + }, + "later_retract": + { + "label": "Later Retraction Distance", + "description": "Later filament retraction distance for removal", + "unit": "mm", + "type": "float", + "default_value": 30.0 + } + } + }""" + + def execute(self, data: list): + + """data is a list. Each index contains a layer""" + layer_nums = self.getSettingValueByKey("layer_number") + initial_retract = self.getSettingValueByKey("initial_retract") + later_retract = self.getSettingValueByKey("later_retract") + + color_change = "M600" + + if initial_retract is not None and initial_retract > 0.: + color_change = color_change + (" E%.2f" % initial_retract) + + if later_retract is not None and later_retract > 0.: + color_change = color_change + (" L%.2f" % later_retract) + + color_change = color_change + " ; Generated by ColorChange plugin" + + layer_targets = layer_nums.split(',') + if len(layer_targets) > 0: + for layer_num in layer_targets: + layer_num = int( layer_num.strip() ) + if layer_num < len(data): + layer = data[ layer_num - 1 ] + lines = layer.split("\n") + lines.insert(2, color_change ) + final_line = "\n".join( lines ) + data[ layer_num - 1 ] = final_line + + return data diff --git a/plugins/PostProcessingPlugin/scripts/ExampleScript.py b/plugins/PostProcessingPlugin/scripts/ExampleScript.py new file mode 100644 index 0000000000..416a5f5404 --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/ExampleScript.py @@ -0,0 +1,43 @@ +# Copyright (c) 2015 Jaime van Kessel, Ultimaker B.V. +# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +from ..Script import Script + +class ExampleScript(Script): + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name":"Example script", + "key": "ExampleScript", + "metadata": {}, + "version": 2, + "settings": + { + "test": + { + "label": "Test", + "description": "None", + "unit": "mm", + "type": "float", + "default_value": 0.5, + "minimum_value": "0", + "minimum_value_warning": "0.1", + "maximum_value_warning": "1" + }, + "derp": + { + "label": "zomg", + "description": "afgasgfgasfgasf", + "unit": "mm", + "type": "float", + "default_value": 0.5, + "minimum_value": "0", + "minimum_value_warning": "0.1", + "maximum_value_warning": "1" + } + } + }""" + + def execute(self, data): + return data \ No newline at end of file diff --git a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py new file mode 100644 index 0000000000..925a5a7ac5 --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py @@ -0,0 +1,221 @@ +from ..Script import Script +# from cura.Settings.ExtruderManager import ExtruderManager + +class PauseAtHeight(Script): + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name":"Pause at height", + "key": "PauseAtHeight", + "metadata": {}, + "version": 2, + "settings": + { + "pause_height": + { + "label": "Pause Height", + "description": "At what height should the pause occur", + "unit": "mm", + "type": "float", + "default_value": 5.0 + }, + "head_park_x": + { + "label": "Park Print Head X", + "description": "What X location does the head move to when pausing.", + "unit": "mm", + "type": "float", + "default_value": 190 + }, + "head_park_y": + { + "label": "Park Print Head Y", + "description": "What Y location does the head move to when pausing.", + "unit": "mm", + "type": "float", + "default_value": 190 + }, + "retraction_amount": + { + "label": "Retraction", + "description": "How much filament must be retracted at pause.", + "unit": "mm", + "type": "float", + "default_value": 0 + }, + "retraction_speed": + { + "label": "Retraction Speed", + "description": "How fast to retract the filament.", + "unit": "mm/s", + "type": "float", + "default_value": 25 + }, + "extrude_amount": + { + "label": "Extrude Amount", + "description": "How much filament should be extruded after pause. This is needed when doing a material change on Ultimaker2's to compensate for the retraction after the change. In that case 128+ is recommended.", + "unit": "mm", + "type": "float", + "default_value": 0 + }, + "extrude_speed": + { + "label": "Extrude Speed", + "description": "How fast to extrude the material after pause.", + "unit": "mm/s", + "type": "float", + "default_value": 3.3333 + }, + "redo_layers": + { + "label": "Redo Layers", + "description": "Redo a number of previous layers after a pause to increases adhesion.", + "unit": "layers", + "type": "int", + "default_value": 0 + }, + "standby_temperature": + { + "label": "Standby Temperature", + "description": "Change the temperature during the pause", + "unit": "°C", + "type": "int", + "default_value": 0 + }, + "resume_temperature": + { + "label": "Resume Temperature", + "description": "Change the temperature after the pause", + "unit": "°C", + "type": "int", + "default_value": 0 + } + } + }""" + + def execute(self, data: list): + + """data is a list. Each index contains a layer""" + + x = 0. + y = 0. + current_z = 0. + pause_height = self.getSettingValueByKey("pause_height") + retraction_amount = self.getSettingValueByKey("retraction_amount") + retraction_speed = self.getSettingValueByKey("retraction_speed") + extrude_amount = self.getSettingValueByKey("extrude_amount") + extrude_speed = self.getSettingValueByKey("extrude_speed") + park_x = self.getSettingValueByKey("head_park_x") + park_y = self.getSettingValueByKey("head_park_y") + layers_started = False + redo_layers = self.getSettingValueByKey("redo_layers") + standby_temperature = self.getSettingValueByKey("standby_temperature") + resume_temperature = self.getSettingValueByKey("resume_temperature") + + # T = ExtruderManager.getInstance().getActiveExtruderStack().getProperty("material_print_temperature", "value") + # with open("out.txt", "w") as f: + # f.write(T) + + # use offset to calculate the current height: = - + layer_0_z = 0. + got_first_g_cmd_on_layer_0 = False + for layer in data: + lines = layer.split("\n") + for line in lines: + if ";LAYER:0" in line: + layers_started = True + continue + + if not layers_started: + continue + + if self.getValue(line, 'G') == 1 or self.getValue(line, 'G') == 0: + current_z = self.getValue(line, 'Z') + if not got_first_g_cmd_on_layer_0: + layer_0_z = current_z + got_first_g_cmd_on_layer_0 = True + + x = self.getValue(line, 'X', x) + y = self.getValue(line, 'Y', y) + if current_z is not None: + current_height = current_z - layer_0_z + if current_height >= pause_height: + index = data.index(layer) + prevLayer = data[index - 1] + prevLines = prevLayer.split("\n") + current_e = 0. + for prevLine in reversed(prevLines): + current_e = self.getValue(prevLine, 'E', -1) + if current_e >= 0: + break + + # include a number of previous layers + for i in range(1, redo_layers + 1): + prevLayer = data[index - i] + layer = prevLayer + layer + + prepend_gcode = ";TYPE:CUSTOM\n" + prepend_gcode += ";added code by post processing\n" + prepend_gcode += ";script: PauseAtHeight.py\n" + prepend_gcode += ";current z: %f \n" % current_z + prepend_gcode += ";current height: %f \n" % current_height + + # Retraction + prepend_gcode += "M83\n" + if retraction_amount != 0: + prepend_gcode += "G1 E-%f F%f\n" % (retraction_amount, retraction_speed * 60) + + # Move the head away + prepend_gcode += "G1 Z%f F300\n" % (current_z + 1) + prepend_gcode += "G1 X%f Y%f F9000\n" % (park_x, park_y) + if current_z < 15: + prepend_gcode += "G1 Z15 F300\n" + + # Disable the E steppers + prepend_gcode += "M84 E0\n" + + # Set extruder standby temperature + prepend_gcode += "M104 S%i; standby temperature\n" % (standby_temperature) + + # Wait till the user continues printing + prepend_gcode += "M0 ;Do the actual pause\n" + + # Set extruder resume temperature + prepend_gcode += "M109 S%i; resume temperature\n" % (resume_temperature) + + # Push the filament back, + if retraction_amount != 0: + prepend_gcode += "G1 E%f F%f\n" % (retraction_amount, retraction_speed * 60) + + # Optionally extrude material + if extrude_amount != 0: + prepend_gcode += "G1 E%f F%f\n" % (extrude_amount, extrude_speed * 60) + + # and retract again, the properly primes the nozzle + # when changing filament. + if retraction_amount != 0: + prepend_gcode += "G1 E-%f F%f\n" % (retraction_amount, retraction_speed * 60) + + # Move the head back + prepend_gcode += "G1 Z%f F300\n" % (current_z + 1) + prepend_gcode += "G1 X%f Y%f F9000\n" % (x, y) + if retraction_amount != 0: + prepend_gcode += "G1 E%f F%f\n" % (retraction_amount, retraction_speed * 60) + prepend_gcode += "G1 F9000\n" + prepend_gcode += "M82\n" + + # reset extrude value to pre pause value + prepend_gcode += "G92 E%f\n" % (current_e) + + layer = prepend_gcode + layer + + + # Override the data of this layer with the + # modified data + data[index] = layer + return data + break + return data diff --git a/plugins/PostProcessingPlugin/scripts/PauseAtHeightforRepetier.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeightforRepetier.py new file mode 100644 index 0000000000..710baab26a --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/PauseAtHeightforRepetier.py @@ -0,0 +1,169 @@ +from ..Script import Script +class PauseAtHeightforRepetier(Script): + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name":"Pause at height for repetier", + "key": "PauseAtHeightforRepetier", + "metadata": {}, + "version": 2, + "settings": + { + "pause_height": + { + "label": "Pause height", + "description": "At what height should the pause occur", + "unit": "mm", + "type": "float", + "default_value": 5.0 + }, + "head_park_x": + { + "label": "Park print head X", + "description": "What x location does the head move to when pausing.", + "unit": "mm", + "type": "float", + "default_value": 5.0 + }, + "head_park_y": + { + "label": "Park print head Y", + "description": "What y location does the head move to when pausing.", + "unit": "mm", + "type": "float", + "default_value": 5.0 + }, + "head_move_Z": + { + "label": "Head move Z", + "description": "The Hieght of Z-axis retraction before parking.", + "unit": "mm", + "type": "float", + "default_value": 15.0 + }, + "retraction_amount": + { + "label": "Retraction", + "description": "How much fillament must be retracted at pause.", + "unit": "mm", + "type": "float", + "default_value": 5.0 + }, + "extrude_amount": + { + "label": "Extrude amount", + "description": "How much filament should be extruded after pause. This is needed when doing a material change on Ultimaker2's to compensate for the retraction after the change. In that case 128+ is recommended.", + "unit": "mm", + "type": "float", + "default_value": 90.0 + }, + "redo_layers": + { + "label": "Redo layers", + "description": "Redo a number of previous layers after a pause to increases adhesion.", + "unit": "layers", + "type": "int", + "default_value": 0 + } + } + }""" + + def execute(self, data): + x = 0. + y = 0. + current_z = 0. + pause_z = self.getSettingValueByKey("pause_height") + retraction_amount = self.getSettingValueByKey("retraction_amount") + extrude_amount = self.getSettingValueByKey("extrude_amount") + park_x = self.getSettingValueByKey("head_park_x") + park_y = self.getSettingValueByKey("head_park_y") + move_Z = self.getSettingValueByKey("head_move_Z") + layers_started = False + redo_layers = self.getSettingValueByKey("redo_layers") + for layer in data: + lines = layer.split("\n") + for line in lines: + if ";LAYER:0" in line: + layers_started = True + continue + + if not layers_started: + continue + + if self.getValue(line, 'G') == 1 or self.getValue(line, 'G') == 0: + current_z = self.getValue(line, 'Z') + x = self.getValue(line, 'X', x) + y = self.getValue(line, 'Y', y) + if current_z != None: + if current_z >= pause_z: + + index = data.index(layer) + prevLayer = data[index-1] + prevLines = prevLayer.split("\n") + current_e = 0. + for prevLine in reversed(prevLines): + current_e = self.getValue(prevLine, 'E', -1) + if current_e >= 0: + break + + prepend_gcode = ";TYPE:CUSTOM\n" + prepend_gcode += ";added code by post processing\n" + prepend_gcode += ";script: PauseAtHeightforRepetier.py\n" + prepend_gcode += ";current z: %f \n" % (current_z) + prepend_gcode += ";current X: %f \n" % (x) + prepend_gcode += ";current Y: %f \n" % (y) + + #Retraction + prepend_gcode += "M83\n" + if retraction_amount != 0: + prepend_gcode += "G1 E-%f F6000\n" % (retraction_amount) + + #Move the head away + prepend_gcode += "G1 Z%f F300\n" % (1 + current_z) + prepend_gcode += "G1 X%f Y%f F9000\n" % (park_x, park_y) + if current_z < move_Z: + prepend_gcode += "G1 Z%f F300\n" % (current_z + move_Z) + + #Disable the E steppers + prepend_gcode += "M84 E0\n" + #Wait till the user continues printing + prepend_gcode += "@pause now change filament and press continue printing ;Do the actual pause\n" + + #Push the filament back, + if retraction_amount != 0: + prepend_gcode += "G1 E%f F6000\n" % (retraction_amount) + + # Optionally extrude material + if extrude_amount != 0: + prepend_gcode += "G1 E%f F200\n" % (extrude_amount) + prepend_gcode += "@info wait for cleaning nozzle from previous filament\n" + prepend_gcode += "@pause remove the waste filament from parking area and press continue printing\n" + + # and retract again, the properly primes the nozzle when changing filament. + if retraction_amount != 0: + prepend_gcode += "G1 E-%f F6000\n" % (retraction_amount) + + #Move the head back + prepend_gcode += "G1 Z%f F300\n" % (1 + current_z) + prepend_gcode +="G1 X%f Y%f F9000\n" % (x, y) + if retraction_amount != 0: + prepend_gcode +="G1 E%f F6000\n" % (retraction_amount) + prepend_gcode +="G1 F9000\n" + prepend_gcode +="M82\n" + + # reset extrude value to pre pause value + prepend_gcode +="G92 E%f\n" % (current_e) + + layer = prepend_gcode + layer + + # include a number of previous layers + for i in range(1, redo_layers + 1): + prevLayer = data[index-i] + layer = prevLayer + layer + + data[index] = layer #Override the data of this layer with the modified data + return data + break + return data diff --git a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py new file mode 100644 index 0000000000..68d697e470 --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py @@ -0,0 +1,56 @@ +# Copyright (c) 2017 Ruben Dulek +# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. + +import re #To perform the search and replace. + +from ..Script import Script + +## Performs a search-and-replace on all g-code. +# +# Due to technical limitations, the search can't cross the border between +# layers. +class SearchAndReplace(Script): + def getSettingDataString(self): + return """{ + "name": "Search and Replace", + "key": "SearchAndReplace", + "metadata": {}, + "version": 2, + "settings": + { + "search": + { + "label": "Search", + "description": "All occurrences of this text will get replaced by the replacement text.", + "type": "str", + "default_value": "" + }, + "replace": + { + "label": "Replace", + "description": "The search text will get replaced by this text.", + "type": "str", + "default_value": "" + }, + "is_regex": + { + "label": "Use Regular Expressions", + "description": "When enabled, the search text will be interpreted as a regular expression.", + "type": "bool", + "default_value": false + } + } + }""" + + def execute(self, data): + search_string = self.getSettingValueByKey("search") + if not self.getSettingValueByKey("is_regex"): + search_string = re.escape(search_string) #Need to search for the actual string, not as a regex. + search_regex = re.compile(search_string) + + replace_string = self.getSettingValueByKey("replace") + + for layer_number, layer in enumerate(data): + data[layer_number] = re.sub(search_regex, replace_string, layer) #Replace all. + + return data \ No newline at end of file diff --git a/plugins/PostProcessingPlugin/scripts/Stretch.py b/plugins/PostProcessingPlugin/scripts/Stretch.py new file mode 100644 index 0000000000..bcb923d3ff --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/Stretch.py @@ -0,0 +1,469 @@ +# This PostProcessingPlugin script is released under the terms of the AGPLv3 or higher. +""" +Copyright (c) 2017 Christophe Baribaud 2017 +Python implementation of https://github.com/electrocbd/post_stretch +Correction of hole sizes, cylinder diameters and curves +See the original description in https://github.com/electrocbd/post_stretch + +WARNING This script has never been tested with several extruders +""" +from ..Script import Script +import numpy as np +from UM.Logger import Logger +from UM.Application import Application +import re + +def _getValue(line, key, default=None): + """ + Convenience function that finds the value in a line of g-code. + When requesting key = x from line "G1 X100" the value 100 is returned. + It is a copy of Stript's method, so it is no DontRepeatYourself, but + I split the class into setup part (Stretch) and execution part (Strecher) + and only the setup part inherits from Script + """ + if not key in line or (";" in line and line.find(key) > line.find(";")): + return default + sub_part = line[line.find(key) + 1:] + number = re.search(r"^-?[0-9]+\.?[0-9]*", sub_part) + if number is None: + return default + return float(number.group(0)) + +class GCodeStep(): + """ + Class to store the current value of each G_Code parameter + for any G-Code step + """ + def __init__(self, step): + self.step = step + self.step_x = 0 + self.step_y = 0 + self.step_z = 0 + self.step_e = 0 + self.step_f = 0 + self.comment = "" + + def readStep(self, line): + """ + Reads gcode from line into self + """ + self.step_x = _getValue(line, "X", self.step_x) + self.step_y = _getValue(line, "Y", self.step_y) + self.step_z = _getValue(line, "Z", self.step_z) + self.step_e = _getValue(line, "E", self.step_e) + self.step_f = _getValue(line, "F", self.step_f) + return + + def copyPosFrom(self, step): + """ + Copies positions of step into self + """ + self.step_x = step.step_x + self.step_y = step.step_y + self.step_z = step.step_z + self.step_e = step.step_e + self.step_f = step.step_f + self.comment = step.comment + return + + +# Execution part of the stretch plugin +class Stretcher(): + """ + Execution part of the stretch algorithm + """ + def __init__(self, line_width, wc_stretch, pw_stretch): + self.line_width = line_width + self.wc_stretch = wc_stretch + self.pw_stretch = pw_stretch + if self.pw_stretch > line_width / 4: + self.pw_stretch = line_width / 4 # Limit value of pushwall stretch distance + self.outpos = GCodeStep(0) + self.vd1 = np.empty((0, 2)) # Start points of segments + # of already deposited material for current layer + self.vd2 = np.empty((0, 2)) # End points of segments + # of already deposited material for current layer + self.layer_z = 0 # Z position of the extrusion moves of the current layer + self.layergcode = "" + + def execute(self, data): + """ + Computes the new X and Y coordinates of all g-code steps + """ + Logger.log("d", "Post stretch with line width = " + str(self.line_width) + + "mm wide circle stretch = " + str(self.wc_stretch)+ "mm" + + "and push wall stretch = " + str(self.pw_stretch) + "mm") + retdata = [] + layer_steps = [] + current = GCodeStep(0) + self.layer_z = 0. + current_e = 0. + for layer in data: + lines = layer.rstrip("\n").split("\n") + for line in lines: + current.comment = "" + if line.find(";") >= 0: + current.comment = line[line.find(";"):] + if _getValue(line, "G") == 0: + current.readStep(line) + onestep = GCodeStep(0) + onestep.copyPosFrom(current) + elif _getValue(line, "G") == 1: + current.readStep(line) + onestep = GCodeStep(1) + onestep.copyPosFrom(current) + elif _getValue(line, "G") == 92: + current.readStep(line) + onestep = GCodeStep(-1) + onestep.copyPosFrom(current) + else: + onestep = GCodeStep(-1) + onestep.copyPosFrom(current) + onestep.comment = line + if line.find(";LAYER:") >= 0 and len(layer_steps): + # Previous plugin "forgot" to separate two layers... + Logger.log("d", "Layer Z " + "{:.3f}".format(self.layer_z) + + " " + str(len(layer_steps)) + " steps") + retdata.append(self.processLayer(layer_steps)) + layer_steps = [] + layer_steps.append(onestep) + # self.layer_z is the z position of the last extrusion move (not travel move) + if current.step_z != self.layer_z and current.step_e != current_e: + self.layer_z = current.step_z + current_e = current.step_e + if len(layer_steps): # Force a new item in the array + Logger.log("d", "Layer Z " + "{:.3f}".format(self.layer_z) + + " " + str(len(layer_steps)) + " steps") + retdata.append(self.processLayer(layer_steps)) + layer_steps = [] + retdata.append(";Wide circle stretch distance " + str(self.wc_stretch) + "\n") + retdata.append(";Push wall stretch distance " + str(self.pw_stretch) + "\n") + return retdata + + def extrusionBreak(self, layer_steps, i_pos): + """ + Returns true if the command layer_steps[i_pos] breaks the extruded filament + i.e. it is a travel move + """ + if i_pos == 0: + return True # Begining a layer always breaks filament (for simplicity) + step = layer_steps[i_pos] + prev_step = layer_steps[i_pos - 1] + if step.step_e != prev_step.step_e: + return False + delta_x = step.step_x - prev_step.step_x + delta_y = step.step_y - prev_step.step_y + if delta_x * delta_x + delta_y * delta_y < self.line_width * self.line_width / 4: + # This is a very short movement, less than 0.5 * line_width + # It does not break filament, we should stay in the same extrusion sequence + return False + return True # New sequence + + + def processLayer(self, layer_steps): + """ + Computes the new coordinates of g-code steps + for one layer (all the steps at the same Z coordinate) + """ + self.outpos.step_x = -1000 # Force output of X and Y coordinates + self.outpos.step_y = -1000 # at each start of layer + self.layergcode = "" + self.vd1 = np.empty((0, 2)) + self.vd2 = np.empty((0, 2)) + orig_seq = np.empty((0, 2)) + modif_seq = np.empty((0, 2)) + iflush = 0 + for i, step in enumerate(layer_steps): + if step.step == 0 or step.step == 1: + if self.extrusionBreak(layer_steps, i): + # No extrusion since the previous step, so it is a travel move + # Let process steps accumulated into orig_seq, + # which are a sequence of continuous extrusion + modif_seq = np.copy(orig_seq) + if len(orig_seq) >= 2: + self.workOnSequence(orig_seq, modif_seq) + self.generate(layer_steps, iflush, i, modif_seq) + iflush = i + orig_seq = np.empty((0, 2)) + orig_seq = np.concatenate([orig_seq, np.array([[step.step_x, step.step_y]])]) + if len(orig_seq): + modif_seq = np.copy(orig_seq) + if len(orig_seq) >= 2: + self.workOnSequence(orig_seq, modif_seq) + self.generate(layer_steps, iflush, len(layer_steps), modif_seq) + return self.layergcode + + def stepToGcode(self, onestep): + """ + Converts a step into G-Code + For each of the X, Y, Z, E and F parameter, + the parameter is written only if its value changed since the + previous g-code step. + """ + sout = "" + if onestep.step_f != self.outpos.step_f: + self.outpos.step_f = onestep.step_f + sout += " F{:.0f}".format(self.outpos.step_f).rstrip(".") + if onestep.step_x != self.outpos.step_x or onestep.step_y != self.outpos.step_y: + assert onestep.step_x >= -1000 and onestep.step_x < 1000 # If this assertion fails, + # something went really wrong ! + self.outpos.step_x = onestep.step_x + sout += " X{:.3f}".format(self.outpos.step_x).rstrip("0").rstrip(".") + assert onestep.step_y >= -1000 and onestep.step_y < 1000 # If this assertion fails, + # something went really wrong ! + self.outpos.step_y = onestep.step_y + sout += " Y{:.3f}".format(self.outpos.step_y).rstrip("0").rstrip(".") + if onestep.step_z != self.outpos.step_z or onestep.step_z != self.layer_z: + self.outpos.step_z = onestep.step_z + sout += " Z{:.3f}".format(self.outpos.step_z).rstrip("0").rstrip(".") + if onestep.step_e != self.outpos.step_e: + self.outpos.step_e = onestep.step_e + sout += " E{:.5f}".format(self.outpos.step_e).rstrip("0").rstrip(".") + return sout + + def generate(self, layer_steps, ibeg, iend, orig_seq): + """ + Appends g-code lines to the plugin's returned string + starting from step ibeg included and until step iend excluded + """ + ipos = 0 + for i in range(ibeg, iend): + if layer_steps[i].step == 0: + layer_steps[i].step_x = orig_seq[ipos][0] + layer_steps[i].step_y = orig_seq[ipos][1] + sout = "G0" + self.stepToGcode(layer_steps[i]) + self.layergcode = self.layergcode + sout + "\n" + ipos = ipos + 1 + elif layer_steps[i].step == 1: + layer_steps[i].step_x = orig_seq[ipos][0] + layer_steps[i].step_y = orig_seq[ipos][1] + sout = "G1" + self.stepToGcode(layer_steps[i]) + self.layergcode = self.layergcode + sout + "\n" + ipos = ipos + 1 + else: + self.layergcode = self.layergcode + layer_steps[i].comment + "\n" + + + def workOnSequence(self, orig_seq, modif_seq): + """ + Computes new coordinates for a sequence + A sequence is a list of consecutive g-code steps + of continuous material extrusion + """ + d_contact = self.line_width / 2.0 + if (len(orig_seq) > 2 and + ((orig_seq[len(orig_seq) - 1] - orig_seq[0]) ** 2).sum(0) < d_contact * d_contact): + # Starting and ending point of the sequence are nearby + # It is a closed loop + #self.layergcode = self.layergcode + ";wideCircle\n" + self.wideCircle(orig_seq, modif_seq) + else: + #self.layergcode = self.layergcode + ";wideTurn\n" + self.wideTurn(orig_seq, modif_seq) # It is an open curve + if len(orig_seq) > 6: # Don't try push wall on a short sequence + self.pushWall(orig_seq, modif_seq) + if len(orig_seq): + self.vd1 = np.concatenate([self.vd1, np.array(orig_seq[:-1])]) + self.vd2 = np.concatenate([self.vd2, np.array(orig_seq[1:])]) + + def wideCircle(self, orig_seq, modif_seq): + """ + Similar to wideTurn + The first and last point of the sequence are the same, + so it is possible to extend the end of the sequence + with its beginning when seeking for triangles + + It is necessary to find the direction of the curve, knowing three points (a triangle) + If the triangle is not wide enough, there is a huge risk of finding + an incorrect orientation, due to insufficient accuracy. + So, when the consecutive points are too close, the method + use following and preceding points to form a wider triangle around + the current point + dmin_tri is the minimum distance between two consecutive points + of an acceptable triangle + """ + dmin_tri = self.line_width / 2.0 + iextra_base = np.floor_divide(len(orig_seq), 3) # Nb of extra points + ibeg = 0 # Index of first point of the triangle + iend = 0 # Index of the third point of the triangle + for i, step in enumerate(orig_seq): + if i == 0 or i == len(orig_seq) - 1: + # First and last point of the sequence are the same, + # so it is necessary to skip one of these two points + # when creating a triangle containing the first or the last point + iextra = iextra_base + 1 + else: + iextra = iextra_base + # i is the index of the second point of the triangle + # pos_after is the array of positions of the original sequence + # after the current point + pos_after = np.resize(np.roll(orig_seq, -i-1, 0), (iextra, 2)) + # Vector of distances between the current point and each following point + dist_from_point = ((step - pos_after) ** 2).sum(1) + if np.amax(dist_from_point) < dmin_tri * dmin_tri: + continue + iend = np.argmax(dist_from_point >= dmin_tri * dmin_tri) + # pos_before is the array of positions of the original sequence + # before the current point + pos_before = np.resize(np.roll(orig_seq, -i, 0)[::-1], (iextra, 2)) + # This time, vector of distances between the current point and each preceding point + dist_from_point = ((step - pos_before) ** 2).sum(1) + if np.amax(dist_from_point) < dmin_tri * dmin_tri: + continue + ibeg = np.argmax(dist_from_point >= dmin_tri * dmin_tri) + # See https://github.com/electrocbd/post_stretch for explanations + # relpos is the relative position of the projection of the second point + # of the triangle on the segment from the first to the third point + # 0 means the position of the first point, 1 means the position of the third, + # intermediate values are positions between + length_base = ((pos_after[iend] - pos_before[ibeg]) ** 2).sum(0) + relpos = ((step - pos_before[ibeg]) + * (pos_after[iend] - pos_before[ibeg])).sum(0) + if np.fabs(relpos) < 1000.0 * np.fabs(length_base): + relpos /= length_base + else: + relpos = 0.5 # To avoid division by zero or precision loss + projection = (pos_before[ibeg] + relpos * (pos_after[iend] - pos_before[ibeg])) + dist_from_proj = np.sqrt(((projection - step) ** 2).sum(0)) + if dist_from_proj > 0.001: # Move central point only if points are not aligned + modif_seq[i] = (step - (self.wc_stretch / dist_from_proj) + * (projection - step)) + return + + def wideTurn(self, orig_seq, modif_seq): + ''' + We have to select three points in order to form a triangle + These three points should be far enough from each other to have + a reliable estimation of the orientation of the current turn + ''' + dmin_tri = self.line_width / 2.0 + ibeg = 0 + iend = 2 + for i in range(1, len(orig_seq) - 1): + dist_from_point = ((orig_seq[i] - orig_seq[i+1:]) ** 2).sum(1) + if np.amax(dist_from_point) < dmin_tri * dmin_tri: + continue + iend = i + 1 + np.argmax(dist_from_point >= dmin_tri * dmin_tri) + dist_from_point = ((orig_seq[i] - orig_seq[i-1::-1]) ** 2).sum(1) + if np.amax(dist_from_point) < dmin_tri * dmin_tri: + continue + ibeg = i - 1 - np.argmax(dist_from_point >= dmin_tri * dmin_tri) + length_base = ((orig_seq[iend] - orig_seq[ibeg]) ** 2).sum(0) + relpos = ((orig_seq[i] - orig_seq[ibeg]) * (orig_seq[iend] - orig_seq[ibeg])).sum(0) + if np.fabs(relpos) < 1000.0 * np.fabs(length_base): + relpos /= length_base + else: + relpos = 0.5 + projection = orig_seq[ibeg] + relpos * (orig_seq[iend] - orig_seq[ibeg]) + dist_from_proj = np.sqrt(((projection - orig_seq[i]) ** 2).sum(0)) + if dist_from_proj > 0.001: + modif_seq[i] = (orig_seq[i] - (self.wc_stretch / dist_from_proj) + * (projection - orig_seq[i])) + return + + def pushWall(self, orig_seq, modif_seq): + """ + The algorithm tests for each segment if material was + already deposited at one or the other side of this segment. + If material was deposited at one side but not both, + the segment is moved into the direction of the deposited material, + to "push the wall" + + Already deposited material is stored as segments. + vd1 is the array of the starting points of the segments + vd2 is the array of the ending points of the segments + For example, segment nr 8 starts at position self.vd1[8] + and ends at position self.vd2[8] + """ + dist_palp = self.line_width # Palpation distance to seek for a wall + mrot = np.array([[0, -1], [1, 0]]) # Rotation matrix for a quarter turn + for i in range(len(orig_seq)): + ibeg = i # Index of the first point of the segment + iend = i + 1 # Index of the last point of the segment + if iend == len(orig_seq): + iend = i - 1 + xperp = np.dot(mrot, orig_seq[iend] - orig_seq[ibeg]) + xperp = xperp / np.sqrt((xperp ** 2).sum(-1)) + testleft = orig_seq[ibeg] + xperp * dist_palp + materialleft = False # Is there already extruded material at the left of the segment + testright = orig_seq[ibeg] - xperp * dist_palp + materialright = False # Is there already extruded material at the right of the segment + if self.vd1.shape[0]: + relpos = np.clip(((testleft - self.vd1) * (self.vd2 - self.vd1)).sum(1) + / ((self.vd2 - self.vd1) * (self.vd2 - self.vd1)).sum(1), 0., 1.) + nearpoints = self.vd1 + relpos[:, np.newaxis] * (self.vd2 - self.vd1) + # nearpoints is the array of the nearest points of each segment + # from the point testleft + dist = ((testleft - nearpoints) * (testleft - nearpoints)).sum(1) + # dist is the array of the squares of the distances between testleft + # and each segment + if np.amin(dist) <= dist_palp * dist_palp: + materialleft = True + # Now the same computation with the point testright at the other side of the + # current segment + relpos = np.clip(((testright - self.vd1) * (self.vd2 - self.vd1)).sum(1) + / ((self.vd2 - self.vd1) * (self.vd2 - self.vd1)).sum(1), 0., 1.) + nearpoints = self.vd1 + relpos[:, np.newaxis] * (self.vd2 - self.vd1) + dist = ((testright - nearpoints) * (testright - nearpoints)).sum(1) + if np.amin(dist) <= dist_palp * dist_palp: + materialright = True + if materialleft and not materialright: + modif_seq[ibeg] = modif_seq[ibeg] + xperp * self.pw_stretch + elif not materialleft and materialright: + modif_seq[ibeg] = modif_seq[ibeg] - xperp * self.pw_stretch + if materialleft and materialright: + modif_seq[ibeg] = orig_seq[ibeg] # Surrounded by walls, don't move + +# Setup part of the stretch plugin +class Stretch(Script): + """ + Setup part of the stretch algorithm + The only parameter is the stretch distance + """ + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name":"Post stretch script", + "key": "Stretch", + "metadata": {}, + "version": 2, + "settings": + { + "wc_stretch": + { + "label": "Wide circle stretch distance", + "description": "Distance by which the points are moved by the correction effect in corners. The higher this value, the higher the effect", + "unit": "mm", + "type": "float", + "default_value": 0.08, + "minimum_value": 0, + "minimum_value_warning": 0, + "maximum_value_warning": 0.2 + }, + "pw_stretch": + { + "label": "Push Wall stretch distance", + "description": "Distance by which the points are moved by the correction effect when two lines are nearby. The higher this value, the higher the effect", + "unit": "mm", + "type": "float", + "default_value": 0.08, + "minimum_value": 0, + "minimum_value_warning": 0, + "maximum_value_warning": 0.2 + } + } + }""" + + def execute(self, data): + """ + Entry point of the plugin. + data is the list of original g-code instructions, + the returned string is the list of modified g-code instructions + """ + stretcher = Stretcher( + Application.getInstance().getGlobalContainerStack().getProperty("line_width", "value") + , self.getSettingValueByKey("wc_stretch"), self.getSettingValueByKey("pw_stretch")) + return stretcher.execute(data) + diff --git a/plugins/PostProcessingPlugin/scripts/TweakAtZ.py b/plugins/PostProcessingPlugin/scripts/TweakAtZ.py new file mode 100644 index 0000000000..7b714f6ee0 --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/TweakAtZ.py @@ -0,0 +1,495 @@ +# TweakAtZ script - Change printing parameters at a given height +# This script is the successor of the TweakAtZ plugin for legacy Cura. +# It contains code from the TweakAtZ plugin V1.0-V4.x and from the ExampleScript by Jaime van Kessel, Ultimaker B.V. +# It runs with the PostProcessingPlugin which is released under the terms of the AGPLv3 or higher. +# This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms + +#Authors of the TweakAtZ plugin / script: +# Written by Steven Morlock, smorloc@gmail.com +# Modified by Ricardo Gomez, ricardoga@otulook.com, to add Bed Temperature and make it work with Cura_13.06.04+ +# Modified by Stefan Heule, Dim3nsioneer@gmx.ch since V3.0 (see changelog below) +# Modified by Jaime van Kessel (Ultimaker), j.vankessel@ultimaker.com to make it work for 15.10 / 2.x +# Modified by Ruben Dulek (Ultimaker), r.dulek@ultimaker.com, to debug. + +##history / changelog: +##V3.0.1: TweakAtZ-state default 1 (i.e. the plugin works without any TweakAtZ comment) +##V3.1: Recognizes UltiGCode and deactivates value reset, fan speed added, alternatively layer no. to tweak at, +## extruder three temperature disabled by "#Ex3" +##V3.1.1: Bugfix reset flow rate +##V3.1.2: Bugfix disable TweakAtZ on Cool Head Lift +##V3.2: Flow rate for specific extruder added (only for 2 extruders), bugfix parser, +## added speed reset at the end of the print +##V4.0: Progress bar, tweaking over multiple layers, M605&M606 implemented, reset after one layer option, +## extruder three code removed, tweaking print speed, save call of Publisher class, +## uses previous value from other plugins also on UltiGCode +##V4.0.1: Bugfix for doubled G1 commands +##V4.0.2: uses Cura progress bar instead of its own +##V4.0.3: Bugfix for cool head lift (contributed by luisonoff) +##V4.9.91: First version for Cura 15.06.x and PostProcessingPlugin +##V4.9.92: Modifications for Cura 15.10 +##V4.9.93: Minor bugfixes (input settings) / documentation +##V4.9.94: Bugfix Combobox-selection; remove logger +##V5.0: Bugfix for fall back after one layer and doubled G0 commands when using print speed tweak, Initial version for Cura 2.x +##V5.0.1: Bugfix for calling unknown property 'bedTemp' of previous settings storage and unkown variable 'speed' +##V5.1: API Changes included for use with Cura 2.2 + +## Uses - +## M220 S - set speed factor override percentage +## M221 S - set flow factor override percentage +## M221 S T<0-#toolheads> - set flow factor override percentage for single extruder +## M104 S T<0-#toolheads> - set extruder to target temperature +## M140 S - set bed target temperature +## M106 S - set fan speed to target speed +## M605/606 to save and recall material settings on the UM2 + +from ..Script import Script +#from UM.Logger import Logger +import re + +class TweakAtZ(Script): + version = "5.1.1" + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name":"TweakAtZ """ + self.version + """ (Experimental)", + "key":"TweakAtZ", + "metadata": {}, + "version": 2, + "settings": + { + "a_trigger": + { + "label": "Trigger", + "description": "Trigger at height or at layer no.", + "type": "enum", + "options": {"height":"Height","layer_no":"Layer No."}, + "default_value": "height" + }, + "b_targetZ": + { + "label": "Tweak Height", + "description": "Z height to tweak at", + "unit": "mm", + "type": "float", + "default_value": 5.0, + "minimum_value": "0", + "minimum_value_warning": "0.1", + "maximum_value_warning": "230", + "enabled": "a_trigger == 'height'" + }, + "b_targetL": + { + "label": "Tweak Layer", + "description": "Layer no. to tweak at", + "unit": "", + "type": "int", + "default_value": 1, + "minimum_value": "-100", + "minimum_value_warning": "-1", + "enabled": "a_trigger == 'layer_no'" + }, + "c_behavior": + { + "label": "Behavior", + "description": "Select behavior: Tweak value and keep it for the rest, Tweak value for single layer only", + "type": "enum", + "options": {"keep_value":"Keep value","single_layer":"Single Layer"}, + "default_value": "keep_value" + }, + "d_twLayers": + { + "label": "No. Layers", + "description": "No. of layers used to tweak", + "unit": "", + "type": "int", + "default_value": 1, + "minimum_value": "1", + "maximum_value_warning": "50", + "enabled": "c_behavior == 'keep_value'" + }, + "e1_Tweak_speed": + { + "label": "Tweak Speed", + "description": "Select if total speed (print and travel) has to be tweaked", + "type": "bool", + "default_value": false + }, + "e2_speed": + { + "label": "Speed", + "description": "New total speed (print and travel)", + "unit": "%", + "type": "int", + "default_value": 100, + "minimum_value": "1", + "minimum_value_warning": "10", + "maximum_value_warning": "200", + "enabled": "e1_Tweak_speed" + }, + "f1_Tweak_printspeed": + { + "label": "Tweak Print Speed", + "description": "Select if print speed has to be tweaked", + "type": "bool", + "default_value": false + }, + "f2_printspeed": + { + "label": "Print Speed", + "description": "New print speed", + "unit": "%", + "type": "int", + "default_value": 100, + "minimum_value": "1", + "minimum_value_warning": "10", + "maximum_value_warning": "200", + "enabled": "f1_Tweak_printspeed" + }, + "g1_Tweak_flowrate": + { + "label": "Tweak Flow Rate", + "description": "Select if flow rate has to be tweaked", + "type": "bool", + "default_value": false + }, + "g2_flowrate": + { + "label": "Flow Rate", + "description": "New Flow rate", + "unit": "%", + "type": "int", + "default_value": 100, + "minimum_value": "1", + "minimum_value_warning": "10", + "maximum_value_warning": "200", + "enabled": "g1_Tweak_flowrate" + }, + "g3_Tweak_flowrateOne": + { + "label": "Tweak Flow Rate 1", + "description": "Select if first extruder flow rate has to be tweaked", + "type": "bool", + "default_value": false + }, + "g4_flowrateOne": + { + "label": "Flow Rate One", + "description": "New Flow rate Extruder 1", + "unit": "%", + "type": "int", + "default_value": 100, + "minimum_value": "1", + "minimum_value_warning": "10", + "maximum_value_warning": "200", + "enabled": "g3_Tweak_flowrateOne" + }, + "g5_Tweak_flowrateTwo": + { + "label": "Tweak Flow Rate 2", + "description": "Select if second extruder flow rate has to be tweaked", + "type": "bool", + "default_value": false + }, + "g6_flowrateTwo": + { + "label": "Flow Rate two", + "description": "New Flow rate Extruder 2", + "unit": "%", + "type": "int", + "default_value": 100, + "minimum_value": "1", + "minimum_value_warning": "10", + "maximum_value_warning": "200", + "enabled": "g5_Tweak_flowrateTwo" + }, + "h1_Tweak_bedTemp": + { + "label": "Tweak Bed Temp", + "description": "Select if Bed Temperature has to be tweaked", + "type": "bool", + "default_value": false + }, + "h2_bedTemp": + { + "label": "Bed Temp", + "description": "New Bed Temperature", + "unit": "C", + "type": "float", + "default_value": 60, + "minimum_value": "0", + "minimum_value_warning": "30", + "maximum_value_warning": "120", + "enabled": "h1_Tweak_bedTemp" + }, + "i1_Tweak_extruderOne": + { + "label": "Tweak Extruder 1 Temp", + "description": "Select if First Extruder Temperature has to be tweaked", + "type": "bool", + "default_value": false + }, + "i2_extruderOne": + { + "label": "Extruder 1 Temp", + "description": "New First Extruder Temperature", + "unit": "C", + "type": "float", + "default_value": 190, + "minimum_value": "0", + "minimum_value_warning": "160", + "maximum_value_warning": "250", + "enabled": "i1_Tweak_extruderOne" + }, + "i3_Tweak_extruderTwo": + { + "label": "Tweak Extruder 2 Temp", + "description": "Select if Second Extruder Temperature has to be tweaked", + "type": "bool", + "default_value": false + }, + "i4_extruderTwo": + { + "label": "Extruder 2 Temp", + "description": "New Second Extruder Temperature", + "unit": "C", + "type": "float", + "default_value": 190, + "minimum_value": "0", + "minimum_value_warning": "160", + "maximum_value_warning": "250", + "enabled": "i3_Tweak_extruderTwo" + }, + "j1_Tweak_fanSpeed": + { + "label": "Tweak Fan Speed", + "description": "Select if Fan Speed has to be tweaked", + "type": "bool", + "default_value": false + }, + "j2_fanSpeed": + { + "label": "Fan Speed", + "description": "New Fan Speed (0-255)", + "unit": "PWM", + "type": "int", + "default_value": 255, + "minimum_value": "0", + "minimum_value_warning": "15", + "maximum_value_warning": "255", + "enabled": "j1_Tweak_fanSpeed" + } + } + }""" + + def getValue(self, line, key, default = None): #replace default getvalue due to comment-reading feature + if not key in line or (";" in line and line.find(key) > line.find(";") and + not ";TweakAtZ" in key and not ";LAYER:" in key): + return default + subPart = line[line.find(key) + len(key):] #allows for string lengths larger than 1 + if ";TweakAtZ" in key: + m = re.search("^[0-4]", subPart) + elif ";LAYER:" in key: + m = re.search("^[+-]?[0-9]*", subPart) + else: + #the minus at the beginning allows for negative values, e.g. for delta printers + m = re.search("^[-]?[0-9]*\.?[0-9]*", subPart) + if m == None: + return default + try: + return float(m.group(0)) + except: + return default + + def execute(self, data): + #Check which tweaks should apply + TweakProp = {"speed": self.getSettingValueByKey("e1_Tweak_speed"), + "flowrate": self.getSettingValueByKey("g1_Tweak_flowrate"), + "flowrateOne": self.getSettingValueByKey("g3_Tweak_flowrateOne"), + "flowrateTwo": self.getSettingValueByKey("g5_Tweak_flowrateTwo"), + "bedTemp": self.getSettingValueByKey("h1_Tweak_bedTemp"), + "extruderOne": self.getSettingValueByKey("i1_Tweak_extruderOne"), + "extruderTwo": self.getSettingValueByKey("i3_Tweak_extruderTwo"), + "fanSpeed": self.getSettingValueByKey("j1_Tweak_fanSpeed")} + TweakPrintSpeed = self.getSettingValueByKey("f1_Tweak_printspeed") + TweakStrings = {"speed": "M220 S%f\n", + "flowrate": "M221 S%f\n", + "flowrateOne": "M221 T0 S%f\n", + "flowrateTwo": "M221 T1 S%f\n", + "bedTemp": "M140 S%f\n", + "extruderOne": "M104 S%f T0\n", + "extruderTwo": "M104 S%f T1\n", + "fanSpeed": "M106 S%d\n"} + target_values = {"speed": self.getSettingValueByKey("e2_speed"), + "printspeed": self.getSettingValueByKey("f2_printspeed"), + "flowrate": self.getSettingValueByKey("g2_flowrate"), + "flowrateOne": self.getSettingValueByKey("g4_flowrateOne"), + "flowrateTwo": self.getSettingValueByKey("g6_flowrateTwo"), + "bedTemp": self.getSettingValueByKey("h2_bedTemp"), + "extruderOne": self.getSettingValueByKey("i2_extruderOne"), + "extruderTwo": self.getSettingValueByKey("i4_extruderTwo"), + "fanSpeed": self.getSettingValueByKey("j2_fanSpeed")} + old = {"speed": -1, "flowrate": -1, "flowrateOne": -1, "flowrateTwo": -1, "platformTemp": -1, "extruderOne": -1, + "extruderTwo": -1, "bedTemp": -1, "fanSpeed": -1, "state": -1} + twLayers = self.getSettingValueByKey("d_twLayers") + if self.getSettingValueByKey("c_behavior") == "single_layer": + behavior = 1 + else: + behavior = 0 + try: + twLayers = max(int(twLayers),1) #for the case someone entered something as "funny" as -1 + except: + twLayers = 1 + pres_ext = 0 + done_layers = 0 + z = 0 + x = None + y = None + layer = -100000 #layer no. may be negative (raft) but never that low + # state 0: deactivated, state 1: activated, state 2: active, but below z, + # state 3: active and partially executed (multi layer), state 4: active and passed z + state = 1 + # IsUM2: Used for reset of values (ok for Marlin/Sprinter), + # has to be set to 1 for UltiGCode (work-around for missing default values) + IsUM2 = False + oldValueUnknown = False + TWinstances = 0 + + if self.getSettingValueByKey("a_trigger") == "layer_no": + targetL_i = int(self.getSettingValueByKey("b_targetL")) + targetZ = 100000 + else: + targetL_i = -100000 + targetZ = self.getSettingValueByKey("b_targetZ") + index = 0 + for active_layer in data: + modified_gcode = "" + lines = active_layer.split("\n") + for line in lines: + if ";Generated with Cura_SteamEngine" in line: + TWinstances += 1 + modified_gcode += ";TweakAtZ instances: %d\n" % TWinstances + if not ("M84" in line or "M25" in line or ("G1" in line and TweakPrintSpeed and (state==3 or state==4)) or + ";TweakAtZ instances:" in line): + modified_gcode += line + "\n" + IsUM2 = ("FLAVOR:UltiGCode" in line) or IsUM2 #Flavor is UltiGCode! + if ";TweakAtZ-state" in line: #checks for state change comment + state = self.getValue(line, ";TweakAtZ-state", state) + if ";TweakAtZ instances:" in line: + try: + tempTWi = int(line[20:]) + except: + tempTWi = TWinstances + TWinstances = tempTWi + if ";Small layer" in line: #checks for begin of Cool Head Lift + old["state"] = state + state = 0 + if ";LAYER:" in line: #new layer no. found + if state == 0: + state = old["state"] + layer = self.getValue(line, ";LAYER:", layer) + if targetL_i > -100000: #target selected by layer no. + if (state == 2 or targetL_i == 0) and layer == targetL_i: #determine targetZ from layer no.; checks for tweak on layer 0 + state = 2 + targetZ = z + 0.001 + if (self.getValue(line, "T", None) is not None) and (self.getValue(line, "M", None) is None): #looking for single T-cmd + pres_ext = self.getValue(line, "T", pres_ext) + if "M190" in line or "M140" in line and state < 3: #looking for bed temp, stops after target z is passed + old["bedTemp"] = self.getValue(line, "S", old["bedTemp"]) + if "M109" in line or "M104" in line and state < 3: #looking for extruder temp, stops after target z is passed + if self.getValue(line, "T", pres_ext) == 0: + old["extruderOne"] = self.getValue(line, "S", old["extruderOne"]) + elif self.getValue(line, "T", pres_ext) == 1: + old["extruderTwo"] = self.getValue(line, "S", old["extruderTwo"]) + if "M107" in line: #fan is stopped; is always updated in order not to miss switch off for next object + old["fanSpeed"] = 0 + if "M106" in line and state < 3: #looking for fan speed + old["fanSpeed"] = self.getValue(line, "S", old["fanSpeed"]) + if "M221" in line and state < 3: #looking for flow rate + tmp_extruder = self.getValue(line,"T",None) + if tmp_extruder == None: #check if extruder is specified + old["flowrate"] = self.getValue(line, "S", old["flowrate"]) + elif tmp_extruder == 0: #first extruder + old["flowrateOne"] = self.getValue(line, "S", old["flowrateOne"]) + elif tmp_extruder == 1: #second extruder + old["flowrateOne"] = self.getValue(line, "S", old["flowrateOne"]) + if ("M84" in line or "M25" in line): + if state>0 and TweakProp["speed"]: #"finish" commands for UM Original and UM2 + modified_gcode += "M220 S100 ; speed reset to 100% at the end of print\n" + modified_gcode += "M117 \n" + modified_gcode += line + "\n" + if "G1" in line or "G0" in line: + newZ = self.getValue(line, "Z", z) + x = self.getValue(line, "X", None) + y = self.getValue(line, "Y", None) + e = self.getValue(line, "E", None) + f = self.getValue(line, "F", None) + if 'G1' in line and TweakPrintSpeed and (state==3 or state==4): + # check for pure print movement in target range: + if x != None and y != None and f != None and e != None and newZ==z: + modified_gcode += "G1 F%d X%1.3f Y%1.3f E%1.5f\n" % (int(f / 100.0 * float(target_values["printspeed"])), self.getValue(line, "X"), + self.getValue(line, "Y"), self.getValue(line, "E")) + else: #G1 command but not a print movement + modified_gcode += line + "\n" + # no tweaking on retraction hops which have no x and y coordinate: + if (newZ != z) and (x is not None) and (y is not None): + z = newZ + if z < targetZ and state == 1: + state = 2 + if z >= targetZ and state == 2: + state = 3 + done_layers = 0 + for key in TweakProp: + if TweakProp[key] and old[key]==-1: #old value is not known + oldValueUnknown = True + if oldValueUnknown: #the tweaking has to happen within one layer + twLayers = 1 + if IsUM2: #Parameters have to be stored in the printer (UltiGCode=UM2) + modified_gcode += "M605 S%d;stores parameters before tweaking\n" % (TWinstances-1) + if behavior == 1: #single layer tweak only and then reset + twLayers = 1 + if TweakPrintSpeed and behavior == 0: + twLayers = done_layers + 1 + if state==3: + if twLayers-done_layers>0: #still layers to go? + if targetL_i > -100000: + modified_gcode += ";TweakAtZ V%s: executed at Layer %d\n" % (self.version,layer) + modified_gcode += "M117 Printing... tw@L%4d\n" % layer + else: + modified_gcode += (";TweakAtZ V%s: executed at %1.2f mm\n" % (self.version,z)) + modified_gcode += "M117 Printing... tw@%5.1f\n" % z + for key in TweakProp: + if TweakProp[key]: + modified_gcode += TweakStrings[key] % float(old[key]+(float(target_values[key])-float(old[key]))/float(twLayers)*float(done_layers+1)) + done_layers += 1 + else: + state = 4 + if behavior == 1: #reset values after one layer + if targetL_i > -100000: + modified_gcode += ";TweakAtZ V%s: reset on Layer %d\n" % (self.version,layer) + else: + modified_gcode += ";TweakAtZ V%s: reset at %1.2f mm\n" % (self.version,z) + if IsUM2 and oldValueUnknown: #executes on UM2 with Ultigcode and machine setting + modified_gcode += "M606 S%d;recalls saved settings\n" % (TWinstances-1) + else: #executes on RepRap, UM2 with Ultigcode and Cura setting + for key in TweakProp: + if TweakProp[key]: + modified_gcode += TweakStrings[key] % float(old[key]) + # re-activates the plugin if executed by pre-print G-command, resets settings: + if (z < targetZ or layer == 0) and state >= 3: #resets if below tweak level or at level 0 + state = 2 + done_layers = 0 + if targetL_i > -100000: + modified_gcode += ";TweakAtZ V%s: reset below Layer %d\n" % (self.version,targetL_i) + else: + modified_gcode += ";TweakAtZ V%s: reset below %1.2f mm\n" % (self.version,targetZ) + if IsUM2 and oldValueUnknown: #executes on UM2 with Ultigcode and machine setting + modified_gcode += "M606 S%d;recalls saved settings\n" % (TWinstances-1) + else: #executes on RepRap, UM2 with Ultigcode and Cura setting + for key in TweakProp: + if TweakProp[key]: + modified_gcode += TweakStrings[key] % float(old[key]) + data[index] = modified_gcode + index += 1 + return data From e3e6f301f9172c6bf811ac5ee432c277ba08deb2 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 9 Jan 2018 10:42:03 +0100 Subject: [PATCH 220/551] CURA-4778 Add up to 8 different colors when loading a GCode, since we support up to 8 extruders in CFP --- plugins/GCodeReader/FlavorParser.py | 8 +++++++- plugins/SimulationView/SimulationView.py | 2 +- plugins/SimulationView/SimulationView.qml | 1 - 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index c604ab1b6f..f63ba3ca69 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -418,9 +418,15 @@ class FlavorParser: self._layer_number += 1 current_path.clear() - material_color_map = numpy.zeros((10, 4), dtype = numpy.float32) + material_color_map = numpy.zeros((8, 4), dtype = numpy.float32) material_color_map[0, :] = [0.0, 0.7, 0.9, 1.0] material_color_map[1, :] = [0.7, 0.9, 0.0, 1.0] + material_color_map[2, :] = [0.9, 0.0, 0.7, 1.0] + material_color_map[3, :] = [0.7, 0.0, 0.0, 1.0] + material_color_map[4, :] = [0.0, 0.7, 0.0, 1.0] + material_color_map[5, :] = [0.0, 0.0, 0.7, 1.0] + material_color_map[6, :] = [0.3, 0.3, 0.3, 1.0] + material_color_map[7, :] = [0.7, 0.7, 0.7, 1.0] layer_mesh = self._layer_data_builder.build(material_color_map) decorator = LayerDataDecorator() decorator.setLayerData(layer_mesh) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 7a716d3b2b..f667aff998 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -104,7 +104,7 @@ class SimulationView(View): title = catalog.i18nc("@info:title", "Simulation View")) def _resetSettings(self): - self._layer_view_type = 0 # 0 is material color, 1 is color by linetype, 2 is speed + self._layer_view_type = 0 # 0 is material color, 1 is color by linetype, 2 is speed, 3 is layer thickness self._extruder_count = 0 self._extruder_opacity = [1.0, 1.0, 1.0, 1.0] self._show_travel_moves = 0 diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index 19ae81a6e3..11b985f77c 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -176,7 +176,6 @@ Item viewSettings.show_feedrate_gradient = viewSettings.show_gradient && (type_id == 2); viewSettings.show_thickness_gradient = viewSettings.show_gradient && (type_id == 3); } - } Label From 59d7cc663a45a59c8e03260357a394fc137221cf Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 10:36:00 +0100 Subject: [PATCH 221/551] Fix creating ExtruderStack for single-extrusion machine at runtime Move per-extruder settings from the machine's quality changes container to the extruder's quality changes container. --- cura/Settings/CuraContainerRegistry.py | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index a078240d80..394e83b977 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -515,6 +515,7 @@ class CuraContainerRegistry(ContainerRegistry): extruder_quality_changes_container = self.findInstanceContainers(name = machine.qualityChanges.getName(), extruder = extruder_id) if extruder_quality_changes_container: extruder_quality_changes_container = extruder_quality_changes_container[0] + quality_changes_id = extruder_quality_changes_container.getId() extruder_stack.setQualityChangesById(quality_changes_id) else: @@ -525,10 +526,36 @@ class CuraContainerRegistry(ContainerRegistry): if extruder_quality_changes_container: quality_changes_id = extruder_quality_changes_container.getId() extruder_stack.setQualityChangesById(quality_changes_id) + else: + # if we still cannot find a quality changes container for the extruder, create a new one + container_id = self.uniqueName(extruder_stack.getId() + "_user") + container_name = machine.qualityChanges.getName() + extruder_quality_changes_container = InstanceContainer(container_id) + extruder_quality_changes_container.setName(container_name) + extruder_quality_changes_container.addMetaDataEntry("type", "quality_changes") + extruder_quality_changes_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) + extruder_quality_changes_container.addMetaDataEntry("extruder", extruder_stack.definition.getId()) + extruder_quality_changes_container.addMetaDataEntry("quality_type", machine.qualityChanges.getMetaDataEntry("quality_type")) + extruder_quality_changes_container.setDefinition(machine.definition.getId()) if not extruder_quality_changes_container: Logger.log("w", "Could not find quality_changes named [%s] for extruder [%s]", machine.qualityChanges.getName(), extruder_stack.getId()) + else: + # move all per-extruder settings to the extruder's quality changes + for qc_setting_key in machine.qualityChanges.getAllKeys(): + settable_per_extruder = machine.getProperty(qc_setting_key, "settable_per_extruder") + if settable_per_extruder: + setting_value = machine.qualityChanges.getProperty(qc_setting_key, "value") + + setting_definition = machine.getSettingDefinition(qc_setting_key) + new_instance = SettingInstance(setting_definition, definition_changes) + new_instance.setProperty("value", setting_value) + new_instance.resetState() # Ensure that the state is not seen as a user state. + extruder_quality_changes_container.addInstance(new_instance) + extruder_quality_changes_container.setDirty(True) + + machine.qualityChanges.removeInstance(qc_setting_key, postpone_emit=True) else: extruder_stack.setQualityChangesById("empty_quality_changes") From 8e5167be762b1e383023ca788dd095eac1f90522 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 13:23:24 +0100 Subject: [PATCH 222/551] Use the same machine def for extruder quality changes containers --- 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 394e83b977..9a64f1421e 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -536,7 +536,7 @@ class CuraContainerRegistry(ContainerRegistry): extruder_quality_changes_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) extruder_quality_changes_container.addMetaDataEntry("extruder", extruder_stack.definition.getId()) extruder_quality_changes_container.addMetaDataEntry("quality_type", machine.qualityChanges.getMetaDataEntry("quality_type")) - extruder_quality_changes_container.setDefinition(machine.definition.getId()) + extruder_quality_changes_container.setDefinition(machine.qualityChanges.getDefinition().getId()) if not extruder_quality_changes_container: Logger.log("w", "Could not find quality_changes named [%s] for extruder [%s]", From c91eb30de9499e9e6cf813da66d5f65d7116f54b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 13:24:38 +0100 Subject: [PATCH 223/551] Skip loaded instance containers When trying to apply the fix for single extrusion machines by creating a new ExtruderStack, skip the quality changes container that has already been loaded. --- cura/Settings/CuraContainerRegistry.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 9a64f1421e..873876c30d 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -589,6 +589,9 @@ class CuraContainerRegistry(ContainerRegistry): if parser["general"]["name"] == name: # load the container container_id = os.path.basename(file_path).replace(".inst.cfg", "") + if self.findInstanceContainers(id = container_id): + # this container is already in the registry, skip it + continue instance_container = InstanceContainer(container_id) with open(file_path, "r") as f: From 78b9a14007d4bd83432b7d7643d2d9a4fbd122e0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 13:25:53 +0100 Subject: [PATCH 224/551] Fix all possible quality changes containers for single extrusion In the current fix, the quality changes that are applicable to the machine may not have been fixed yet because they are not active at that moment. This commit makes sure that for a single extrusion machine which has just been updated to have an ExtruderStack, all the quality changes containers that are applicable to this machine will be updated as well. --- cura/Settings/CuraContainerRegistry.py | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 873876c30d..564b83df6d 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -561,6 +561,45 @@ class CuraContainerRegistry(ContainerRegistry): self.addContainer(extruder_stack) + # Also need to fix the other qualities that are suitable for this machine. Those quality changes may still have + # per-extruder settings in the container for the machine instead of the extruder. + quality_changes_machine_definition_id = machine.qualityChanges.getDefinition().getId() + qcs = self.findInstanceContainers(type = "quality_changes", definition = quality_changes_machine_definition_id) + qc_groups = {} # map of qc names -> qc containers + for qc in qcs: + qc_name = qc.getName() + if qc_name not in qc_groups: + qc_groups[qc_name] = [] + qc_groups[qc_name].append(qc) + # try to find from the quality changes cura directory too + quality_changes_container = self._findQualityChangesContainerInCuraFolder(machine.qualityChanges.getName()) + if quality_changes_container: + qc_groups[qc_name].append(quality_changes_container) + + for qc_name, qc_list in qc_groups.items(): + qc_dict = {"global": None, "extruders": []} + for qc in qc_list: + extruder_def_id = qc.getMetaDataEntry("extruder") + if extruder_def_id is not None: + qc_dict["extruders"].append(qc) + else: + qc_dict["global"] = qc + if qc_dict["global"] is not None and len(qc_dict["extruders"]) == 1: + # move per-extruder settings + for qc_setting_key in qc_dict["global"].getAllKeys(): + settable_per_extruder = machine.getProperty(qc_setting_key, "settable_per_extruder") + if settable_per_extruder: + setting_value = qc_dict["global"].getProperty(qc_setting_key, "value") + + setting_definition = machine.getSettingDefinition(qc_setting_key) + new_instance = SettingInstance(setting_definition, definition_changes) + new_instance.setProperty("value", setting_value) + new_instance.resetState() # Ensure that the state is not seen as a user state. + qc_dict["extruders"][0].addInstance(new_instance) + qc_dict["extruders"][0].setDirty(True) + + qc_dict["global"].removeInstance(qc_setting_key, postpone_emit=True) + # Set next stack at the end extruder_stack.setNextStack(machine) From d31eaca1b7d1caeed1aba27c8b68ad07ea643b94 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 9 Jan 2018 13:35:42 +0100 Subject: [PATCH 225/551] CURA-4461 Add default buildplate temperature setting --- resources/definitions/fdmprinter.def.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 6eef6b1e9b..e042906014 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1981,14 +1981,28 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "default_material_bed_temperature": + { + "label": "Default Build Plate Temperature", + "description": "The default temperature used for the heated build plate. This should be the \"base\" temperature of a build plate. All other print temperatures should use offsets based on this value", + "resolve": "max(extruderValues('default_material_bed_temperature'))", + "default_value": 60, + "minimum_value": "-273.15", + "minimum_value_warning": "0", + "maximum_value_warning": "130", + "enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, "material_bed_temperature": { "label": "Build Plate Temperature", "description": "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted.", "unit": "°C", "type": "float", - "resolve": "max(extruderValues('material_bed_temperature'))", "default_value": 60, + "value": "default_material_bed_temperature", "minimum_value": "-273.15", "minimum_value_warning": "0", "maximum_value_warning": "130", From d633a4c11265394f6aaa67721f3dfd85221907b8 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 9 Jan 2018 13:38:41 +0100 Subject: [PATCH 226/551] Fix: cura does not profile form G-code CURA-4776 --- cura/Settings/CuraContainerRegistry.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index a078240d80..15168af0a4 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -202,7 +202,6 @@ class CuraContainerRegistry(ContainerRegistry): for plugin_id, meta_data in self._getIOPlugins("profile_reader"): if meta_data["profile_reader"][0]["extension"] != extension: continue - profile_reader = plugin_registry.getPluginObject(plugin_id) try: profile_or_list = profile_reader.read(file_name) # Try to open the file with the profile reader. @@ -215,6 +214,20 @@ class CuraContainerRegistry(ContainerRegistry): name_seed = os.path.splitext(os.path.basename(file_name))[0] new_name = self.uniqueName(name_seed) + # if the loaded profile comes from g-code then the instance cointaners should be + # defined differently + file_extension = os.path.splitext(file_name)[1][1:] + if file_extension == "gcode": + for item in profile_or_list: + item.metaData["name"] = new_name + + if item.getMetaDataEntry("extruder") is None: + temp_defintion = item.getMetaDataEntry("definition") + item.metaData["id"] = temp_defintion + "_" + new_name + elif item.getMetaDataEntry("extruder") is not None: + temp_extruder = item.getMetaDataEntry("extruder") + item.metaData["id"] = temp_extruder + "_" + new_name + # Ensure it is always a list of profiles if type(profile_or_list) is not list: profile_or_list = [profile_or_list] From 5936ebaa80636dc7d2189f47d6426685151cabb6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 9 Jan 2018 13:48:20 +0100 Subject: [PATCH 227/551] Fix another case of scene node checking by subclass, related to CURA-4780 --- cura/OneAtATimeIterator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/OneAtATimeIterator.py b/cura/OneAtATimeIterator.py index 44f8d2766a..755680e62f 100644 --- a/cura/OneAtATimeIterator.py +++ b/cura/OneAtATimeIterator.py @@ -18,7 +18,7 @@ class OneAtATimeIterator(Iterator.Iterator): def _fillStack(self): node_list = [] for node in self._scene_node.getChildren(): - if not type(node) is SceneNode: + if not issubclass(type(node), SceneNode): continue if node.callDecoration("getConvexHull"): From 342bdda64125251fc7ecc426c791bbe2a864eed3 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 9 Jan 2018 13:54:01 +0100 Subject: [PATCH 228/551] CURA-4461 Add missing keys --- resources/definitions/fdmprinter.def.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index e042906014..61bccbce59 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1985,6 +1985,8 @@ { "label": "Default Build Plate Temperature", "description": "The default temperature used for the heated build plate. This should be the \"base\" temperature of a build plate. All other print temperatures should use offsets based on this value", + "unit": "°C", + "type": "float", "resolve": "max(extruderValues('default_material_bed_temperature'))", "default_value": 60, "minimum_value": "-273.15", From 33f0e8cb6559cd17721883473f112a507ae1a136 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 13:58:04 +0100 Subject: [PATCH 229/551] Use isinstance() to check if a node is a SceneNode CURA-4780 --- cura/OneAtATimeIterator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/OneAtATimeIterator.py b/cura/OneAtATimeIterator.py index 755680e62f..5653c8f1fb 100644 --- a/cura/OneAtATimeIterator.py +++ b/cura/OneAtATimeIterator.py @@ -18,7 +18,7 @@ class OneAtATimeIterator(Iterator.Iterator): def _fillStack(self): node_list = [] for node in self._scene_node.getChildren(): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if node.callDecoration("getConvexHull"): From dcf02137adc8476c0adf77795873abc6991e4c90 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 9 Jan 2018 14:53:16 +0100 Subject: [PATCH 230/551] Fixed connecting for clean machine CL-541 --- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index 003fdbf95c..0e58d8e991 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -29,13 +29,7 @@ Cura.MachineAction function connectToPrinter() { - if(base.selectedDevice) - { - var deviceKey = base.selectedDevice.key - manager.setKey(deviceKey); - completed(); - } - if(base.selectedPrinter && base.completeProperties) + if(base.selectedDevice && base.completeProperties) { var printerKey = base.selectedDevice.key if(manager.getStoredKey() != printerKey) From becb0cf7b9edaf4a0324a1e36d571f8bb6e8e2f2 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 9 Jan 2018 15:42:10 +0100 Subject: [PATCH 231/551] CURA-4461 Add dropdown menu in the UI for selecting the buildplate if the printer has different buildplates. --- cura/Settings/MachineManager.py | 21 ++++- .../XmlMaterialProfile/XmlMaterialProfile.py | 2 +- resources/qml/Menus/BuildplateMenu.qml | 87 +++++++++++++++++++ resources/qml/SidebarHeader.qml | 42 ++++++++- 4 files changed, 149 insertions(+), 3 deletions(-) create mode 100644 resources/qml/Menus/BuildplateMenu.qml diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 05aed1f5e2..7662eb64d6 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -844,6 +844,11 @@ class MachineManager(QObject): else: Logger.log("w", "While trying to set the active variant, no variant was found to replace.") + @pyqtSlot(str) + def setActiveVariantBuildplate(self, variant_buildplate_id: str): + Logger.log("d", "Attempting to change the active buildplate to %s", variant_buildplate_id) + pass + ## set the active quality # \param quality_id The quality_id of either a quality or a quality_changes @pyqtSlot(str) @@ -1105,6 +1110,15 @@ class MachineManager(QObject): return "" + @pyqtProperty(str, notify = activeVariantChanged) + def activeVariantBuildplateName(self) -> str: + if self._global_container_stack: + variant = self._global_container_stack.variant + if variant: + return variant.getName() + + return "" + @pyqtProperty(str, notify = globalContainerChanged) def activeDefinitionId(self) -> str: if self._global_container_stack: @@ -1202,7 +1216,6 @@ class MachineManager(QObject): def hasMaterials(self) -> bool: if self._global_container_stack: return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_materials", False)) - return False @pyqtProperty(bool, notify = globalContainerChanged) @@ -1211,6 +1224,12 @@ class MachineManager(QObject): return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_variants", False)) return False + @pyqtProperty(bool, notify = globalContainerChanged) + def hasVariantBuildplates(self) -> bool: + if self._global_container_stack: + return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_variant_buildplates", False)) + return False + ## Property to indicate if a machine has "specialized" material profiles. # Some machines have their own material profiles that "override" the default catch all profiles. @pyqtProperty(bool, notify = globalContainerChanged) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 125fe1e344..8e3c25bb23 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -874,7 +874,7 @@ class XmlMaterialProfile(InstanceContainer): # Map XML file setting names to internal names __material_settings_setting_map = { "print temperature": "default_material_print_temperature", - "heated bed temperature": "material_bed_temperature", + "heated bed temperature": "default_material_bed_temperature", "standby temperature": "material_standby_temperature", "processing temperature graph": "material_flow_temp_graph", "print cooling": "cool_fan_speed", diff --git a/resources/qml/Menus/BuildplateMenu.qml b/resources/qml/Menus/BuildplateMenu.qml new file mode 100644 index 0000000000..756126f60a --- /dev/null +++ b/resources/qml/Menus/BuildplateMenu.qml @@ -0,0 +1,87 @@ +// Copyright (c) 2018 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Menu +{ + id: menu + title: "Build plate" + + property int buildplateIndex: 0 + property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 + property bool isClusterPrinter: + { + if(Cura.MachineManager.printerOutputDevices.length == 0) + { + return false; + } + var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize; + // This is not a cluster printer or the cluster it is just one printer + if(clusterSize == undefined || clusterSize == 1) + { + return false; + } + return true; + } + +// MenuItem +// { +// id: automaticBuildplate +// text: +// { +// if(printerConnected && Cura.MachineManager.buildplateIds.length > buildplateIndex && !isClusterPrinter) +// { +// var buildplateName = Cura.MachineManager.buildplateIds[buildplateIndex] +// return catalog.i18nc("@title:menuitem %1 is the buildplate currently loaded in the printer", "Automatic: %1").arg(buildplateName) +// } +// return "" +// } +// visible: printerConnected && Cura.MachineManager.buildplateIds.length > buildplateIndex && !isClusterPrinter +// onTriggered: +// { +// var buildplateId = Cura.MachineManager.buildplateIds[buildplateIndex] +// var itemIndex = buildplateInstantiator.model.find("name", buildplateId); +// if(itemIndex > -1) +// { +// Cura.MachineManager.setActiveVariantBuildplate(buildplateInstantiator.model.getItem(itemIndex).id); +// } +// } +// } +// +// MenuSeparator +// { +// visible: automaticBuildplate.visible +// } + + Instantiator + { + id: buildplateInstantiator + model: UM.InstanceContainersModel + { + filter: + { + "type": "variant", + "definition": Cura.MachineManager.activeQualityDefinitionId //Only show variants of this machine + } + } + MenuItem { + text: model.name + checkable: true + checked: model.id == Cura.MachineManager.buildplateIds[buildplateIndex] + exclusiveGroup: group + onTriggered: + { + Cura.MachineManager.setActiveVariantBuildplate(model.id); + } + } + onObjectAdded: menu.insertItem(index, object) + onObjectRemoved: menu.removeItem(object) + } + + ExclusiveGroup { id: group } +} diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 3e1e85824a..4ddd3c7ace 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -279,7 +279,7 @@ Column { id: variantRow height: UM.Theme.getSize("sidebar_setup").height - visible: Cura.MachineManager.hasVariants && !sidebar.monitoringPrint && !sidebar.hideSettings + visible: Cura.MachineManager.hasBuildPlateVariant && !sidebar.monitoringPrint && !sidebar.hideSettings anchors { @@ -314,6 +314,46 @@ Column } } + //Buildplate row + Item + { + id: buildplateRow + height: UM.Theme.getSize("sidebar_setup").height + visible: Cura.MachineManager.hasVariantBuildplates && !sidebar.monitoringPrint && !sidebar.hideSettings + + anchors + { + left: parent.left + leftMargin: UM.Theme.getSize("sidebar_margin").width + right: parent.right + rightMargin: UM.Theme.getSize("sidebar_margin").width + } + + Label + { + id: bulidplateLabel + text: catalog.i18nc("@label","Buildplate"); + width: Math.floor(parent.width * 0.45 - UM.Theme.getSize("default_margin").width) + font: UM.Theme.getFont("default"); + color: UM.Theme.getColor("text"); + } + + ToolButton { + id: buildplateSelection + text: Cura.MachineManager.activeVariantBuildplateName + tooltip: Cura.MachineManager.activeVariantBuildplateName + visible: Cura.MachineManager.hasVariantBuildplates + + height: UM.Theme.getSize("setting_control").height + width: Math.floor(parent.width * 0.7 + UM.Theme.getSize("sidebar_margin").width) + anchors.right: parent.right + style: UM.Theme.styles.sidebar_header_button + activeFocusOnPress: true; + + menu: BuildplateMenu + } + } + // Material info row Item { From f9286d4bd59a29ec6c33d3345d5c7c18db53027d Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 9 Jan 2018 15:50:32 +0100 Subject: [PATCH 232/551] Fix color swatch not being updated after color selection change - CURA-4774 --- resources/qml/Preferences/MaterialView.qml | 48 +++++++++++++++------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index 311150c6b9..c3f36f5125 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -104,14 +104,13 @@ TabView Label { width: scrollView.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Color") } - Row - { - width: scrollView.columnWidth; - height: parent.rowHeight; + Row { + width: scrollView.columnWidth + height: parent.rowHeight spacing: Math.floor(UM.Theme.getSize("default_margin").width/2) - Rectangle - { + // color indicator square + Rectangle { id: colorSelector color: properties.color_code @@ -121,17 +120,36 @@ TabView anchors.verticalCenter: parent.verticalCenter - MouseArea { anchors.fill: parent; onClicked: colorDialog.open(); enabled: base.editingEnabled } + // open the color selection dialog on click + MouseArea { + anchors.fill: parent + onClicked: colorDialog.open() + enabled: base.editingEnabled + } } - ReadOnlyTextField - { + + // make sure the color stays connected after changing the color + Binding { + target: colorSelector + property: "color" + value: properties.color_code + } + + // pretty color name text field + ReadOnlyTextField { id: colorLabel; text: properties.color_name; readOnly: !base.editingEnabled onEditingFinished: base.setMetaDataEntry("color_name", properties.color_name, text) } - ColorDialog { id: colorDialog; color: properties.color_code; onAccepted: base.setMetaDataEntry("color_code", properties.color_code, color) } + // popup dialog to select a new color + // if successful it sets the properties.color_code value to the new color + ColorDialog { + id: colorDialog + color: properties.color_code + onAccepted: base.setMetaDataEntry("color_code", properties.color_code, color) + } } Item { width: parent.width; height: UM.Theme.getSize("default_margin").height } @@ -401,11 +419,11 @@ TabView } // Tiny convenience function to check if a value really changed before trying to set it. - function setMetaDataEntry(entry_name, old_value, new_value) - { - if(old_value != new_value) - { - Cura.ContainerManager.setContainerMetaDataEntry(base.containerId, entry_name, new_value); + function setMetaDataEntry(entry_name, old_value, new_value) { + if (old_value != new_value) { + Cura.ContainerManager.setContainerMetaDataEntry(base.containerId, entry_name, new_value) + // make sure the UI properties are updated as well since we don't re-fetch the entire model here + properties[entry_name] = new_value } } From 2613b4d1a37090e868346c9f7566913835135885 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 9 Jan 2018 16:08:30 +0100 Subject: [PATCH 233/551] CURA-4461 Add menu item for build plates --- resources/qml/Cura.qml | 1 + resources/qml/Menus/BuildplateMenu.qml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index c130cf041b..760cd9c6a6 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -204,6 +204,7 @@ UM.MainWindow onObjectRemoved: settingsMenu.removeItem(object) } + BuildplateMenu { title: catalog.i18nc("@title:menu", "&Build plate"); visible: Cura.MachineManager.hasVariantBuildplates } NozzleMenu { title: Cura.MachineManager.activeDefinitionVariantsName; visible: machineExtruderCount.properties.value <= 1 && Cura.MachineManager.hasVariants } MaterialMenu { title: catalog.i18nc("@title:menu", "&Material"); visible: machineExtruderCount.properties.value <= 1 && Cura.MachineManager.hasMaterials } ProfileMenu { title: catalog.i18nc("@title:menu", "&Profile"); visible: machineExtruderCount.properties.value <= 1 } diff --git a/resources/qml/Menus/BuildplateMenu.qml b/resources/qml/Menus/BuildplateMenu.qml index 756126f60a..10e248aaed 100644 --- a/resources/qml/Menus/BuildplateMenu.qml +++ b/resources/qml/Menus/BuildplateMenu.qml @@ -66,7 +66,7 @@ Menu filter: { "type": "variant", - "definition": Cura.MachineManager.activeQualityDefinitionId //Only show variants of this machine + "definition": Cura.MachineManager.activeDefinitionId //Only show variants of this machine } } MenuItem { From 3de4940d6952a4a6c3c0934e5d7836996b7bd31f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 9 Jan 2018 16:19:29 +0100 Subject: [PATCH 234/551] Simplify creating, duplicating materials in preferences, extract logic to python, code-style fixes --- cura/Settings/ContainerManager.py | 16 +++ resources/qml/Preferences/MaterialsPage.qml | 104 ++++++++------------ 2 files changed, 58 insertions(+), 62 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 209e1ec8fd..eefc109cbc 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -816,6 +816,22 @@ class ContainerManager(QObject): ContainerRegistry.getInstance().addContainer(container_to_add) return self._getMaterialContainerIdForActiveMachine(clone_of_original) + ## Create a duplicate of a material or it's original entry + # + # \return \type{str} the id of the newly created container. + @pyqtSlot(str, result = str) + def duplicateOriginalMaterial(self, material_id): + + # check if the given material has a base file (i.e. was shipped by default) + base_file = self.getContainerMetaDataEntry(material_id, "base_file") + + if base_file == "": + # there is no base file, so duplicate by ID + return self.duplicateMaterial(material_id) + else: + # there is a base file, so duplicate the original material + return self.duplicateMaterial(base_file) + ## Create a new material by cloning Generic PLA for the current material diameter and setting the GUID to something unqiue # # \return \type{str} the id of the newly created container. diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index 81c1bd711a..228f9c8ea2 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -132,93 +132,73 @@ UM.ManagementPage } buttons: [ - Button - { - text: catalog.i18nc("@action:button", "Activate"); + + // Activate button + Button { + text: catalog.i18nc("@action:button", "Activate") iconName: "list-activate"; enabled: base.currentItem != null && base.currentItem.id != Cura.MachineManager.activeMaterialId && Cura.MachineManager.hasMaterials - onClicked: - { - forceActiveFocus(); + onClicked: { + forceActiveFocus() Cura.MachineManager.setActiveMaterial(base.currentItem.id) currentItem = base.model.getItem(base.objectList.currentIndex) // Refresh the current item. } }, - Button - { + + // Create button + Button { text: catalog.i18nc("@action:button", "Create") iconName: "list-add" - onClicked: - { - forceActiveFocus(); - var material_id = Cura.ContainerManager.createMaterial() - if(material_id == "") - { - return - } - if(Cura.MachineManager.hasMaterials) - { - Cura.MachineManager.setActiveMaterial(material_id) - } - base.objectList.currentIndex = base.getIndexById(material_id); + onClicked: { + forceActiveFocus() + Cura.ContainerManager.createMaterial() } }, - Button - { + + // Duplicate button + Button { text: catalog.i18nc("@action:button", "Duplicate"); iconName: "list-add"; 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) - if(material_id == "") - { - return - } - if(Cura.MachineManager.hasMaterials) - { - Cura.MachineManager.setActiveMaterial(material_id) - } - // TODO: this doesn't work because the source is a bit delayed - base.objectList.currentIndex = base.getIndexById(material_id); + onClicked: { + forceActiveFocus() + Cura.ContainerManager.duplicateOriginalMaterial(base.currentItem.id) } }, - Button - { - text: catalog.i18nc("@action:button", "Remove"); - iconName: "list-remove"; + + // Remove button + Button { + text: catalog.i18nc("@action:button", "Remove") + iconName: "list-remove" enabled: base.currentItem != null && !base.currentItem.readOnly && !Cura.ContainerManager.isContainerUsed(base.currentItem.id) - onClicked: - { - forceActiveFocus(); - confirmDialog.open(); + onClicked: { + forceActiveFocus() + confirmDialog.open() } }, - Button - { - text: catalog.i18nc("@action:button", "Import"); - iconName: "document-import"; - onClicked: - { - forceActiveFocus(); - importDialog.open(); + + // Import button + Button { + text: catalog.i18nc("@action:button", "Import") + iconName: "document-import" + onClicked: { + forceActiveFocus() + importDialog.open() } - visible: true; + visible: true }, - Button - { + + // Export button + Button { text: catalog.i18nc("@action:button", "Export") iconName: "document-export" - onClicked: - { - forceActiveFocus(); - exportDialog.open(); + onClicked: { + forceActiveFocus() + exportDialog.open() } enabled: currentItem != null } + ] Item { From 93599de64239644ea8a86434d5f2bbafa2b47873 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 17:02:39 +0100 Subject: [PATCH 235/551] Update current index in material dialog CURA-4774 There is a delay so we update the current index when the model gets changed. --- resources/qml/Preferences/MaterialsPage.qml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index 228f9c8ea2..6b041b895a 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -153,6 +153,15 @@ UM.ManagementPage forceActiveFocus() Cura.ContainerManager.createMaterial() } + + Connections + { + target: base.objectList.model + onItemsChanged: + { + base.objectList.currentIndex = base.getIndexById(Cura.MachineManager.activeMaterialId); + } + } }, // Duplicate button From 30870c5ef2187557c53d133e6953d944ae64f098 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 17:34:53 +0100 Subject: [PATCH 236/551] Refactor skip reset setting CURA-4760 --- .../PerObjectSettingVisibilityHandler.py | 10 ++++++---- .../PerObjectSettingsTool/PerObjectSettingsPanel.qml | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index c7e4deaaa7..3e1df1c7b8 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -22,7 +22,9 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand self._selected_object_id = None self._node = None self._stack = None - self._skip_setting = None + + # this is a set of settings that will be skipped if the user chooses to reset. + self._skip_reset_setting_set = set() def setSelectedObjectId(self, id): if id != self._selected_object_id: @@ -39,8 +41,8 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand return self._selected_object_id @pyqtSlot(str) - def setSkipSetting(self, setting_name): - self._skip_setting = setting_name + def addSkipResetSetting(self, setting_name): + self._skip_reset_setting_set.add(setting_name) def setVisible(self, visible): if not self._node: @@ -57,7 +59,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand # Remove all instances that are not in visibility list for instance in all_instances: # exceptionally skip setting - if self._skip_setting is not None and self._skip_setting == instance.definition.key: + if instance.definition.key in self._skip_reset_setting_set: continue if instance.definition.key not in visible: settings.removeInstance(instance.definition.key) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 2b7b6cd541..10760b9039 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -324,8 +324,8 @@ Item { // force updating the model to sync it with addedSettingsModel if(visible) { - // Set skip setting, it will prevent from restting selected mesh_type - contents.model.visibilityHandler.setSkipSetting(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type) + // Set skip setting, it will prevent from resetting selected mesh_type + contents.model.visibilityHandler.addSkipResetSetting(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type) listview.model.forceUpdate() } } From 2ce73a18397b0d0440a85a10d017c5568953d1b3 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 10 Jan 2018 00:07:43 +0100 Subject: [PATCH 237/551] Fix updating icon in the top bar This makes sure events such as onAcceptsCommandsChanges get connected if an outputdevice has been added before the monitorstage is initialized. --- plugins/MonitorStage/MonitorStage.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index b5a38dad70..1a999ca896 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -77,6 +77,7 @@ class MonitorStage(CuraStage): def _onEngineCreated(self): # We can only connect now, as we need to be sure that everything is loaded (plugins get created quite early) Application.getInstance().getMachineManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) + self._onOutputDevicesChanged() self._updateMainOverlay() self._updateSidebar() self._updateIconSource() From 3f341a34c62cd2125afa1385e40b6af25b5dad7a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 10 Jan 2018 08:15:00 +0100 Subject: [PATCH 238/551] Fix gcode job sending issue in gcode_dict refactoring --- .../NetworkClusterPrinterOutputDevice.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index 6665380f45..9289981d64 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -80,6 +80,8 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._print_view = None self._request_job = [] + self._job_list = [] + self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterMonitorItem.qml") self._control_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterControlItem.qml") @@ -281,14 +283,11 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte def sendPrintJob(self): nodes, file_name, filter_by_machine, file_handler, kwargs = self._request_job output_build_plate_number = self._job_list.pop(0) - gcode_dict = getattr(Application.getInstance().getController().getScene(), "gcode_dict")[output_build_plate_number] - if not gcode_dict: # Empty build plate + gcode_list = getattr(Application.getInstance().getController().getScene(), "gcode_dict")[output_build_plate_number] + if not gcode_list: # Empty build plate Logger.log("d", "Skipping empty job (build plate number %d).", output_build_plate_number) return self.sendPrintJob() - active_build_plate_id = Application.getInstance().getBuildPlateModel().activeBuildPlate - gcode_list = gcode_dict[active_build_plate_id] - self._send_gcode_start = time.time() Logger.log("d", "Sending print job [%s] to host, build plate [%s]..." % (file_name, output_build_plate_number)) From 91cccedf750ad2307e849af596fd778668610b54 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 10 Jan 2018 08:54:13 +0100 Subject: [PATCH 239/551] Fix upgrading quality changes for single extrusion machines --- cura/Settings/CuraContainerRegistry.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index a7119c55b7..6db33931bd 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -576,7 +576,19 @@ class CuraContainerRegistry(ContainerRegistry): # Also need to fix the other qualities that are suitable for this machine. Those quality changes may still have # per-extruder settings in the container for the machine instead of the extruder. - quality_changes_machine_definition_id = machine.qualityChanges.getDefinition().getId() + if machine.qualityChanges.getId() not in ("empty", "empty_quality_changes"): + quality_changes_machine_definition_id = machine.qualityChanges.getDefinition().getId() + else: + whole_machine_definition = machine.definition + machine_entry = machine.definition.getMetaDataEntry("machine") + if machine_entry is not None: + container_registry = ContainerRegistry.getInstance() + whole_machine_definition = container_registry.findDefinitionContainers(id = machine_entry)[0] + + quality_changes_machine_definition_id = "fdmprinter" + if whole_machine_definition.getMetaDataEntry("has_machine_quality"): + quality_changes_machine_definition_id = machine.definition.getMetaDataEntry("quality_definition", + whole_machine_definition.getId()) qcs = self.findInstanceContainers(type = "quality_changes", definition = quality_changes_machine_definition_id) qc_groups = {} # map of qc names -> qc containers for qc in qcs: From 4801ace5464e2accf1db6a4d62323d3a158e271a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 10 Jan 2018 08:58:51 +0100 Subject: [PATCH 240/551] Fix monoprice select mini v2 definition CURA-4655 --- resources/definitions/monoprice_select_mini_v2.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/monoprice_select_mini_v2.def.json b/resources/definitions/monoprice_select_mini_v2.def.json index a935cb5a73..87014c136b 100644 --- a/resources/definitions/monoprice_select_mini_v2.def.json +++ b/resources/definitions/monoprice_select_mini_v2.def.json @@ -20,6 +20,6 @@ "retraction_combing": { "default_value": "noskin" }, "retraction_amount" : { "default_value": 2.5}, "retraction_speed" : { "default_value": 40}, - "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" } } } From b295d915f82667646d6c6c954013899cd029c28d Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 11:08:32 +0100 Subject: [PATCH 241/551] Fix line support_infill_rate / support_line_distance for support meshes without generating any support. CURA-4777 --- 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 6eef6b1e9b..22b7992d64 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3633,7 +3633,7 @@ "minimum_value": "0", "maximum_value_warning": "100", "default_value": 15, - "value": "15 if support_enable else 0", + "value": "15 if support_enable else 0 if support_tree_enable else 15", "enabled": "support_enable or support_tree_enable", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, From fd86cc84e2377134a317f7f9221b1f8e86a1ff1f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 10 Jan 2018 11:17:26 +0100 Subject: [PATCH 242/551] check if parent exists before using width and height properties from it --- plugins/MonitorStage/MonitorMainView.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/MonitorStage/MonitorMainView.qml b/plugins/MonitorStage/MonitorMainView.qml index 15b05bed0a..c48f6d0aab 100644 --- a/plugins/MonitorStage/MonitorMainView.qml +++ b/plugins/MonitorStage/MonitorMainView.qml @@ -8,8 +8,9 @@ import Cura 1.0 as Cura Item { - width: parent.width - height: parent.height + // parent could be undefined as this component is not visible at all times + width: parent ? parent.width : 0 + height: parent ? parent.height : 0 // We show a nice overlay on the 3D viewer when the current output device has no monitor view Rectangle From 95361bbeb200bbbffa4296fb53f4a635f98ae89b Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 10 Jan 2018 11:19:19 +0100 Subject: [PATCH 243/551] Refactoring: profile from Gcode CURA-4776 --- cura/Settings/CuraContainerRegistry.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index a7119c55b7..b882902ed7 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -214,19 +214,7 @@ class CuraContainerRegistry(ContainerRegistry): name_seed = os.path.splitext(os.path.basename(file_name))[0] new_name = self.uniqueName(name_seed) - # if the loaded profile comes from g-code then the instance cointaners should be - # defined differently - file_extension = os.path.splitext(file_name)[1][1:] - if file_extension == "gcode": - for item in profile_or_list: - item.metaData["name"] = new_name - if item.getMetaDataEntry("extruder") is None: - temp_defintion = item.getMetaDataEntry("definition") - item.metaData["id"] = temp_defintion + "_" + new_name - elif item.getMetaDataEntry("extruder") is not None: - temp_extruder = item.getMetaDataEntry("extruder") - item.metaData["id"] = temp_extruder + "_" + new_name # Ensure it is always a list of profiles if type(profile_or_list) is not list: @@ -250,6 +238,16 @@ class CuraContainerRegistry(ContainerRegistry): else: #More extruders in the imported file than in the machine. continue #Delete the additional profiles. + # if the loaded profile comes from g-code then the instance containers should be + # defined differently + if extension == "gcode": + if profile.getMetaDataEntry("extruder") is None: + temp_defintion = profile.getMetaDataEntry("definition") + profile.metaData["id"] = (temp_defintion + "_" + new_name).lower() + elif profile.getMetaDataEntry("extruder") is not None: # be sure that extruder data exist + temp_extruder = profile.getMetaDataEntry("extruder") + profile.metaData["id"] = (temp_extruder + "_" + new_name).lower() + result = self._configureProfile(profile, profile_id, new_name) if result is not None: return {"status": "error", "message": catalog.i18nc( From fd46f6968bb5ea11e71eff71e0ac8f68f9f4473e Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 10 Jan 2018 11:42:43 +0100 Subject: [PATCH 244/551] CURA-4461 Show nozzles and buildplates separately depending on the hardware_type metadata in variants --- resources/qml/Menus/BuildplateMenu.qml | 4 ++-- resources/qml/Menus/NozzleMenu.qml | 13 +++++++++++-- resources/qml/SidebarHeader.qml | 8 ++++---- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/resources/qml/Menus/BuildplateMenu.qml b/resources/qml/Menus/BuildplateMenu.qml index 10e248aaed..c379992386 100644 --- a/resources/qml/Menus/BuildplateMenu.qml +++ b/resources/qml/Menus/BuildplateMenu.qml @@ -12,7 +12,6 @@ Menu id: menu title: "Build plate" - property int buildplateIndex: 0 property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool isClusterPrinter: { @@ -66,13 +65,14 @@ Menu filter: { "type": "variant", + "hardware_type": "buildplate", "definition": Cura.MachineManager.activeDefinitionId //Only show variants of this machine } } MenuItem { text: model.name checkable: true - checked: model.id == Cura.MachineManager.buildplateIds[buildplateIndex] +// checked: model.id == Cura.MachineManager.buildplateIds[buildplateIndex] exclusiveGroup: group onTriggered: { diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml index f70e639872..cc3ea66b07 100644 --- a/resources/qml/Menus/NozzleMenu.qml +++ b/resources/qml/Menus/NozzleMenu.qml @@ -68,8 +68,17 @@ Menu { filter: { - "type": "variant", - "definition": Cura.MachineManager.activeQualityDefinitionId //Only show variants of this machine + var filter_dict = + { + "type": "variant", + "definition": Cura.MachineManager.activeQualityDefinitionId //Only show variants of this machine + } + if (Cura.MachineManager.hasVariantBuildplates) + { + filter_dict["hardware_type"] = "nozzle" + } + + return filter_dict } } MenuItem { diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 4ddd3c7ace..e66da9da5e 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -242,7 +242,7 @@ Column Label { id: materialLabel - text: catalog.i18nc("@label","Material"); + text: catalog.i18nc("@label", "Material"); width: Math.floor(parent.width * 0.45 - UM.Theme.getSize("default_margin").width) font: UM.Theme.getFont("default"); color: UM.Theme.getColor("text"); @@ -279,7 +279,7 @@ Column { id: variantRow height: UM.Theme.getSize("sidebar_setup").height - visible: Cura.MachineManager.hasBuildPlateVariant && !sidebar.monitoringPrint && !sidebar.hideSettings + visible: Cura.MachineManager.hasVariants && !sidebar.monitoringPrint && !sidebar.hideSettings anchors { @@ -332,7 +332,7 @@ Column Label { id: bulidplateLabel - text: catalog.i18nc("@label","Buildplate"); + text: catalog.i18nc("@label", "Build plate"); width: Math.floor(parent.width * 0.45 - UM.Theme.getSize("default_margin").width) font: UM.Theme.getFont("default"); color: UM.Theme.getColor("text"); @@ -350,7 +350,7 @@ Column style: UM.Theme.styles.sidebar_header_button activeFocusOnPress: true; - menu: BuildplateMenu + menu: BuildplateMenu {} } } From cea9f359cdc4ec97d4e551535d0b435ba9c8f7c0 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 10 Jan 2018 14:05:38 +0100 Subject: [PATCH 245/551] CURA-4461 Set active buildplate in the global container stack when is changed in the UI. Add a new setting for distinguish between types of build plates. --- cura/Settings/MachineManager.py | 38 +++++++++++++++++++++-- resources/definitions/fdmprinter.def.json | 15 +++++++++ resources/qml/Menus/BuildplateMenu.qml | 5 ++- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 7662eb64d6..8ec8a5923f 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -50,6 +50,7 @@ class MachineManager(QObject): # Used to store the new containers until after confirming the dialog self._new_variant_container = None + self._new_buildplate_container = None self._new_material_container = None self._new_quality_containers = [] @@ -158,6 +159,10 @@ class MachineManager(QObject): def newVariant(self): return self._new_variant_container + @property + def newBuildplate(self): + return self._new_buildplate_container + @property def newMaterial(self): return self._new_material_container @@ -664,6 +669,14 @@ class MachineManager(QObject): return quality.getId() return "" + @pyqtProperty(str, notify=activeVariantChanged) + def globalVariantId(self) -> str: + if self._global_container_stack: + variant = self._global_container_stack.variant + if variant and not isinstance(variant, type(self._empty_variant_container)): + return variant.getId() + return "" + @pyqtProperty(str, notify = activeQualityChanged) def activeQualityType(self) -> str: if self._active_container_stack: @@ -846,8 +859,24 @@ class MachineManager(QObject): @pyqtSlot(str) def setActiveVariantBuildplate(self, variant_buildplate_id: str): - Logger.log("d", "Attempting to change the active buildplate to %s", variant_buildplate_id) - pass + with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): + containers = ContainerRegistry.getInstance().findInstanceContainers(id = variant_buildplate_id) + if not containers or not self._global_container_stack: + return + Logger.log("d", "Attempting to change the active buildplate to %s", variant_buildplate_id) + old_buildplate = self._global_container_stack.variant + old_material = self._active_container_stack.material + if old_buildplate: + self.blurSettings.emit() + self._new_buildplate_container = containers[0] # self._active_container_stack will be updated with a delay + Logger.log("d", "Active buildplate changed to {active_variant_buildplate_id}".format(active_variant_buildplate_id = containers[0].getId())) + preferred_material_name = None + if old_material: + preferred_material_name = old_material.getName() + preferred_material_id = self._updateMaterialContainer(self._global_container_stack.definition, self._global_container_stack, containers[0], preferred_material_name).id + self.setActiveMaterial(preferred_material_id) + else: + Logger.log("w", "While trying to set the active buildplate, no buildplate was found to replace.") ## set the active quality # \param quality_id The quality_id of either a quality or a quality_changes @@ -926,6 +955,10 @@ class MachineManager(QObject): self._active_container_stack.variant = self._new_variant_container self._new_variant_container = None + if self._new_buildplate_container is not None: + self._global_container_stack.variant = self._new_buildplate_container + self._new_buildplate_container = None + if self._new_material_container is not None: self._active_container_stack.material = self._new_material_container self._new_material_container = None @@ -946,6 +979,7 @@ class MachineManager(QObject): # Used for ignoring any changes when switching between printers (setActiveMachine) def _cancelDelayedActiveContainerStackChanges(self): self._new_material_container = None + self._new_buildplate_container = None self._new_variant_container = None ## Determine the quality and quality changes settings for the current machine for a quality name. diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 61bccbce59..c61f950978 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -154,6 +154,21 @@ "settable_per_extruder": false, "settable_per_meshgroup": false }, + "machine_buildplate_type": + { + "label": "Build Plate Material", + "description": "The material of the build plate installed on the printer.", + "default_value": "glass", + "type": "enum", + "options": + { + "glass": "Glass", + "aluminium": "Aluminium" + }, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, "machine_height": { "label": "Machine Height", diff --git a/resources/qml/Menus/BuildplateMenu.qml b/resources/qml/Menus/BuildplateMenu.qml index c379992386..8807e834ac 100644 --- a/resources/qml/Menus/BuildplateMenu.qml +++ b/resources/qml/Menus/BuildplateMenu.qml @@ -12,6 +12,7 @@ Menu id: menu title: "Build plate" + property int extruderIndex: 0 property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool isClusterPrinter: { @@ -72,10 +73,12 @@ Menu MenuItem { text: model.name checkable: true -// checked: model.id == Cura.MachineManager.buildplateIds[buildplateIndex] + checked: model.id == Cura.MachineManager.globalVariantId exclusiveGroup: group onTriggered: { + print("Cura.MachineManager.activeDefinitionId", Cura.MachineManager.activeDefinitionId) + print("Cura.MachineManager.allActiveVariantIds[Cura.MachineManager.activeDefinitionId]", JSON.stringify(Cura.MachineManager.globalVariantId)) Cura.MachineManager.setActiveVariantBuildplate(model.id); } } From 80aaad83e115ef4308bc633de08fc778effec214 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 14:12:21 +0100 Subject: [PATCH 246/551] CURA-4525 fix manual slice slicing more than one build plate at a time --- plugins/CuraEngineBackend/CuraEngineBackend.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index c612e889a4..fa5f4dde4d 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -238,6 +238,8 @@ class CuraEngineBackend(QObject, Backend): self._slicing = True self.slicingStarted.emit() + self.determineAutoSlicing() # Switch timer on or off if appropriate + slice_message = self._socket.createMessage("cura.proto.Slice") self._start_slice_job = StartSliceJob.StartSliceJob(slice_message) self._start_slice_job_build_plate = build_plate_to_be_sliced @@ -584,6 +586,7 @@ class CuraEngineBackend(QObject, Backend): # Somehow this results in an Arcus Error # self.slice() # Testing call slice again, allow backend to restart by using the timer + self.enableTimer() # manually enable timer to be able to invoke slice, also when in manual slice mode self._invokeSlice() ## Called when a g-code message is received from the engine. From 686ac2292d85dc38c826de0c230f2cb784d94e73 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 14:13:18 +0100 Subject: [PATCH 247/551] CURA-4525 CURA-4772 fix gcode not overlapping thoughout build plates --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index be9c3f73f0..c1fc597d80 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -4,7 +4,6 @@ import gc from UM.Job import Job -from UM.Scene.SceneNode import SceneNode from UM.Application import Application from UM.Mesh.MeshData import MeshData from UM.Preferences import Preferences @@ -17,6 +16,7 @@ from UM.Logger import Logger from UM.Math.Vector import Vector from cura.Scene.BuildPlateDecorator import BuildPlateDecorator +from cura.Scene.CuraSceneNode import CuraSceneNode from cura.Settings.ExtruderManager import ExtruderManager from cura import LayerDataBuilder from cura import LayerDataDecorator @@ -81,7 +81,7 @@ class ProcessSlicedLayersJob(Job): Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged) - new_node = SceneNode() + new_node = CuraSceneNode() new_node.addDecorator(BuildPlateDecorator(self._build_plate_number)) # Force garbage collection. From dab0ebd2084649c2b4348caed7c70b6a7013848e Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 14:25:09 +0100 Subject: [PATCH 248/551] CURA-4525 fix saving empty gcode giving error --- plugins/GCodeWriter/GCodeWriter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index f0e5c88f37..95c48c4d9e 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -64,8 +64,8 @@ class GCodeWriter(MeshWriter): gcode_dict = getattr(scene, "gcode_dict") if not gcode_dict: return False - gcode_list = gcode_dict.get(active_build_plate) - if gcode_list: + gcode_list = gcode_dict.get(active_build_plate, None) + if gcode_list is not None: for gcode in gcode_list: stream.write(gcode) # Serialise the current container stack and put it at the end of the file. From 0fdb470ec7eb3fa1766326ceb4ef1eb8fd3b298a Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 14:39:26 +0100 Subject: [PATCH 249/551] CURA-4525 only try to slice next build plate if there are actually build plates to slice --- plugins/CuraEngineBackend/CuraEngineBackend.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index fa5f4dde4d..41522b34f2 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -585,9 +585,10 @@ class CuraEngineBackend(QObject, Backend): Logger.log("d", "See if there is more to slice...") # Somehow this results in an Arcus Error # self.slice() - # Testing call slice again, allow backend to restart by using the timer - self.enableTimer() # manually enable timer to be able to invoke slice, also when in manual slice mode - self._invokeSlice() + # Call slice again using the timer, allowing the backend to restart + if self._build_plates_to_be_sliced: + self.enableTimer() # manually enable timer to be able to invoke slice, also when in manual slice mode + self._invokeSlice() ## Called when a g-code message is received from the engine. # From 0abb2e0d55fa3b626f98b7d607845188f1966ecc Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 10 Jan 2018 15:00:12 +0100 Subject: [PATCH 250/551] CURA-4461 When reading instance containers, just allow a variant in the global stack if it is a buildplate. --- cura/Settings/MachineManager.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 8ec8a5923f..9f14dd471b 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -303,10 +303,11 @@ class MachineManager(QObject): self._global_container_stack.containersChanged.connect(self._onInstanceContainersChanged) self._global_container_stack.propertyChanged.connect(self._onPropertyChanged) - # set the global variant to empty as we now use the extruder stack at all times - CURA-4482 + # Global stack can have only a variant if it is a buildplate global_variant = self._global_container_stack.variant if global_variant != self._empty_variant_container: - self._global_container_stack.setVariant(self._empty_variant_container) + if global_variant.getMetaDataEntry("hardware_type") != "buildplate": + self._global_container_stack.setVariant(self._empty_variant_container) # set the global material to empty as we now use the extruder stack at all times - CURA-4482 global_material = self._global_container_stack.material @@ -865,16 +866,10 @@ class MachineManager(QObject): return Logger.log("d", "Attempting to change the active buildplate to %s", variant_buildplate_id) old_buildplate = self._global_container_stack.variant - old_material = self._active_container_stack.material if old_buildplate: self.blurSettings.emit() self._new_buildplate_container = containers[0] # self._active_container_stack will be updated with a delay Logger.log("d", "Active buildplate changed to {active_variant_buildplate_id}".format(active_variant_buildplate_id = containers[0].getId())) - preferred_material_name = None - if old_material: - preferred_material_name = old_material.getName() - preferred_material_id = self._updateMaterialContainer(self._global_container_stack.definition, self._global_container_stack, containers[0], preferred_material_name).id - self.setActiveMaterial(preferred_material_id) else: Logger.log("w", "While trying to set the active buildplate, no buildplate was found to replace.") From 6262003069ebfd2eb56889eaaf1596301e0c8250 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 16:01:26 +0100 Subject: [PATCH 251/551] CURA-4525 reset the print information for build plates that are marked for slicing --- cura/PrintInformation.py | 3 ++- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 60d3c11a49..838628e37c 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -11,6 +11,7 @@ from UM.Preferences import Preferences from UM.Settings.ContainerRegistry import ContainerRegistry from cura.Settings.ExtruderManager import ExtruderManager +from typing import Dict import math import os.path @@ -177,7 +178,7 @@ class PrintInformation(QObject): self._material_amounts = material_amounts self._calculateInformation(build_plate_number) - def _updateTotalPrintTimePerFeature(self, build_plate_number, print_time): + def _updateTotalPrintTimePerFeature(self, build_plate_number, print_time: Dict[str, int]): total_estimated_time = 0 if build_plate_number not in self._print_time_message_values: diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 41522b34f2..61950b4677 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -444,6 +444,7 @@ class CuraEngineBackend(QObject, Backend): return build_plate_changed.add(source_build_plate_number) + self.printDurationMessage.emit(source_build_plate_number, {}, []) build_plate_changed.discard(None) build_plate_changed.discard(-1) # object not on build plate From ff10af905cf70f23769f9f5d0aec2f9d9d538ffa Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 10 Jan 2018 16:04:30 +0100 Subject: [PATCH 252/551] CURA-4461 Add code to set the default preferred buildplate when adding a new machine that has different buildplates. --- cura/Settings/CuraContainerStack.py | 45 +++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 8e13b24358..d194080778 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -435,6 +435,51 @@ class CuraContainerStack(ContainerStack): Logger.log("w", "Could not find a valid default variant for stack {stack}", stack = self.id) return None + ## Find the global variant that should be used as "default". This is used for the buildplates. + # + # This will search for variants that match the current definition and pick the preferred one, + # if specified by the machine definition. + # + # The following criteria are used to find the default global variant: + # - If the machine definition does not have a metadata entry "has_variant_buildplates" set to True, return None + # - The definition of the variant should be the same as the machine definition for this stack. + # - The container should have a metadata entry "type" with value "variant" and "hardware_type" with value "buildplate". + # - If the machine definition has a metadata entry "preferred_variant_buildplate", filter the variant IDs based on that. + # + # \return The container that should be used as default, or None if nothing was found or the machine does not use variants. + # + # \note This method assumes the stack has a valid machine definition. + def findDefaultVariantBuildplate(self) -> Optional[ContainerInterface]: + definition = self._getMachineDefinition() + # has_variant_buildplates can be overridden in other containers and stacks. + # In the case of UM2, it is overridden in the GlobalStack + if not self.getMetaDataEntry("has_variant_buildplates"): + # If the machine does not use variants, we should never set a variant. + return None + + # First add any variant. Later, overwrite with preference if the preference is valid. + variant = None + definition_id = self._findInstanceContainerDefinitionId(definition) + variants = ContainerRegistry.getInstance().findInstanceContainers(definition = definition_id, type = "variant", hardware_type = "buildplate") + if variants: + variant = variants[0] + + preferred_variant_buildplate_id = definition.getMetaDataEntry("preferred_variant_buildplate") + if preferred_variant_buildplate_id: + preferred_variant_buildplates = ContainerRegistry.getInstance().findInstanceContainers(id = preferred_variant_buildplate_id, definition = definition_id, type = "variant") + if preferred_variant_buildplates: + variant = preferred_variant_buildplates[0] + else: + Logger.log("w", "The preferred variant buildplate \"{variant}\" of stack {stack} does not exist or is not a variant.", + variant = preferred_variant_buildplate_id, stack = self.id) + # And leave it at the default variant. + + if variant: + return variant + + Logger.log("w", "Could not find a valid default buildplate variant for stack {stack}", stack = self.id) + return None + ## Find the material that should be used as "default" material. # # This will search for materials that match the current definition and pick the preferred one, From d91a2e1ca36ba2ef0311cfd31ed7c75058c8d1be Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 16:04:56 +0100 Subject: [PATCH 253/551] CURA-4525 move reset print information to a better place to prevent it sending info of non existent build plates --- plugins/CuraEngineBackend/CuraEngineBackend.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 61950b4677..e8c830b901 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -444,7 +444,6 @@ class CuraEngineBackend(QObject, Backend): return build_plate_changed.add(source_build_plate_number) - self.printDurationMessage.emit(source_build_plate_number, {}, []) build_plate_changed.discard(None) build_plate_changed.discard(-1) # object not on build plate @@ -461,6 +460,7 @@ class CuraEngineBackend(QObject, Backend): for build_plate_number in build_plate_changed: if build_plate_number not in self._build_plates_to_be_sliced: self._build_plates_to_be_sliced.append(build_plate_number) + self.printDurationMessage.emit(source_build_plate_number, {}, []) self.processingProgress.emit(0.0) self.backendStateChange.emit(BackendState.NotStarted) # if not self._use_timer: @@ -523,7 +523,7 @@ class CuraEngineBackend(QObject, Backend): def _onStackErrorCheckFinished(self): self._is_error_check_scheduled = False - if not self._slicing and self._build_plates_to_be_sliced: #self._need_slicing: + if not self._slicing and self._build_plates_to_be_sliced: self.needsSlicing() self._onChanged() From 665c0a81f40959e39530b895b892937b97023bd4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 10 Jan 2018 16:29:36 +0100 Subject: [PATCH 254/551] Removed wrong comment --- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 126dbbbde3..786b97d034 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -115,7 +115,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._not_authenticated_message.hide() self._requestAuthentication() - pass # Cura Connect doesn't do any authorization def connect(self): super().connect() From 78b42afbcb0eb8673544ca7b75f42855178f875d Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 10 Jan 2018 16:40:58 +0100 Subject: [PATCH 255/551] CURA-4776 Add unique id to the profiles so user can import the same profile several times with different names.It also fixes the issue for importing profiles from GCode. --- cura/Settings/CuraContainerRegistry.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index a0e2abd0b6..9202e57285 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -214,8 +214,6 @@ class CuraContainerRegistry(ContainerRegistry): name_seed = os.path.splitext(os.path.basename(file_name))[0] new_name = self.uniqueName(name_seed) - - # Ensure it is always a list of profiles if type(profile_or_list) is not list: profile_or_list = [profile_or_list] @@ -238,16 +236,6 @@ class CuraContainerRegistry(ContainerRegistry): else: #More extruders in the imported file than in the machine. continue #Delete the additional profiles. - # if the loaded profile comes from g-code then the instance containers should be - # defined differently - if extension == "gcode": - if profile.getMetaDataEntry("extruder") is None: - temp_defintion = profile.getMetaDataEntry("definition") - profile.metaData["id"] = (temp_defintion + "_" + new_name).lower() - elif profile.getMetaDataEntry("extruder") is not None: # be sure that extruder data exist - temp_extruder = profile.getMetaDataEntry("extruder") - profile.metaData["id"] = (temp_extruder + "_" + new_name).lower() - result = self._configureProfile(profile, profile_id, new_name) if result is not None: return {"status": "error", "message": catalog.i18nc( @@ -280,6 +268,10 @@ class CuraContainerRegistry(ContainerRegistry): profile._id = new_id profile.setName(new_name) + # Set the unique Id to the profile, so it's generating a new one even if the user imports the same profile + # It also solves an issue with importing profiles from G-Codes + profile.setMetaDataEntry("id", new_id) + if "type" in profile.getMetaData(): profile.setMetaDataEntry("type", "quality_changes") else: From 10320b7f2e5aba93849075ce2d333e2cff68adcd Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 10 Jan 2018 17:05:22 +0100 Subject: [PATCH 256/551] CURA-4461 Remove debug outputs --- resources/qml/Menus/BuildplateMenu.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/qml/Menus/BuildplateMenu.qml b/resources/qml/Menus/BuildplateMenu.qml index 8807e834ac..89a5e6df77 100644 --- a/resources/qml/Menus/BuildplateMenu.qml +++ b/resources/qml/Menus/BuildplateMenu.qml @@ -77,8 +77,6 @@ Menu exclusiveGroup: group onTriggered: { - print("Cura.MachineManager.activeDefinitionId", Cura.MachineManager.activeDefinitionId) - print("Cura.MachineManager.allActiveVariantIds[Cura.MachineManager.activeDefinitionId]", JSON.stringify(Cura.MachineManager.globalVariantId)) Cura.MachineManager.setActiveVariantBuildplate(model.id); } } From 702d7dd3a838fa0bfe0f7aa152d376bc1cb46054 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 11 Jan 2018 08:23:17 +0100 Subject: [PATCH 257/551] Fix model importing with multi build plate CURA-4782 --- cura/CuraApplication.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index dfb78cd3b2..30fd461868 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1479,7 +1479,14 @@ class CuraApplication(QtApplication): # Step is for skipping tests to make it a lot faster. it also makes the outcome somewhat rougher node, _ = arranger.findNodePlacement(node, offset_shape_arr, hull_shape_arr, step = 10) - node.addDecorator(BuildPlateDecorator(target_build_plate)) + # This node is deepcopied from some other node which already has a BuildPlateDecorator, but the deepcopy + # of BuildPlateDecorator produces one that's assoicated with build plate -1. So, here we need to check if + # the BuildPlateDecorator exists or not and always set the correct build plate number. + build_plate_decorator = node.getDecorator(BuildPlateDecorator) + if build_plate_decorator is None: + build_plate_decorator = BuildPlateDecorator(target_build_plate) + node.addDecorator(build_plate_decorator) + build_plate_decorator.setBuildPlateNumber(target_build_plate) op = AddSceneNodeOperation(node, scene.getRoot()) op.push() From 3a01a407cf0689927b8ee1b970b16ffdfc70dbdf Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 11 Jan 2018 09:16:11 +0100 Subject: [PATCH 258/551] CURA-4461 Set default variant builplate when the new printer is added --- 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 d194080778..ff1e3fdd76 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -199,7 +199,7 @@ class CuraContainerStack(ContainerStack): def setVariantById(self, new_variant_id: str) -> None: variant = self._empty_variant if new_variant_id == "default": - new_variant = self.findDefaultVariant() + new_variant = self.findDefaultVariantBuildplate() if self.getMetaDataEntry("type") == "machine" else self.findDefaultVariant() if new_variant: variant = new_variant else: From b9a99d46922ff52214b7012ed8dea50a89d8524b Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 11 Jan 2018 09:33:07 +0100 Subject: [PATCH 259/551] CURA-4525 fix placement on load to only avoid objects on current build plate --- cura/CuraActions.py | 2 +- cura/CuraApplication.py | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 2474e218e8..f5aace805b 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -73,7 +73,7 @@ class CuraActions(QObject): # \param count The number of times to multiply the selection. @pyqtSlot(int) def multiplySelection(self, count: int) -> None: - job = MultiplyObjectsJob(Selection.getAllSelectedObjects(), count, 8) + job = MultiplyObjectsJob(Selection.getAllSelectedObjects(), count, min_offset = 8) job.start() ## Delete all selected objects. diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index dfb78cd3b2..a2ce5c322c 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1421,16 +1421,20 @@ class CuraApplication(QtApplication): filename = job.getFileName() self._currently_loading_files.remove(filename) - root = self.getController().getScene().getRoot() - arranger = Arrange.create(scene_root = root) - min_offset = 8 - self.fileLoaded.emit(filename) arrange_objects_on_load = ( not Preferences.getInstance().getValue("cura/use_multi_build_plate") or not Preferences.getInstance().getValue("cura/not_arrange_objects_on_load")) target_build_plate = self.getBuildPlateModel().activeBuildPlate if arrange_objects_on_load else -1 + root = self.getController().getScene().getRoot() + fixed_nodes = [] + for node_ in DepthFirstIterator(root): + if node_.callDecoration("isSliceable") and node_.callDecoration("getBuildPlateNumber") == target_build_plate: + fixed_nodes.append(node_) + arranger = Arrange.create(fixed_nodes = fixed_nodes) + min_offset = 8 + for original_node in nodes: # Create a CuraSceneNode just if the original node is not that type From e5e6da297059c882ee7ef12df61faa48665dff05 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 11 Jan 2018 09:49:07 +0100 Subject: [PATCH 260/551] Change comments --- cura/Settings/CuraContainerStack.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index ff1e3fdd76..b97bb3314e 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -144,7 +144,7 @@ class CuraContainerStack(ContainerStack): ## Set the material container. # - # \param new_quality_changes The new material container. It is expected to have a "type" metadata entry with the value "quality_changes". + # \param new_material The new material container. It is expected to have a "type" metadata entry with the value "material". def setMaterial(self, new_material: InstanceContainer, postpone_emit = False) -> None: self.replaceContainer(_ContainerIndexes.Material, new_material, postpone_emit = postpone_emit) @@ -155,7 +155,7 @@ class CuraContainerStack(ContainerStack): # to whatever the machine definition specifies as "preferred" container, or a fallback value. See findDefaultMaterial # for details. # - # \param new_quality_changes_id The ID of the new material container. + # \param new_material_id The ID of the new material container. # # \throws Exceptions.InvalidContainerError Raised when no container could be found with the specified ID. def setMaterialById(self, new_material_id: str) -> None: @@ -182,7 +182,7 @@ class CuraContainerStack(ContainerStack): ## Set the variant container. # - # \param new_quality_changes The new variant container. It is expected to have a "type" metadata entry with the value "quality_changes". + # \param new_variant The new variant container. It is expected to have a "type" metadata entry with the value "variant". def setVariant(self, new_variant: InstanceContainer) -> None: self.replaceContainer(_ContainerIndexes.Variant, new_variant) @@ -193,7 +193,7 @@ class CuraContainerStack(ContainerStack): # to whatever the machine definition specifies as "preferred" container, or a fallback value. See findDefaultVariant # for details. # - # \param new_quality_changes_id The ID of the new variant container. + # \param new_variant_id The ID of the new variant container. # # \throws Exceptions.InvalidContainerError Raised when no container could be found with the specified ID. def setVariantById(self, new_variant_id: str) -> None: @@ -220,13 +220,13 @@ class CuraContainerStack(ContainerStack): ## Set the definition changes container. # - # \param new_quality_changes The new definition changes container. It is expected to have a "type" metadata entry with the value "quality_changes". + # \param new_definition_changes The new definition changes container. It is expected to have a "type" metadata entry with the value "definition_changes". def setDefinitionChanges(self, new_definition_changes: InstanceContainer) -> None: self.replaceContainer(_ContainerIndexes.DefinitionChanges, new_definition_changes) ## Set the definition changes container by an ID. # - # \param new_quality_changes_id The ID of the new definition changes container. + # \param new_definition_changes_id The ID of the new definition changes container. # # \throws Exceptions.InvalidContainerError Raised when no container could be found with the specified ID. def setDefinitionChangesById(self, new_definition_changes_id: str) -> None: @@ -245,13 +245,13 @@ class CuraContainerStack(ContainerStack): ## Set the definition container. # - # \param new_quality_changes The new definition container. It is expected to have a "type" metadata entry with the value "quality_changes". + # \param new_definition The new definition container. It is expected to have a "type" metadata entry with the value "definition". def setDefinition(self, new_definition: DefinitionContainerInterface) -> None: self.replaceContainer(_ContainerIndexes.Definition, new_definition) ## Set the definition container by an ID. # - # \param new_quality_changes_id The ID of the new definition container. + # \param new_definition_id The ID of the new definition container. # # \throws Exceptions.InvalidContainerError Raised when no container could be found with the specified ID. def setDefinitionById(self, new_definition_id: str) -> None: From a2089c6afd9f6a5201c7d4e19ead7ad591e6e9e8 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 11 Jan 2018 09:49:48 +0100 Subject: [PATCH 261/551] CURA-4461 Force set the active quality as it is when changing the buildplate type, so the values are updated --- cura/Settings/MachineManager.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 9f14dd471b..526a9ab1b0 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -870,6 +870,9 @@ class MachineManager(QObject): self.blurSettings.emit() self._new_buildplate_container = containers[0] # self._active_container_stack will be updated with a delay Logger.log("d", "Active buildplate changed to {active_variant_buildplate_id}".format(active_variant_buildplate_id = containers[0].getId())) + + # Force set the active quality as it is so the values are updated + self.setActiveQuality(self._active_container_stack.quality.getId()) else: Logger.log("w", "While trying to set the active buildplate, no buildplate was found to replace.") From de98a62dc88bfc2e15b6dbf2b5ba94188562e06d Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 11 Jan 2018 13:03:35 +0100 Subject: [PATCH 262/551] CURA-4461 Read buildplate id from the printer and set the automatic option --- cura/PrinterOutputDevice.py | 20 +++++++ .../NetworkPrinterOutputDevice.py | 2 + resources/qml/Menus/BuildplateMenu.qml | 57 +++++++++---------- 3 files changed, 50 insertions(+), 29 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index b147019b37..5f9e000856 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -36,6 +36,7 @@ class PrinterOutputDevice(QObject, OutputDevice): self._target_hotend_temperatures = [0] * self._num_extruders self._material_ids = [""] * self._num_extruders self._hotend_ids = [""] * self._num_extruders + self._buildplate_id = "" self._progress = 0 self._head_x = 0 self._head_y = 0 @@ -99,6 +100,9 @@ class PrinterOutputDevice(QObject, OutputDevice): # Signal to be emitted when either of the hotend ids is changed hotendIdChanged = pyqtSignal(int, str, arguments = ["index", "id"]) + # Signal to be emitted when the buildplate is changed + buildplateChanged = pyqtSignal() + # Signal that is emitted every time connection state is changed. # it also sends it's own device_id (for convenience sake) connectionStateChanged = pyqtSignal(str) @@ -495,6 +499,22 @@ class PrinterOutputDevice(QObject, OutputDevice): self._hotend_ids[index] = None self.hotendIdChanged.emit(index, None) + @pyqtProperty(str, notify = buildplateChanged) + def buildplateId(self): + return self._buildplate_id + + ## Protected setter for the current buildplate id. + # /param buildplate_id id of the buildplate + def _setBuildplateId(self, buildplate_id): + if buildplate_id and buildplate_id != self._buildplate_id: + Logger.log("d", "Setting buildplate id to %s." % (buildplate_id)) + self._buildplate_id = buildplate_id + self.buildplateChanged.emit(buildplate_id) + elif not buildplate_id: + Logger.log("d", "Removing buildplate id.") + self._buildplate_id = None + self.buildplateChanged.emit(None) + ## Let the user decide if the hotends and/or material should be synced with the printer # NB: the UX needs to be implemented by the plugin def materialHotendChangedMessage(self, callback): diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index 6b8946b755..e075eaab00 100755 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -583,6 +583,8 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): hotend_id = "" self._setHotendId(index, hotend_id) + # TODO Set the buildplate id depending on the info from the printer. To be discussed... + bed_temperatures = self._json_printer_state["bed"]["temperature"] self._setBedTemperature(bed_temperatures["current"]) self._updateTargetBedTemperature(bed_temperatures["target"]) diff --git a/resources/qml/Menus/BuildplateMenu.qml b/resources/qml/Menus/BuildplateMenu.qml index 89a5e6df77..908cccf1c8 100644 --- a/resources/qml/Menus/BuildplateMenu.qml +++ b/resources/qml/Menus/BuildplateMenu.qml @@ -12,7 +12,6 @@ Menu id: menu title: "Build plate" - property int extruderIndex: 0 property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool isClusterPrinter: { @@ -29,34 +28,34 @@ Menu return true; } -// MenuItem -// { -// id: automaticBuildplate -// text: -// { -// if(printerConnected && Cura.MachineManager.buildplateIds.length > buildplateIndex && !isClusterPrinter) -// { -// var buildplateName = Cura.MachineManager.buildplateIds[buildplateIndex] -// return catalog.i18nc("@title:menuitem %1 is the buildplate currently loaded in the printer", "Automatic: %1").arg(buildplateName) -// } -// return "" -// } -// visible: printerConnected && Cura.MachineManager.buildplateIds.length > buildplateIndex && !isClusterPrinter -// onTriggered: -// { -// var buildplateId = Cura.MachineManager.buildplateIds[buildplateIndex] -// var itemIndex = buildplateInstantiator.model.find("name", buildplateId); -// if(itemIndex > -1) -// { -// Cura.MachineManager.setActiveVariantBuildplate(buildplateInstantiator.model.getItem(itemIndex).id); -// } -// } -// } -// -// MenuSeparator -// { -// visible: automaticBuildplate.visible -// } + MenuItem + { + id: automaticBuildplate + text: + { + if(printerConnected && Cura.MachineManager.printerOutputDevices[0].buildplateId != "" && !isClusterPrinter) + { + var buildplateName = Cura.MachineManager.printerOutputDevices[0].buildplateId + return catalog.i18nc("@title:menuitem %1 is the buildplate currently loaded in the printer", "Automatic: %1").arg(buildplateName) + } + return "" + } + visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].buildplateId != "" && !isClusterPrinter + onTriggered: + { + var buildplateId = Cura.MachineManager.printerOutputDevices[0].buildplateId + var itemIndex = buildplateInstantiator.model.find("name", buildplateId) + if(itemIndex > -1) + { + Cura.MachineManager.setActiveVariantBuildplate(buildplateInstantiator.model.getItem(itemIndex).id) + } + } + } + + MenuSeparator + { + visible: automaticBuildplate.visible + } Instantiator { From 3f4a2c565cd76663089dc6422d2124847c210c28 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Thu, 11 Jan 2018 13:32:05 +0100 Subject: [PATCH 263/551] Fix: after extruders switch do not trigger slicing, provided a new signal which is triggered after adding extruder and it subscribers for property changes --- cura/Settings/ExtruderManager.py | 4 ++++ plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 351843ae14..b5f9a35914 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -49,6 +49,9 @@ class ExtruderManager(QObject): ## Notify when the user switches the currently active extruder. activeExtruderChanged = pyqtSignal() + ## The signal notifies subscribers if extruders are added + extrudersAdded = pyqtSignal() + ## Gets the unique identifier of the currently active extruder stack. # # The currently active extruder stack is the stack that is currently being @@ -406,6 +409,7 @@ class ExtruderManager(QObject): if extruders_changed: self.extrudersChanged.emit(global_stack_id) + self.extrudersAdded.emit() self.setActiveExtruderIndex(0) ## Get all extruder values for a certain setting. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index e8c830b901..e7db4a12dd 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -88,7 +88,7 @@ class CuraEngineBackend(QObject, Backend): # self._global_container_stack = None Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) - Application.getInstance().getExtruderManager().activeExtruderChanged.connect(self._onGlobalStackChanged) + Application.getInstance().getExtruderManager().extrudersAdded.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() Application.getInstance().stacksValidationFinished.connect(self._onStackErrorCheckFinished) From 10c9ea68b49b910c8a0d34ba73e4f96bce4d0dec Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 11 Jan 2018 13:53:09 +0100 Subject: [PATCH 264/551] CURA-4461 Change builplate type's label --- 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 c61f950978..e326ee9d4e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -163,7 +163,7 @@ "options": { "glass": "Glass", - "aluminium": "Aluminium" + "aluminum": "Aluminum" }, "settable_per_mesh": false, "settable_per_extruder": false, From 87105e6d063f198eba466dd522bf146c12bafc5d Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 11 Jan 2018 14:30:59 +0100 Subject: [PATCH 265/551] CURA-4525 fix printing dimensions --- cura/CuraApplication.py | 10 ++++++++-- cura/Scene/CuraSceneController.py | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7cc8afae1e..3dd4c34815 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -266,6 +266,7 @@ class CuraApplication(QtApplication): self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().toolOperationStopped.connect(self._onToolOperationStopped) self.getController().contextMenuRequested.connect(self._onContextMenuRequested) + self.getCuraSceneController().activeBuildPlateChanged.connect(self.updatePlatformActivity) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") @@ -890,12 +891,17 @@ class CuraApplication(QtApplication): def getSceneBoundingBoxString(self): 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()} + ## Update scene bounding box for current build plate def updatePlatformActivity(self, node = None): count = 0 scene_bounding_box = None is_block_slicing_node = False + active_build_plate = self.getBuildPlateModel().activeBuildPlate for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): + if ( + not issubclass(type(node), CuraSceneNode) or + (not node.getMeshData() and not node.callDecoration("getLayerData")) or + (node.callDecoration("getBuildPlateNumber") != active_build_plate)): continue if node.callDecoration("isBlockSlicing"): is_block_slicing_node = True @@ -915,7 +921,7 @@ class CuraApplication(QtApplication): if not scene_bounding_box: scene_bounding_box = AxisAlignedBox.Null - if repr(self._scene_bounding_box) != repr(scene_bounding_box) and scene_bounding_box.isValid(): + if repr(self._scene_bounding_box) != repr(scene_bounding_box): self._scene_bounding_box = scene_bounding_box self.sceneBoundingBoxChanged.emit() diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index c3e27ca3dd..97cffcdd7d 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -10,9 +10,12 @@ from UM.Application import Application from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection +from UM.Signal import Signal class CuraSceneController(QObject): + activeBuildPlateChanged = Signal() + def __init__(self, objects_model: ObjectsModel, build_plate_model: BuildPlateModel): super().__init__() @@ -101,6 +104,7 @@ class CuraSceneController(QObject): self._build_plate_model.setActiveBuildPlate(nr) self._objects_model.setActiveBuildPlate(nr) + self.activeBuildPlateChanged.emit() @staticmethod def createCuraSceneController(): From 225a205d97ddc4de0534b112d7f92f41cd5994c1 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 12 Jan 2018 09:19:03 +0100 Subject: [PATCH 266/551] Fixes for material duplication and editing, small refactoring - CURA-4787 --- resources/qml/Preferences/MaterialView.qml | 52 ++++++++++----------- resources/qml/Preferences/MaterialsPage.qml | 9 ---- 2 files changed, 25 insertions(+), 36 deletions(-) diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index c3f36f5125..b2307fe4f6 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -72,7 +72,7 @@ TabView width: scrollView.columnWidth; text: properties.name; readOnly: !base.editingEnabled; - onEditingFinished: base.setName(properties.name, text) + onEditingFinished: base.updateMaterialDisplayName(properties.name, text) } Label { width: scrollView.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Brand") } @@ -82,11 +82,7 @@ TabView width: scrollView.columnWidth; text: properties.supplier; readOnly: !base.editingEnabled; - onEditingFinished: - { - base.setMetaDataEntry("brand", properties.supplier, text); - pane.objectList.currentIndex = pane.getIndexById(base.containerId); - } + onEditingFinished: base.updateMaterialSupplier(properties.supplier, text) } Label { width: scrollView.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Material Type") } @@ -95,15 +91,10 @@ TabView width: scrollView.columnWidth; text: properties.material_type; readOnly: !base.editingEnabled; - onEditingFinished: - { - base.setMetaDataEntry("material", properties.material_type, text); - pane.objectList.currentIndex = pane.getIndexById(base.containerId) - } + onEditingFinished: base.updateMaterialType(properties.material_type, text) } Label { width: scrollView.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Color") } - Row { width: scrollView.columnWidth height: parent.rowHeight @@ -128,13 +119,6 @@ TabView } } - // make sure the color stays connected after changing the color - Binding { - target: colorSelector - property: "color" - value: properties.color_code - } - // pretty color name text field ReadOnlyTextField { id: colorLabel; @@ -453,14 +437,28 @@ TabView return 0; } - function setName(old_value, new_value) - { - if(old_value != new_value) - { - Cura.ContainerManager.setContainerName(base.containerId, new_value); - // update material name label. not so pretty, but it works - materialProperties.name = new_value; - pane.objectList.currentIndex = pane.getIndexById(base.containerId) + // update the display name of the material + function updateMaterialDisplayName (old_name, new_name) { + + // don't change when new name is the same + if (old_name == new_name) { + return } + + // update the values + Cura.ContainerManager.setContainerName(base.containerId, new_name) + materialProperties.name = new_name + } + + // update the type of the material + function updateMaterialType (old_type, new_type) { + base.setMetaDataEntry("material", old_type, new_type) + materialProperties.material_type = new_type + } + + // update the supplier of the material + function updateMaterialSupplier (old_supplier, new_supplier) { + base.setMetaDataEntry("brand", old_supplier, new_supplier) + materialProperties.supplier = new_supplier } } diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index 6b041b895a..228f9c8ea2 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -153,15 +153,6 @@ UM.ManagementPage forceActiveFocus() Cura.ContainerManager.createMaterial() } - - Connections - { - target: base.objectList.model - onItemsChanged: - { - base.objectList.currentIndex = base.getIndexById(Cura.MachineManager.activeMaterialId); - } - } }, // Duplicate button From 8b3bd71b36ac764dd8750a06108f6ba92fabd47f Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 12 Jan 2018 09:57:32 +0100 Subject: [PATCH 267/551] Get extruders list from GlobalStack itself CURA-4784 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index e7db4a12dd..e1035af679 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -722,7 +722,7 @@ class CuraEngineBackend(QObject, Backend): 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())) + extruders = list(self._global_container_stack.extruders.values()) for extruder in extruders: extruder.propertyChanged.disconnect(self._onSettingChanged) @@ -733,7 +733,7 @@ class CuraEngineBackend(QObject, Backend): 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())) + extruders = list(self._global_container_stack.extruders.values()) for extruder in extruders: extruder.propertyChanged.connect(self._onSettingChanged) extruder.containersChanged.connect(self._onChanged) From 225b03e98ee1d92467176a1fd1ef3605ce0999c7 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 12 Jan 2018 09:58:06 +0100 Subject: [PATCH 268/551] No need for the extra extrudersAdded signal CURA-4784 --- cura/Settings/ExtruderManager.py | 4 ---- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 - 2 files changed, 5 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index b5f9a35914..351843ae14 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -49,9 +49,6 @@ class ExtruderManager(QObject): ## Notify when the user switches the currently active extruder. activeExtruderChanged = pyqtSignal() - ## The signal notifies subscribers if extruders are added - extrudersAdded = pyqtSignal() - ## Gets the unique identifier of the currently active extruder stack. # # The currently active extruder stack is the stack that is currently being @@ -409,7 +406,6 @@ class ExtruderManager(QObject): if extruders_changed: self.extrudersChanged.emit(global_stack_id) - self.extrudersAdded.emit() self.setActiveExtruderIndex(0) ## Get all extruder values for a certain setting. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index e1035af679..3272fb019d 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -88,7 +88,6 @@ class CuraEngineBackend(QObject, Backend): # self._global_container_stack = None Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) - Application.getInstance().getExtruderManager().extrudersAdded.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() Application.getInstance().stacksValidationFinished.connect(self._onStackErrorCheckFinished) From 7d6e41f6c8d6987f0cbfe731b1635a958e326caa Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 12 Jan 2018 10:36:21 +0100 Subject: [PATCH 269/551] Disable activate configuration button for now until sync functionality has been decided --- .../UM3NetworkPrinting/UM3InfoComponents.qml | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml index 939c6bcb39..18b481a6ed 100644 --- a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml +++ b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml @@ -115,24 +115,8 @@ Item { tooltip: catalog.i18nc("@info:tooltip", "Load the configuration of the printer into Cura") text: catalog.i18nc("@action:button", "Activate Configuration") - visible: printerConnected && !isClusterPrinter() + visible: false // printerConnected && !isClusterPrinter() onClicked: manager.loadConfigurationFromPrinter() - - function isClusterPrinter() { - return false - //TODO: Hardcoded this for the moment now. These info components might also need to move. - /*if(Cura.MachineManager.printerOutputDevices.length == 0) - { - return false; - } - var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize; - // This is not a cluster printer or the cluster it is just one printer - if(clusterSize == undefined || clusterSize == 1) - { - return false; - } - return true;*/ - } } } From b086e9cb5346b4a0f5668f85d5090251da4310e1 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 12 Jan 2018 10:52:14 +0100 Subject: [PATCH 270/551] Fixes for UM3 network printing for multi build plate --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 4283042bf2..e36b9abef7 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -80,8 +80,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): Application.getInstance().getController().setActiveStage("MonitorStage") self.writeStarted.emit(self) - self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", []) - if not self._gcode: + gcode_dict = getattr(Application.getInstance().getController().getScene(), "gcode_dict", []) + active_build_plate_id = Application.getInstance().getBuildPlateModel().activeBuildPlate + gcode_list = gcode_dict[active_build_plate_id] + + if not gcode_list: # Unable to find g-code. Nothing to send return From 06f35096ad34a2ebe095655b6756688c81687c80 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 12 Jan 2018 10:54:48 +0100 Subject: [PATCH 271/551] Fix setting gcode list on output device --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index e36b9abef7..45c152ee2f 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -88,6 +88,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # Unable to find g-code. Nothing to send return + self._gcode = gcode_list + if len(self._printers) > 1: self._spawnPrinterSelectionDialog() else: From 1986677276b5f88e6c72f8fe9196641b696b943c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 12 Jan 2018 10:58:16 +0100 Subject: [PATCH 272/551] re-addded connection text CL-541 --- cura/PrinterOutputDevice.py | 15 ++++++++++++++- .../UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 ++ .../UM3NetworkPrinting/LegacyUM3OutputDevice.py | 12 +++++++++--- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 ++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 2aa6fb382e..0141e74ba4 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -41,6 +41,9 @@ class PrinterOutputDevice(QObject, OutputDevice): # # Signal to indicate that the hotend of the active printer on the remote changed. hotendIdChanged = pyqtSignal() + # Signal to indicate that the info text about the connection has changed. + connectionTextChanged = pyqtSignal() + def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) @@ -65,11 +68,21 @@ class PrinterOutputDevice(QObject, OutputDevice): self._connection_state = ConnectionState.closed self._address = "" + self._connection_text = "" - @pyqtProperty(str, constant = True) + @pyqtProperty(str, notify = connectionTextChanged) def address(self): return self._address + def setConnectionText(self, connection_text): + if self._connection_text != connection_text: + self._connection_text = connection_text + self.connectionTextChanged.emit() + + @pyqtProperty(str, constant=True) + def connectionText(self): + return self._connection_text + def materialHotendChangedMessage(self, callback): Logger.log("w", "materialHotendChangedMessage needs to be implemented, returning 'Yes'") callback(QMessageBox.Yes) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 45c152ee2f..b13817d763 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -69,6 +69,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network")) + self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network")) + self._printer_uuid_to_unique_name_mapping = {} self._finished_jobs = [] diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 786b97d034..6b3675064d 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -78,10 +78,16 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def _onAuthenticationStateChanged(self): # We only accept commands if we are authenticated. + self._setAcceptsCommands(self._authentication_state == AuthState.Authenticated) + if self._authentication_state == AuthState.Authenticated: - self._setAcceptsCommands(True) - else: - self._setAcceptsCommands(False) + self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network.")) + elif self._authentication_state == AuthState.AuthenticationRequested: + self.setConnectionText(i18n_catalog.i18nc("@info:status", + "Connected over the network. Please approve the access request on the printer.")) + elif self._authentication_state == AuthState.AuthenticationDenied: + self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network. No access to control the printer.")) + def _setupMessages(self): self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status", diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 6c03450a88..d372b54c38 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -80,6 +80,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._firmware_progress = 0 self._firmware_update_state = FirmwareUpdateState.idle + self.setConnectionText(catalog.i18nc("@info:status", "Connected via USB")) + # Queue for commands that need to be send. Used when command is sent when a print is active. self._command_queue = Queue() From d1b5744f57632305c4e01fe492d5de7a9a197748 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 12 Jan 2018 10:58:36 +0100 Subject: [PATCH 273/551] Also fix gcode output for legacy UM3 networking, switch to monitor AFTER starting transferring G-code to catch potential errors before --- .../UM3NetworkPrinting/ClusterUM3OutputDevice.py | 5 +++-- .../UM3NetworkPrinting/LegacyUM3OutputDevice.py | 14 ++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 45c152ee2f..7bdf6090de 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -76,8 +76,6 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._cluster_size = int(properties.get(b"cluster_size", 0)) def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): - # Notify the UI that a switch to the print monitor should happen - Application.getInstance().getController().setActiveStage("MonitorStage") self.writeStarted.emit(self) gcode_dict = getattr(Application.getInstance().getController().getScene(), "gcode_dict", []) @@ -95,6 +93,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): else: self.sendPrintJob() + # Notify the UI that a switch to the print monitor should happen + Application.getInstance().getController().setActiveStage("MonitorStage") + def _spawnPrinterSelectionDialog(self): if self._printer_selection_dialog is None: path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "PrintWindow.qml") diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 786b97d034..a63adadd54 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -175,15 +175,18 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): # Not authenticated, so unable to send job. return - # Notify the UI that a switch to the print monitor should happen - Application.getInstance().getController().setActiveStage("MonitorStage") self.writeStarted.emit(self) - self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", []) - if not self._gcode: + gcode_dict = getattr(Application.getInstance().getController().getScene(), "gcode_dict", []) + active_build_plate_id = Application.getInstance().getBuildPlateModel().activeBuildPlate + gcode_list = gcode_dict[active_build_plate_id] + + if not gcode_list: # Unable to find g-code. Nothing to send return + self._gcode = gcode_list + errors = self._checkForErrors() if errors: text = i18n_catalog.i18nc("@label", "Unable to start a new print job.") @@ -229,6 +232,9 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): # No warnings or errors, so we're good to go. self._startPrint() + # Notify the UI that a switch to the print monitor should happen + Application.getInstance().getController().setActiveStage("MonitorStage") + def _startPrint(self): Logger.log("i", "Sending print job to printer.") if self._sending_gcode: From c2935759e8ee5cf95f9d85790d8f93172d449300 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 12 Jan 2018 11:04:10 +0100 Subject: [PATCH 274/551] Fixed broken printjob state in machines page CL-541 --- resources/qml/Preferences/MachinesPage.qml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index a8e25155e1..889dfa8d5b 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -143,7 +143,7 @@ UM.ManagementPage property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property var connectedPrinter: printerConnected ? Cura.MachineManager.printerOutputDevices[0] : null property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands - + property var printJob: connectedPrinter != null ? connectedPrinter.activePrintJob: null Label { text: catalog.i18nc("@label", "Printer type:") @@ -178,7 +178,12 @@ UM.ManagementPage return ""; } - switch(Cura.MachineManager.printerOutputDevices[0].jobState) + if (machineInfo.printJob == null) + { + return catalog.i18nc("@label:MonitorStatus", "Waiting for a printjob"); + } + + switch(machineInfo.printJob.state) { case "printing": return catalog.i18nc("@label:MonitorStatus", "Printing..."); @@ -194,10 +199,9 @@ UM.ManagementPage return catalog.i18nc("@label:MonitorStatus", "In maintenance. Please check the printer"); case "abort": // note sure if this jobState actually occurs in the wild return catalog.i18nc("@label:MonitorStatus", "Aborting print..."); - case "ready": // ready to print or getting ready - case "": // ready to print or getting ready - return catalog.i18nc("@label:MonitorStatus", "Waiting for a printjob"); + } + return "" } visible: base.currentItem && base.currentItem.id == Cura.MachineManager.activeMachineId && machineInfo.printerAcceptsCommands wrapMode: Text.WordWrap From 51316e1dc1db3d58e3f7c2139f3b0b28b754c0b1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 12 Jan 2018 11:13:58 +0100 Subject: [PATCH 275/551] Fix Prepare/Cancel button visibility conditions for manual slicing CURA-4525 --- resources/qml/SaveButton.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index dc24cc4700..bf44a29cf5 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -170,8 +170,8 @@ Item { tooltip: [1, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@info:tooltip","Slice current printjob") : catalog.i18nc("@info:tooltip","Cancel slicing process") // 1 = not started, 2 = Processing - enabled: base.backendState != "undefined" && (base.backendState == 1 || base.backendState == 2) && base.activity == true - visible: base.backendState != "undefined" && !autoSlice && (base.backendState == 1 || base.backendState == 2) && base.activity == true + enabled: base.backendState != "undefined" && ([1, 2].indexOf(base.backendState) != -1) && base.activity + visible: base.backendState != "undefined" && !autoSlice && ([1, 2, 4].indexOf(base.backendState) != -1) && base.activity property bool autoSlice height: UM.Theme.getSize("save_button_save_to_button").height @@ -179,8 +179,8 @@ Item { anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width - // 1 = not started, 5 = disabled - text: [1, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@label:Printjob", "Prepare") : catalog.i18nc("@label:Printjob", "Cancel") + // 1 = not started, 4 = error, 5 = disabled + text: [1, 4, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@label:Printjob", "Prepare") : catalog.i18nc("@label:Printjob", "Cancel") onClicked: { sliceOrStopSlicing(); From c3c44e9ac442302b655cc7650c27c7e8118fcc02 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 12 Jan 2018 16:01:48 +0100 Subject: [PATCH 276/551] Compatibility with materials and buildplates --- .../XmlMaterialProfile/XmlMaterialProfile.py | 197 +++++++++++++++--- 1 file changed, 172 insertions(+), 25 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 8e3c25bb23..222939bddd 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -187,6 +187,7 @@ class XmlMaterialProfile(InstanceContainer): machine_container_map = {} machine_nozzle_map = {} + machine_buildplate_map = {} all_containers = registry.findInstanceContainers(GUID = self.getMetaDataEntry("GUID"), base_file = self.getId()) for container in all_containers: @@ -202,6 +203,7 @@ class XmlMaterialProfile(InstanceContainer): variant = container.getMetaDataEntry("variant") if variant: + print("#############variant", variant) machine_nozzle_map[definition_id][variant] = container continue @@ -261,6 +263,34 @@ class XmlMaterialProfile(InstanceContainer): builder.end("hotend") + # Find all buildplate sub-profiles corresponding to this material and machine and add them to this profile. + for buildplate_id, buildplate in machine_buildplate_map[definition_id].items(): + variant_containers = registry.findInstanceContainersMetadata(id = buildplate.getMetaDataEntry("variant")) + if not variant_containers: + continue + + # The buildplate identifier is not the containers name, but its "name". + builder.start("buildplate", {"id": variant_containers[0]["name"]}) + + # Compatible is a special case, as it's added as a meta data entry (instead of an instance). + compatible = buildplate.getMetaDataEntry("compatible") + if compatible is not None: + builder.start("setting", {"key": "hardware compatible"}) + if compatible: + builder.data("yes") + else: + builder.data("no") + builder.end("setting") + + for instance in buildplate.findInstances(): + if container.getInstance(instance.definition.key) and container.getProperty(instance.definition.key, "value") == instance.value: + # If the settings match that of the machine profile, just skip since we inherit the machine profile. + continue + + self._addSettingElement(builder, instance) + + builder.end("buildplate") + builder.end("machine") builder.end("settings") @@ -576,6 +606,74 @@ class XmlMaterialProfile(InstanceContainer): if is_new_material: containers_to_add.append(new_material) + buildplates = machine.iterfind("./um:buildplate", self.__namespaces) + buildplate_map = {} + for buildplate in buildplates: + buildplate_id = buildplate.get("id") + if buildplate_id is None: + continue + + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata( + id = buildplate_id) + if not variant_containers: + # It is not really properly defined what "ID" is so also search for variants by name. + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata( + definition = machine_id, name = buildplate_id) + + if not variant_containers: + continue + + buildplate_compatibility = machine_compatibility + buildplate_recommended = machine_compatibility + settings = buildplate.iterfind("./um:setting", self.__namespaces) + for entry in settings: + key = entry.get("key") + if key in self.__unmapped_settings: + if key == "hardware compatible": + buildplate_compatibility = self._parseCompatibleValue(entry.text) + elif key == "hardware recommended": + buildplate_recommended = self._parseCompatibleValue(entry.text) + else: + Logger.log("d", "Unsupported material setting %s", key) + + buildplate_map[buildplate_id] = {} + buildplate_map[buildplate_id]["buildplate_compatible"] = buildplate_compatibility + buildplate_map[buildplate_id]["buildplate_recommended"] = buildplate_recommended + + # # Same as machine compatibility, keep the derived material containers consistent with the parent + # # material + # if ContainerRegistry.getInstance().isLoaded(new_buildplate_id): + # new_buildplate_material = ContainerRegistry.getInstance().findContainers(id = new_buildplate_id)[0] + # is_new_material = False + # else: + # new_buildplate_material = XmlMaterialProfile(new_buildplate_id) + # is_new_material = True + # + # new_buildplate_material.setMetaData(copy.deepcopy(self.getMetaData())) + # new_buildplate_material.getMetaData()["id"] = new_buildplate_id + # new_buildplate_material.getMetaData()["name"] = self.getName() + # new_buildplate_material.getMetaData()["variant"] = variant_containers[0]["id"] + # new_buildplate_material.setDefinition(machine_id) + # # Don't use setMetadata, as that overrides it for all materials with same base file + # new_buildplate_material.getMetaData()["compatible"] = buildplate_compatibility + # new_buildplate_material.getMetaData()["machine_manufacturer"] = machine_manufacturer + # new_buildplate_material.getMetaData()["definition"] = machine_id + # + # cached_buildplate_setting_properties = cached_machine_setting_properties.copy() + # cached_buildplate_setting_properties.update(buildplate_setting_values) + # + # new_buildplate_material.setCachedValues(cached_buildplate_setting_properties) + # + # new_buildplate_material._dirty = False + # + # if is_new_material: + # containers_to_add.append(new_buildplate_material) + + # If no buildplate was found, then the material is created without buildplate information + if not buildplate_map: + buildplate_map[""] = {"buildplate_compatible" : machine_compatibility, + "buildplate_recommended" : machine_compatibility} + hotends = machine.iterfind("./um:hotend", self.__namespaces) for hotend in hotends: hotend_id = hotend.get("id") @@ -603,36 +701,44 @@ class XmlMaterialProfile(InstanceContainer): else: Logger.log("d", "Unsupported material setting %s", key) - new_hotend_id = self.getId() + "_" + machine_id + "_" + hotend_id.replace(" ", "_") + for buildplate_id in buildplate_map: - # Same as machine compatibility, keep the derived material containers consistent with the parent - # material - if ContainerRegistry.getInstance().isLoaded(new_hotend_id): - new_hotend_material = ContainerRegistry.getInstance().findContainers(id = new_hotend_id)[0] - is_new_material = False - else: - new_hotend_material = XmlMaterialProfile(new_hotend_id) - is_new_material = True + new_hotend_id = self.getId() + "_" + machine_id + "_" + hotend_id.replace(" ", "_") + \ + ("_" if buildplate_id != "" else "") + buildplate_id.replace(" ", "_") - new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) - new_hotend_material.getMetaData()["id"] = new_hotend_id - new_hotend_material.getMetaData()["name"] = self.getName() - new_hotend_material.getMetaData()["variant"] = variant_containers[0]["id"] - new_hotend_material.setDefinition(machine_id) - # Don't use setMetadata, as that overrides it for all materials with same base file - new_hotend_material.getMetaData()["compatible"] = hotend_compatibility - new_hotend_material.getMetaData()["machine_manufacturer"] = machine_manufacturer - new_hotend_material.getMetaData()["definition"] = machine_id + buildplate_compatibility = buildplate_map[buildplate_id]["buildplate_compatible"] + buildplate_recommended = buildplate_map[buildplate_id]["buildplate_recommended"] - cached_hotend_setting_properties = cached_machine_setting_properties.copy() - cached_hotend_setting_properties.update(hotend_setting_values) + # Same as machine compatibility, keep the derived material containers consistent with the parent + # material + if ContainerRegistry.getInstance().isLoaded(new_hotend_id): + new_hotend_material = ContainerRegistry.getInstance().findContainers(id = new_hotend_id)[0] + is_new_material = False + else: + new_hotend_material = XmlMaterialProfile(new_hotend_id) + is_new_material = True - new_hotend_material.setCachedValues(cached_hotend_setting_properties) + new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) + new_hotend_material.getMetaData()["id"] = new_hotend_id + new_hotend_material.getMetaData()["name"] = self.getName() + new_hotend_material.getMetaData()["variant"] = variant_containers[0]["id"] + new_hotend_material.setDefinition(machine_id) + # Don't use setMetadata, as that overrides it for all materials with same base file + new_hotend_material.getMetaData()["compatible"] = hotend_compatibility + new_hotend_material.getMetaData()["buildplate_compatible"] = buildplate_compatibility + new_hotend_material.getMetaData()["buildplate_recommended"] = buildplate_recommended + new_hotend_material.getMetaData()["machine_manufacturer"] = machine_manufacturer + new_hotend_material.getMetaData()["definition"] = machine_id - new_hotend_material._dirty = False + cached_hotend_setting_properties = cached_machine_setting_properties.copy() + cached_hotend_setting_properties.update(hotend_setting_values) - if is_new_material: - containers_to_add.append(new_hotend_material) + new_hotend_material.setCachedValues(cached_hotend_setting_properties) + + new_hotend_material._dirty = False + + if is_new_material: + containers_to_add.append(new_hotend_material) # there is only one ID for a machine. Once we have reached here, it means we have already found # a workable ID for that machine, so there is no need to continue @@ -803,6 +909,46 @@ class XmlMaterialProfile(InstanceContainer): if len(found_materials) == 0: result_metadata.append(new_hotend_material_metadata) + for buildplate in machine.iterfind("./um:buildplate", cls.__namespaces): + buildplate_id = buildplate.get("id") + if buildplate_id is None: + continue + + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = buildplate_id) + if not variant_containers: + # It is not really properly defined what "ID" is so also search for variants by name. + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = machine_id, name = buildplate_id) + + buildplate_compatibility = machine_compatibility + for entry in buildplate.iterfind("./um:setting", cls.__namespaces): + key = entry.get("key") + if key == "hardware compatible": + buildplate_compatibility = cls._parseCompatibleValue(entry.text) + + new_buildplate_id = container_id + "_" + machine_id + "_" + buildplate_id.replace(" ", "_") + + # Same as machine compatibility, keep the derived material containers consistent with the parent + # material + found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_buildplate_id) + if found_materials: + new_buildplate_material_metadata = found_materials[0] + else: + new_buildplate_material_metadata = {} + + new_buildplate_material_metadata.update(base_metadata) + if variant_containers: + new_buildplate_material_metadata["variant"] = variant_containers[0]["id"] + else: + new_buildplate_material_metadata["variant"] = buildplate_id + _with_missing_variants.append(new_buildplate_material_metadata) + new_buildplate_material_metadata["compatible"] = buildplate_compatibility + new_buildplate_material_metadata["machine_manufacturer"] = machine_manufacturer + new_buildplate_material_metadata["id"] = new_buildplate_id + new_buildplate_material_metadata["definition"] = machine_id + + if len(found_materials) == 0: + result_metadata.append(new_buildplate_material_metadata) + # there is only one ID for a machine. Once we have reached here, it means we have already found # a workable ID for that machine, so there is no need to continue break @@ -884,7 +1030,8 @@ class XmlMaterialProfile(InstanceContainer): "surface energy": "material_surface_energy" } __unmapped_settings = [ - "hardware compatible" + "hardware compatible", + "hardware recommended" ] __material_properties_setting_map = { "diameter": "material_diameter" From b54b075cc9b01d50c6850809ab6b400cfa4d03cf Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 12 Jan 2018 16:42:32 +0100 Subject: [PATCH 277/551] Use isinstance() instead or issubclass() CURA-4525 --- cura/CuraApplication.py | 16 ++++++++-------- cura/ObjectsModel.py | 2 +- cura/PlatformPhysics.py | 2 +- cura/Scene/BuildPlateDecorator.py | 2 +- cura/Scene/ConvexHullNode.py | 2 +- cura/Scene/CuraSceneController.py | 2 +- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- plugins/SimulationView/SimulationPass.py | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7cc8afae1e..af6f08c175 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -895,7 +895,7 @@ class CuraApplication(QtApplication): scene_bounding_box = None is_block_slicing_node = False for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): + if not isinstance(node, SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): continue if node.callDecoration("isBlockSlicing"): is_block_slicing_node = True @@ -1012,7 +1012,7 @@ class CuraApplication(QtApplication): Selection.clear() for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1058,7 +1058,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Resetting all scene translations") nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1086,7 +1086,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Resetting all scene transformations") nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1113,7 +1113,7 @@ class CuraApplication(QtApplication): def arrangeObjectsToAllBuildPlates(self): nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1134,7 +1134,7 @@ class CuraApplication(QtApplication): nodes = [] active_build_plate = self.getBuildPlateModel().activeBuildPlate for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1158,7 +1158,7 @@ class CuraApplication(QtApplication): # What nodes are on the build plate and are not being moved fixed_nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1186,7 +1186,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Reloading all loaded mesh data.") nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode) or not node.getMeshData(): + if not isinstance(node, SceneNode) or not node.getMeshData(): continue nodes.append(node) diff --git a/cura/ObjectsModel.py b/cura/ObjectsModel.py index 5218127fc5..1516b3ee33 100644 --- a/cura/ObjectsModel.py +++ b/cura/ObjectsModel.py @@ -28,7 +28,7 @@ class ObjectsModel(ListModel): active_build_plate_number = self._build_plate_number group_nr = 1 for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): continue diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 0ad3cf1328..69890178e4 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -61,7 +61,7 @@ class PlatformPhysics: random.shuffle(nodes) for node in nodes: - if node is root or not issubclass(type(node), SceneNode) or node.getBoundingBox() is None: + if node is root or not isinstance(node, SceneNode) or node.getBoundingBox() is None: continue bbox = node.getBoundingBox() diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py index 44372976f0..c2fd3145dd 100644 --- a/cura/Scene/BuildPlateDecorator.py +++ b/cura/Scene/BuildPlateDecorator.py @@ -13,7 +13,7 @@ class BuildPlateDecorator(SceneNodeDecorator): # Make sure that groups are set correctly # setBuildPlateForSelection in CuraActions makes sure that no single childs are set. self._build_plate_number = nr - if issubclass(type(self._node), CuraSceneNode): + if isinstance(self._node, CuraSceneNode): self._node.transformChanged() # trigger refresh node without introducing a new signal if self._node and self._node.callDecoration("isGroup"): for child in self._node.getChildren(): diff --git a/cura/Scene/ConvexHullNode.py b/cura/Scene/ConvexHullNode.py index 02d8ed833c..c8106b5d15 100644 --- a/cura/Scene/ConvexHullNode.py +++ b/cura/Scene/ConvexHullNode.py @@ -65,7 +65,7 @@ class ConvexHullNode(SceneNode): ConvexHullNode.shader.setUniformValue("u_opacity", 0.6) if self.getParent(): - if self.getMeshData() and issubclass(type(self._node), SceneNode) and self._node.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate: + if self.getMeshData() and isinstance(self._node, SceneNode) and self._node.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate: renderer.queueNode(self, transparent = True, shader = ConvexHullNode.shader, backface_cull = True, sort = -8) if self._convex_hull_head_mesh: renderer.queueNode(self, shader = ConvexHullNode.shader, transparent = True, mesh = self._convex_hull_head_mesh, backface_cull = True, sort = -8) diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index c3e27ca3dd..652dc78841 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -30,7 +30,7 @@ class CuraSceneController(QObject): source = args[0] else: source = None - if not issubclass(type(source), SceneNode): + if not isinstance(source, SceneNode): return max_build_plate = self._calcMaxBuildPlate() changed = False diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 3272fb019d..97463e07da 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -422,7 +422,7 @@ class CuraEngineBackend(QObject, Backend): # # \param source The scene node that was changed. def _onSceneChanged(self, source): - if not issubclass(type(source), SceneNode): + if not isinstance(source, SceneNode): return build_plate_changed = set() diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index c9c1443bfe..76d7127534 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -106,7 +106,7 @@ class SimulationPass(RenderPass): nozzle_node = node nozzle_node.setVisible(False) - elif issubclass(type(node), SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): + elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: continue From bd1bf2caafcdd9dac33bf059423a08155ccda129 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 12 Jan 2018 17:38:47 +0100 Subject: [PATCH 278/551] Add use_gui flag in application, don't use theme functions when not using gui --- cura/CuraApplication.py | 16 +++++++++++++++- cura/Scene/ConvexHullNode.py | 5 ++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e9484d5b3a..3adb8681cc 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -142,6 +142,7 @@ class CuraApplication(QtApplication): if not hasattr(sys, "frozen"): Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "resources")) + self._use_gui = True self._open_file_queue = [] # Files to open when plug-ins are loaded. # Need to do this before ContainerRegistry tries to load the machines @@ -451,7 +452,7 @@ class CuraApplication(QtApplication): elif choice == "always_keep": # don't show dialog and KEEP the profile self.discardOrKeepProfileChangesClosed("keep") - else: + elif self._use_gui: # ALWAYS ask whether to keep or discard the profile self.showDiscardOrKeepProfileChanges.emit() has_user_interaction = True @@ -676,10 +677,13 @@ class CuraApplication(QtApplication): ## Run Cura without GUI elements and interaction (server mode). def runWithoutGUI(self): + self._use_gui = False self.closeSplash() ## Run Cura with GUI (desktop mode). def runWithGUI(self): + self._use_gui = True + self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene...")) controller = self.getController() @@ -732,6 +736,9 @@ class CuraApplication(QtApplication): # Hide the splash screen self.closeSplash() + def hasGui(self): + return self._use_gui + def getMachineManager(self, *args) -> MachineManager: if self._machine_manager is None: self._machine_manager = MachineManager.createMachineManager() @@ -1344,6 +1351,7 @@ class CuraApplication(QtApplication): pass fileLoaded = pyqtSignal(str) + fileCompleted = pyqtSignal(str) def _reloadMeshFinished(self, job): # TODO; This needs to be fixed properly. We now make the assumption that we only load a single mesh! @@ -1353,6 +1361,10 @@ class CuraApplication(QtApplication): else: Logger.log("w", "Could not find a mesh in reloaded node.") + ## Import a file from disk + def openFile(self, filename): + self._openFile(filename) + def _openFile(self, filename): self.readLocalFile(QUrl.fromLocalFile(filename)) @@ -1514,6 +1526,8 @@ class CuraApplication(QtApplication): op.push() scene.sceneChanged.emit(node) + self.fileCompleted.emit(filename) + def addNonSliceableExtension(self, extension): self._non_sliceable_extensions.append(extension) diff --git a/cura/Scene/ConvexHullNode.py b/cura/Scene/ConvexHullNode.py index 02d8ed833c..4db31cf0ac 100644 --- a/cura/Scene/ConvexHullNode.py +++ b/cura/Scene/ConvexHullNode.py @@ -24,7 +24,10 @@ class ConvexHullNode(SceneNode): self._original_parent = parent # Color of the drawn convex hull - self._color = Color(*Application.getInstance().getTheme().getColor("convex_hull").getRgb()) + if Application.getInstance().hasGui(): + self._color = Color(*Application.getInstance().getTheme().getColor("convex_hull").getRgb()) + else: + self._color = Color(0, 0, 0) # The y-coordinate of the convex hull mesh. Must not be 0, to prevent z-fighting. self._mesh_height = 0.1 From 33da81d0d285d08c422913de94fff9050c722e87 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 15 Jan 2018 09:18:57 +0100 Subject: [PATCH 279/551] Check if scene has gcode_dict attribute before trying to get it --- plugins/PostProcessingPlugin/PostProcessingPlugin.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.py b/plugins/PostProcessingPlugin/PostProcessingPlugin.py index 657e5c5387..fa519f48be 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.py +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.py @@ -54,7 +54,11 @@ class PostProcessingPlugin(QObject, Extension): ## Execute all post-processing scripts on the gcode. def execute(self, output_device): scene = Application.getInstance().getController().getScene() - gcode_dict = getattr(scene, "gcode_dict") + gcode_dict = None + + if hasattr(scene, "gcode_dict"): + gcode_dict = getattr(scene, "gcode_dict") + if not gcode_dict: return From c5c357d1260e0fe2ec43084e815f19dd294871bc Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 11 Jan 2018 14:30:59 +0100 Subject: [PATCH 280/551] Fixed merge conflicts of cherry picking dimensions fix --- cura/CuraApplication.py | 11 +++++++++-- cura/Scene/CuraSceneController.py | 4 ++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index af6f08c175..02c5c04203 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -266,6 +266,7 @@ class CuraApplication(QtApplication): self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().toolOperationStopped.connect(self._onToolOperationStopped) self.getController().contextMenuRequested.connect(self._onContextMenuRequested) + self.getCuraSceneController().activeBuildPlateChanged.connect(self.updatePlatformActivity) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") @@ -890,12 +891,18 @@ class CuraApplication(QtApplication): def getSceneBoundingBoxString(self): 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()} + ## Update scene bounding box for current build plate def updatePlatformActivity(self, node = None): count = 0 scene_bounding_box = None is_block_slicing_node = False + active_build_plate = self.getBuildPlateModel().activeBuildPlate for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not isinstance(node, SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): + if ( + not issubclass(type(node), CuraSceneNode) or + (not node.getMeshData() and not node.callDecoration("getLayerData")) or + (node.callDecoration("getBuildPlateNumber") != active_build_plate)): + continue if node.callDecoration("isBlockSlicing"): is_block_slicing_node = True @@ -915,7 +922,7 @@ class CuraApplication(QtApplication): if not scene_bounding_box: scene_bounding_box = AxisAlignedBox.Null - if repr(self._scene_bounding_box) != repr(scene_bounding_box) and scene_bounding_box.isValid(): + if repr(self._scene_bounding_box) != repr(scene_bounding_box): self._scene_bounding_box = scene_bounding_box self.sceneBoundingBoxChanged.emit() diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index 652dc78841..a93a8769d0 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -10,9 +10,12 @@ from UM.Application import Application from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection +from UM.Signal import Signal class CuraSceneController(QObject): + activeBuildPlateChanged = Signal() + def __init__(self, objects_model: ObjectsModel, build_plate_model: BuildPlateModel): super().__init__() @@ -101,6 +104,7 @@ class CuraSceneController(QObject): self._build_plate_model.setActiveBuildPlate(nr) self._objects_model.setActiveBuildPlate(nr) + self.activeBuildPlateChanged.emit() @staticmethod def createCuraSceneController(): From 87dc3535bbbd2ad3d66b9579fcda6b375920eaec Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 09:59:02 +0100 Subject: [PATCH 281/551] Use isinstance() for SceneNode type check CURA-4525 --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 02c5c04203..ab7c093b1d 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1041,7 +1041,7 @@ class CuraApplication(QtApplication): nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) not in {SceneNode, CuraSceneNode}: + if not isinstance(node, SceneNode): continue if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. From 20e7fe911fdebb9fb74df4ae5490e1e423252504 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 10:49:38 +0100 Subject: [PATCH 282/551] Only save models on the active build plate in 3MFWriter CURA-4792 --- plugins/3MFWriter/ThreeMFWriter.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index 79b821fe31..c4b7035cf1 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -6,8 +6,9 @@ from UM.Math.Vector import Vector from UM.Logger import Logger from UM.Math.Matrix import Matrix from UM.Application import Application -import UM.Scene.SceneNode -from cura.Scene.CuraSceneNode import CuraSceneNode +from UM.Scene.SceneNode import SceneNode + +from cura.CuraApplication import CuraApplication import Savitar @@ -62,11 +63,15 @@ class ThreeMFWriter(MeshWriter): self._store_archive = store_archive ## Convenience function that converts an Uranium SceneNode object to a SavitarSceneNode - # \returns Uranium Scenen node. + # \returns Uranium Scene node. def _convertUMNodeToSavitarNode(self, um_node, transformation = Matrix()): - if type(um_node) not in [UM.Scene.SceneNode.SceneNode, CuraSceneNode]: + if not isinstance(um_node, SceneNode): return None + active_build_plate_nr = CuraApplication.getInstance().getBuildPlateModel().activeBuildPlate + if um_node.callDecoration("getBuildPlateNumber") != active_build_plate_nr: + return + savitar_node = Savitar.SceneNode() node_matrix = um_node.getLocalTransformation() @@ -97,6 +102,9 @@ class ThreeMFWriter(MeshWriter): savitar_node.setSetting(key, str(stack.getProperty(key, "value"))) for child_node in um_node.getChildren(): + # only save the nodes on the active build plate + if child_node.callDecoration("getBuildPlateNumber") != active_build_plate_nr: + continue savitar_child_node = self._convertUMNodeToSavitarNode(child_node) if savitar_child_node is not None: savitar_node.addChild(savitar_child_node) From b60903afc2d4770b367ba79074b40bbc0c304249 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 11:02:52 +0100 Subject: [PATCH 283/551] Fix setting new ID in project loading CURA-4795 --- 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 40d64590f5..5c62c361c3 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -609,7 +609,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): instance_container.setName(self._container_registry.uniqueName(instance_container.getName())) new_changes_container_id = self.getNewId(instance_container.getId()) - instance_container._id = new_changes_container_id + instance_container.setMetaDataEntry("id", new_changes_container_id) # TODO: we don't know the following is correct or not, need to verify # AND REFACTOR!!! From dc596d0e1e041dfa024702463bcf04b3a55278c3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 11:12:07 +0100 Subject: [PATCH 284/551] Only remove selectable nodes in deleteAll() CURA-4795 Otherwise, after loading a project file, all nodes including the machine will be removed and you don't see the machine any more. --- cura/CuraApplication.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ab7c093b1d..756dae2704 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1045,6 +1045,8 @@ class CuraApplication(QtApplication): continue if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. + if not node.isSelectable(): + continue # Only remove nodes that are selectable. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) nodes.append(node) From 67ca4d25cd69bae61bf0c00b7cc8dac979610a46 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 15 Jan 2018 11:35:17 +0100 Subject: [PATCH 285/551] CURA-4461 Deserialize materials with buildplates compatibility --- .../XmlMaterialProfile/XmlMaterialProfile.py | 154 ++++++++---------- 1 file changed, 65 insertions(+), 89 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 222939bddd..894377ed82 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -640,35 +640,6 @@ class XmlMaterialProfile(InstanceContainer): buildplate_map[buildplate_id]["buildplate_compatible"] = buildplate_compatibility buildplate_map[buildplate_id]["buildplate_recommended"] = buildplate_recommended - # # Same as machine compatibility, keep the derived material containers consistent with the parent - # # material - # if ContainerRegistry.getInstance().isLoaded(new_buildplate_id): - # new_buildplate_material = ContainerRegistry.getInstance().findContainers(id = new_buildplate_id)[0] - # is_new_material = False - # else: - # new_buildplate_material = XmlMaterialProfile(new_buildplate_id) - # is_new_material = True - # - # new_buildplate_material.setMetaData(copy.deepcopy(self.getMetaData())) - # new_buildplate_material.getMetaData()["id"] = new_buildplate_id - # new_buildplate_material.getMetaData()["name"] = self.getName() - # new_buildplate_material.getMetaData()["variant"] = variant_containers[0]["id"] - # new_buildplate_material.setDefinition(machine_id) - # # Don't use setMetadata, as that overrides it for all materials with same base file - # new_buildplate_material.getMetaData()["compatible"] = buildplate_compatibility - # new_buildplate_material.getMetaData()["machine_manufacturer"] = machine_manufacturer - # new_buildplate_material.getMetaData()["definition"] = machine_id - # - # cached_buildplate_setting_properties = cached_machine_setting_properties.copy() - # cached_buildplate_setting_properties.update(buildplate_setting_values) - # - # new_buildplate_material.setCachedValues(cached_buildplate_setting_properties) - # - # new_buildplate_material._dirty = False - # - # if is_new_material: - # containers_to_add.append(new_buildplate_material) - # If no buildplate was found, then the material is created without buildplate information if not buildplate_map: buildplate_map[""] = {"buildplate_compatible" : machine_compatibility, @@ -703,8 +674,8 @@ class XmlMaterialProfile(InstanceContainer): for buildplate_id in buildplate_map: - new_hotend_id = self.getId() + "_" + machine_id + "_" + hotend_id.replace(" ", "_") + \ - ("_" if buildplate_id != "" else "") + buildplate_id.replace(" ", "_") + new_hotend_id = self.getId() + "_" + machine_id + ("_" if buildplate_id != "" else "") + \ + buildplate_id.replace(" ", "_") + "_" + hotend_id.replace(" ", "_") buildplate_compatibility = buildplate_map[buildplate_id]["buildplate_compatible"] buildplate_recommended = buildplate_map[buildplate_id]["buildplate_recommended"] @@ -729,6 +700,8 @@ class XmlMaterialProfile(InstanceContainer): new_hotend_material.getMetaData()["buildplate_recommended"] = buildplate_recommended new_hotend_material.getMetaData()["machine_manufacturer"] = machine_manufacturer new_hotend_material.getMetaData()["definition"] = machine_id + # if machine_id == "ultimaker3_xl" and self.getId() == "generic_abs": + # print("&&&&&&&&&&&& HotendID", new_hotend_id) cached_hotend_setting_properties = cached_machine_setting_properties.copy() cached_hotend_setting_properties.update(hotend_setting_values) @@ -869,6 +842,40 @@ class XmlMaterialProfile(InstanceContainer): if len(found_materials) == 0: #This is a new material. result_metadata.append(new_material_metadata) + buildplates = machine.iterfind("./um:buildplate", cls.__namespaces) + buildplate_map = {} + for buildplate in buildplates: + buildplate_id = buildplate.get("id") + if buildplate_id is None: + continue + + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = buildplate_id) + if not variant_containers: + # It is not really properly defined what "ID" is so also search for variants by name. + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = machine_id, name = buildplate_id) + + if not variant_containers: + continue + + buildplate_compatibility = machine_compatibility + buildplate_recommended = machine_compatibility + settings = buildplate.iterfind("./um:setting", cls.__namespaces) + for entry in settings: + key = entry.get("key") + if key == "hardware compatible": + buildplate_compatibility = cls._parseCompatibleValue(entry.text) + elif key == "hardware recommended": + buildplate_recommended = cls._parseCompatibleValue(entry.text) + + buildplate_map[buildplate_id] = {} + buildplate_map[buildplate_id]["buildplate_compatible"] = buildplate_compatibility + buildplate_map[buildplate_id]["buildplate_recommended"] = buildplate_recommended + + # If no buildplate was found, then the material is created without buildplate information + if not buildplate_map: + buildplate_map[""] = {"buildplate_compatible": machine_compatibility, + "buildplate_recommended": machine_compatibility} + for hotend in machine.iterfind("./um:hotend", cls.__namespaces): hotend_id = hotend.get("id") if hotend_id is None: @@ -885,69 +892,38 @@ class XmlMaterialProfile(InstanceContainer): if key == "hardware compatible": hotend_compatibility = cls._parseCompatibleValue(entry.text) - new_hotend_id = container_id + "_" + machine_id + "_" + hotend_id.replace(" ", "_") + for buildplate_id in buildplate_map: - # Same as machine compatibility, keep the derived material containers consistent with the parent - # material - found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_hotend_id) - if found_materials: - new_hotend_material_metadata = found_materials[0] - else: - new_hotend_material_metadata = {} + new_hotend_id = container_id + "_" + machine_id + ("_" if buildplate_id != "" else "") + \ + buildplate_id.replace(" ", "_") + "_" + hotend_id.replace(" ", "_") - new_hotend_material_metadata.update(base_metadata) - if variant_containers: - new_hotend_material_metadata["variant"] = variant_containers[0]["id"] - else: - new_hotend_material_metadata["variant"] = hotend_id - _with_missing_variants.append(new_hotend_material_metadata) - new_hotend_material_metadata["compatible"] = hotend_compatibility - new_hotend_material_metadata["machine_manufacturer"] = machine_manufacturer - new_hotend_material_metadata["id"] = new_hotend_id - new_hotend_material_metadata["definition"] = machine_id + buildplate_compatibility = buildplate_map[buildplate_id]["buildplate_compatible"] + buildplate_recommended = buildplate_map[buildplate_id]["buildplate_recommended"] - if len(found_materials) == 0: - result_metadata.append(new_hotend_material_metadata) + # Same as machine compatibility, keep the derived material containers consistent with the parent material + found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_hotend_id) + if found_materials: + new_hotend_material_metadata = found_materials[0] + else: + new_hotend_material_metadata = {} - for buildplate in machine.iterfind("./um:buildplate", cls.__namespaces): - buildplate_id = buildplate.get("id") - if buildplate_id is None: - continue + new_hotend_material_metadata.update(base_metadata) + if variant_containers: + new_hotend_material_metadata["variant"] = variant_containers[0]["id"] + else: + new_hotend_material_metadata["variant"] = hotend_id + _with_missing_variants.append(new_hotend_material_metadata) + new_hotend_material_metadata["compatible"] = hotend_compatibility + new_hotend_material_metadata["buildplate_compatible"] = buildplate_compatibility + new_hotend_material_metadata["buildplate_recommended"] = buildplate_recommended + new_hotend_material_metadata["machine_manufacturer"] = machine_manufacturer + new_hotend_material_metadata["id"] = new_hotend_id + new_hotend_material_metadata["definition"] = machine_id + # if machine_id == "ultimaker3_xl" and container_id == "generic_abs": + # print("############# HotendID", new_hotend_id) - variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = buildplate_id) - if not variant_containers: - # It is not really properly defined what "ID" is so also search for variants by name. - variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = machine_id, name = buildplate_id) - - buildplate_compatibility = machine_compatibility - for entry in buildplate.iterfind("./um:setting", cls.__namespaces): - key = entry.get("key") - if key == "hardware compatible": - buildplate_compatibility = cls._parseCompatibleValue(entry.text) - - new_buildplate_id = container_id + "_" + machine_id + "_" + buildplate_id.replace(" ", "_") - - # Same as machine compatibility, keep the derived material containers consistent with the parent - # material - found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_buildplate_id) - if found_materials: - new_buildplate_material_metadata = found_materials[0] - else: - new_buildplate_material_metadata = {} - - new_buildplate_material_metadata.update(base_metadata) - if variant_containers: - new_buildplate_material_metadata["variant"] = variant_containers[0]["id"] - else: - new_buildplate_material_metadata["variant"] = buildplate_id - _with_missing_variants.append(new_buildplate_material_metadata) - new_buildplate_material_metadata["compatible"] = buildplate_compatibility - new_buildplate_material_metadata["machine_manufacturer"] = machine_manufacturer - new_buildplate_material_metadata["id"] = new_buildplate_id - new_buildplate_material_metadata["definition"] = machine_id - - if len(found_materials) == 0: - result_metadata.append(new_buildplate_material_metadata) + if len(found_materials) == 0: + result_metadata.append(new_hotend_material_metadata) # there is only one ID for a machine. Once we have reached here, it means we have already found # a workable ID for that machine, so there is no need to continue From 41dec889ac09fb469e3f5c77468b3db7bc3a7b9b Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 15 Jan 2018 11:52:15 +0100 Subject: [PATCH 286/551] Also emit a back-end slicing error when the job result is an actual error --- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 3272fb019d..f64dd08f3e 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -290,6 +290,7 @@ class CuraEngineBackend(QObject, Backend): self._start_slice_job = None if job.isCancelled() or job.getError() or job.getResult() == StartSliceJob.StartJobResult.Error: + self.backendStateChange.emit(BackendState.Error) return if job.getResult() == StartSliceJob.StartJobResult.MaterialIncompatible: From b4a06217dfc1a08ad86e56639b6d4b1c1b671dce Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 15 Jan 2018 13:55:35 +0100 Subject: [PATCH 287/551] Replace travel_speed with speed_travel That travel_speed is a very old setting name. I'm guessing that people were copy-pasting that from older versions of Cura. --- resources/definitions/3dator.def.json | 4 ++-- resources/definitions/alya3dp.def.json | 4 ++-- resources/definitions/anycubic_i3_mega.def.json | 4 ++-- resources/definitions/easyarts_ares.def.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/definitions/3dator.def.json b/resources/definitions/3dator.def.json index 2ec7119656..19307bfddd 100644 --- a/resources/definitions/3dator.def.json +++ b/resources/definitions/3dator.def.json @@ -47,9 +47,9 @@ "default_value": 30 }, "machine_start_gcode": { - "default_value": ";Sliced at: {day} {date} {time}\nM104 S{material_print_temperature} ;set temperatures\nM140 S{material_bed_temperature}\nM109 S{material_print_temperature} ;wait for temperatures\nM190 S{material_bed_temperature}\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 Z0 ;move Z to min endstops\nG28 X0 Y0 ;move X/Y to min endstops\nG29 ;Auto Level\nG1 Z0.6 F{travel_speed} ;move the Nozzle near the Bed\nG92 E0\nG1 Y0 ;zero the extruded length\nG1 X10 E30 F500 ;printing a Line from right to left\nG92 E0 ;zero the extruded length again\nG1 Z2\nG1 F{travel_speed}\nM117 Printing...;Put printing message on LCD screen\nM150 R255 U255 B255 P4 ;Change LED Color to white" }, + "default_value": ";Sliced at: {day} {date} {time}\nM104 S{material_print_temperature} ;set temperatures\nM140 S{material_bed_temperature}\nM109 S{material_print_temperature} ;wait for temperatures\nM190 S{material_bed_temperature}\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 Z0 ;move Z to min endstops\nG28 X0 Y0 ;move X/Y to min endstops\nG29 ;Auto Level\nG1 Z0.6 F{speed_travel} ;move the Nozzle near the Bed\nG92 E0\nG1 Y0 ;zero the extruded length\nG1 X10 E30 F500 ;printing a Line from right to left\nG92 E0 ;zero the extruded length again\nG1 Z2\nG1 F{speed_travel}\nM117 Printing...;Put printing message on LCD screen\nM150 R255 U255 B255 P4 ;Change LED Color to white" }, "machine_end_gcode": { - "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" } } } diff --git a/resources/definitions/alya3dp.def.json b/resources/definitions/alya3dp.def.json index 2fda102249..6bf5d89a95 100644 --- a/resources/definitions/alya3dp.def.json +++ b/resources/definitions/alya3dp.def.json @@ -40,10 +40,10 @@ "default_value": "RepRap" }, "machine_start_gcode": { - "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to max endstops\nG1 Z115.0 F{travel_speed} ;move th e platform up 20mm\nG28 Z0 ;move Z to max endstop\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM301 H1 P26.38 I2.57 D67.78\n;Put printing message on LCD screen\nM117 Printing..." + "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to max endstops\nG1 Z115.0 F{speed_travel} ;move th e platform up 20mm\nG28 Z0 ;move Z to max endstop\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM301 H1 P26.38 I2.57 D67.78\n;Put printing message on LCD screen\nM117 Printing..." }, "machine_end_gcode": { - "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG28 Z0\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" + "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG28 Z0\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" } } } \ No newline at end of file diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json index a0bd0efb7c..a373872de8 100644 --- a/resources/definitions/anycubic_i3_mega.def.json +++ b/resources/definitions/anycubic_i3_mega.def.json @@ -46,10 +46,10 @@ "default_value":"RepRap (Marlin/Sprinter)" }, "machine_start_gcode":{ - "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM117 Printing...\nG5" + "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\nG5" }, "machine_end_gcode":{ - "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" + "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" } } } diff --git a/resources/definitions/easyarts_ares.def.json b/resources/definitions/easyarts_ares.def.json index 982496de4c..689ac63625 100644 --- a/resources/definitions/easyarts_ares.def.json +++ b/resources/definitions/easyarts_ares.def.json @@ -10,7 +10,7 @@ }, "overrides": { "machine_start_gcode": { - "default_value": "; -- START GCODE --\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 \nG29 Z0.12 ;Auto-bedleveling with Z offset \nG92 E0 ;zero the extruded length \nG1 F2000 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM117 Printing...\n; -- end of START GCODE --" + "default_value": "; -- START GCODE --\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 \nG29 Z0.12 ;Auto-bedleveling with Z offset \nG92 E0 ;zero the extruded length \nG1 F2000 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\n; -- end of START GCODE --" }, "machine_end_gcode": { "default_value": "; -- START GCODE --\nG28 ; Home all axes\nM104 S0 ;extruder heater off\n;M140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n;M84 ;steppers off\nG90 ;absolute positioning\n; -- end of START GCODE --" From e6cd6c264590d0dac42980cec6dc61f3f2346c98 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 15 Jan 2018 13:55:35 +0100 Subject: [PATCH 288/551] Replace travel_speed with speed_travel That travel_speed is a very old setting name. I'm guessing that people were copy-pasting that from older versions of Cura. --- resources/definitions/3dator.def.json | 4 ++-- resources/definitions/alya3dp.def.json | 4 ++-- resources/definitions/anycubic_i3_mega.def.json | 4 ++-- resources/definitions/easyarts_ares.def.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/definitions/3dator.def.json b/resources/definitions/3dator.def.json index 2ec7119656..19307bfddd 100644 --- a/resources/definitions/3dator.def.json +++ b/resources/definitions/3dator.def.json @@ -47,9 +47,9 @@ "default_value": 30 }, "machine_start_gcode": { - "default_value": ";Sliced at: {day} {date} {time}\nM104 S{material_print_temperature} ;set temperatures\nM140 S{material_bed_temperature}\nM109 S{material_print_temperature} ;wait for temperatures\nM190 S{material_bed_temperature}\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 Z0 ;move Z to min endstops\nG28 X0 Y0 ;move X/Y to min endstops\nG29 ;Auto Level\nG1 Z0.6 F{travel_speed} ;move the Nozzle near the Bed\nG92 E0\nG1 Y0 ;zero the extruded length\nG1 X10 E30 F500 ;printing a Line from right to left\nG92 E0 ;zero the extruded length again\nG1 Z2\nG1 F{travel_speed}\nM117 Printing...;Put printing message on LCD screen\nM150 R255 U255 B255 P4 ;Change LED Color to white" }, + "default_value": ";Sliced at: {day} {date} {time}\nM104 S{material_print_temperature} ;set temperatures\nM140 S{material_bed_temperature}\nM109 S{material_print_temperature} ;wait for temperatures\nM190 S{material_bed_temperature}\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 Z0 ;move Z to min endstops\nG28 X0 Y0 ;move X/Y to min endstops\nG29 ;Auto Level\nG1 Z0.6 F{speed_travel} ;move the Nozzle near the Bed\nG92 E0\nG1 Y0 ;zero the extruded length\nG1 X10 E30 F500 ;printing a Line from right to left\nG92 E0 ;zero the extruded length again\nG1 Z2\nG1 F{speed_travel}\nM117 Printing...;Put printing message on LCD screen\nM150 R255 U255 B255 P4 ;Change LED Color to white" }, "machine_end_gcode": { - "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" } } } diff --git a/resources/definitions/alya3dp.def.json b/resources/definitions/alya3dp.def.json index 2fda102249..6bf5d89a95 100644 --- a/resources/definitions/alya3dp.def.json +++ b/resources/definitions/alya3dp.def.json @@ -40,10 +40,10 @@ "default_value": "RepRap" }, "machine_start_gcode": { - "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to max endstops\nG1 Z115.0 F{travel_speed} ;move th e platform up 20mm\nG28 Z0 ;move Z to max endstop\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM301 H1 P26.38 I2.57 D67.78\n;Put printing message on LCD screen\nM117 Printing..." + "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to max endstops\nG1 Z115.0 F{speed_travel} ;move th e platform up 20mm\nG28 Z0 ;move Z to max endstop\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM301 H1 P26.38 I2.57 D67.78\n;Put printing message on LCD screen\nM117 Printing..." }, "machine_end_gcode": { - "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG28 Z0\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" + "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG28 Z0\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" } } } \ No newline at end of file diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json index a0bd0efb7c..a373872de8 100644 --- a/resources/definitions/anycubic_i3_mega.def.json +++ b/resources/definitions/anycubic_i3_mega.def.json @@ -46,10 +46,10 @@ "default_value":"RepRap (Marlin/Sprinter)" }, "machine_start_gcode":{ - "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM117 Printing...\nG5" + "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\nG5" }, "machine_end_gcode":{ - "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" + "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" } } } diff --git a/resources/definitions/easyarts_ares.def.json b/resources/definitions/easyarts_ares.def.json index 982496de4c..689ac63625 100644 --- a/resources/definitions/easyarts_ares.def.json +++ b/resources/definitions/easyarts_ares.def.json @@ -10,7 +10,7 @@ }, "overrides": { "machine_start_gcode": { - "default_value": "; -- START GCODE --\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 \nG29 Z0.12 ;Auto-bedleveling with Z offset \nG92 E0 ;zero the extruded length \nG1 F2000 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM117 Printing...\n; -- end of START GCODE --" + "default_value": "; -- START GCODE --\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 \nG29 Z0.12 ;Auto-bedleveling with Z offset \nG92 E0 ;zero the extruded length \nG1 F2000 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\n; -- end of START GCODE --" }, "machine_end_gcode": { "default_value": "; -- START GCODE --\nG28 ; Home all axes\nM104 S0 ;extruder heater off\n;M140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n;M84 ;steppers off\nG90 ;absolute positioning\n; -- end of START GCODE --" From 4abbd4b9887fc3e3d98ebf06481d2b21a9e9be0e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 13:19:28 +0100 Subject: [PATCH 289/551] Show custom qualities based on not supported CURA-4796 --- cura/QualityManager.py | 3 +++ cura/Settings/ProfilesModel.py | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index 76a0c86a5f..d984bd17a1 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -136,6 +136,9 @@ class QualityManager: if basic_materials: result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) + empty_quality = ContainerRegistry.getInstance().findInstanceContainers(id = "empty_quality")[0] + result.append(empty_quality) + return result ## Find all quality changes for a machine. diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 3b43e2740a..cf58a49905 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -36,6 +36,8 @@ class ProfilesModel(InstanceContainersModel): Application.getInstance().getMachineManager().activeStackChanged.connect(self._update) Application.getInstance().getMachineManager().activeMaterialChanged.connect(self._update) + self._empty_quality = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] + # Factory function, used by QML @staticmethod def createProfilesModel(engine, js_engine): @@ -72,11 +74,18 @@ class ProfilesModel(InstanceContainersModel): # The actual list of quality profiles come from the first extruder in the extruder list. result = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) + # append empty quality if it's not there + if not any(q.getId() == self._empty_quality.getId() for q in result): + result.append(self._empty_quality) + # The usable quality types are set quality_type_set = set([x.getMetaDataEntry("quality_type") for x in result]) # Fetch all qualities available for this machine and the materials selected in extruders all_qualities = QualityManager.getInstance().findAllQualitiesForMachineAndMaterials(global_stack_definition, materials) + # append empty quality if it's not there + if not any(q.getId() == self._empty_quality.getId() for q in all_qualities): + all_qualities.append(self._empty_quality) # If in the all qualities there is some of them that are not available due to incompatibility with materials # we also add it so that they will appear in the slide quality bar. However in recomputeItems will be marked as @@ -85,13 +94,7 @@ class ProfilesModel(InstanceContainersModel): if quality.getMetaDataEntry("quality_type") not in quality_type_set: result.append(quality) - # if still profiles are found, add a single empty_quality ("Not supported") instance to the drop down list - if len(result) == 0: - # If not qualities are found we dynamically create a not supported container for this machine + material combination - not_supported_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] - result.append(not_supported_container) - - return {item.getId():item for item in result}, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. + return {item.getId(): item for item in result}, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. ## Re-computes the items in this model, and adds the layer height role. def _recomputeItems(self): @@ -114,7 +117,6 @@ class ProfilesModel(InstanceContainersModel): # active machine and material, and later yield the right ones. tmp_all_quality_items = OrderedDict() for item in super()._recomputeItems(): - profiles = container_registry.findContainersMetadata(id = item["id"]) if not profiles or "quality_type" not in profiles[0]: quality_type = "" From 1d104f367d1e23e8f99ee56066a951e279fbf797 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 13:20:10 +0100 Subject: [PATCH 290/551] Do not show not supported in profile manager CURA-4796 --- cura/Settings/QualityAndUserProfilesModel.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index bc81df976b..d6a9b3f719 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -42,5 +42,7 @@ class QualityAndUserProfilesModel(ProfilesModel): qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())} result = filtered_quality_changes - result.update({q.getId():q for q in quality_list}) + for q in quality_list: + if q.getId() != "empty_quality": + result[q.getId()] = q return result, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. \ No newline at end of file From a3c26356485ac350b7da1622188d46ae8a267c82 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 14:22:28 +0100 Subject: [PATCH 291/551] Fix profile manager to support not supported custom profiles CURA-4796 Profile manager should be able to show custom profiles that are based on the not supported profile correctly. --- cura/CuraApplication.py | 1 + cura/Settings/QualityAndUserProfilesModel.py | 2 +- cura/Settings/QualitySettingsModel.py | 123 ++++++++++--------- resources/qml/Preferences/ProfilesPage.qml | 4 +- 4 files changed, 70 insertions(+), 60 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 756dae2704..53b65e3d1b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -805,6 +805,7 @@ class CuraApplication(QtApplication): qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type") + qmlRegisterType(InstanceContainer, "Cura", 1, 0, "InstanceContainer") qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") qmlRegisterSingletonType(ProfilesModel, "Cura", 1, 0, "ProfilesModel", ProfilesModel.createProfilesModel) diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index d6a9b3f719..8396e62417 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -45,4 +45,4 @@ class QualityAndUserProfilesModel(ProfilesModel): for q in quality_list: if q.getId() != "empty_quality": result[q.getId()] = q - return result, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. \ No newline at end of file + return result, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. diff --git a/cura/Settings/QualitySettingsModel.py b/cura/Settings/QualitySettingsModel.py index 243fd146dc..0e17237ff7 100644 --- a/cura/Settings/QualitySettingsModel.py +++ b/cura/Settings/QualitySettingsModel.py @@ -1,8 +1,6 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import collections - from PyQt5.QtCore import pyqtProperty, pyqtSignal, Qt from UM.Logger import Logger @@ -42,6 +40,8 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): self.addRoleName(self.UserValueRole, "user_value") self.addRoleName(self.CategoryRole, "category") + self._empty_quality = self._container_registry.findInstanceContainers(id = "empty_quality")[0] + def setExtruderId(self, extruder_id): if extruder_id != self._extruder_id: self._extruder_id = extruder_id @@ -107,77 +107,87 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): else: quality_changes_container = containers[0] - criteria = { - "type": "quality", - "quality_type": quality_changes_container.getMetaDataEntry("quality_type"), - "definition": quality_changes_container.getDefinition().getId() - } + if quality_changes_container.getMetaDataEntry("quality_type") == "not_supported": + quality_container = self._empty_quality + else: + criteria = { + "type": "quality", + "quality_type": quality_changes_container.getMetaDataEntry("quality_type"), + "definition": quality_changes_container.getDefinition().getId() + } - quality_container = self._container_registry.findInstanceContainers(**criteria) - if not quality_container: - Logger.log("w", "Could not find a quality container matching quality changes %s", quality_changes_container.getId()) - return - quality_container = quality_container[0] + quality_container = self._container_registry.findInstanceContainers(**criteria) + if not quality_container: + Logger.log("w", "Could not find a quality container matching quality changes %s", quality_changes_container.getId()) + return + + quality_container = quality_container[0] quality_type = quality_container.getMetaDataEntry("quality_type") - definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(quality_container.getDefinition()) - definition = quality_container.getDefinition() - # Check if the definition container has a translation file. - definition_suffix = ContainerRegistry.getMimeTypeForContainer(type(definition)).preferredSuffix - catalog = i18nCatalog(os.path.basename(definition_id + "." + definition_suffix)) - if catalog.hasTranslationLoaded(): - self._i18n_catalog = catalog + if quality_type == "not_supported": + containers = [] + else: + definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(quality_container.getDefinition()) + definition = quality_container.getDefinition() - for file_name in quality_container.getDefinition().getInheritedFiles(): - catalog = i18nCatalog(os.path.basename(file_name)) + # Check if the definition container has a translation file. + definition_suffix = ContainerRegistry.getMimeTypeForContainer(type(definition)).preferredSuffix + catalog = i18nCatalog(os.path.basename(definition_id + "." + definition_suffix)) if catalog.hasTranslationLoaded(): self._i18n_catalog = catalog - criteria = {"type": "quality", "quality_type": quality_type, "definition": definition_id} + for file_name in quality_container.getDefinition().getInheritedFiles(): + catalog = i18nCatalog(os.path.basename(file_name)) + if catalog.hasTranslationLoaded(): + self._i18n_catalog = catalog - if self._material_id and self._material_id != "empty_material": - criteria["material"] = self._material_id + criteria = {"type": "quality", "quality_type": quality_type, "definition": definition_id} - criteria["extruder"] = self._extruder_id + if self._material_id and self._material_id != "empty_material": + criteria["material"] = self._material_id - containers = self._container_registry.findInstanceContainers(**criteria) - if not containers: - # Try again, this time without extruder - new_criteria = criteria.copy() - new_criteria.pop("extruder") - containers = self._container_registry.findInstanceContainers(**new_criteria) + criteria["extruder"] = self._extruder_id - if not containers and "material" in criteria: - # Try again, this time without material - criteria.pop("material", None) containers = self._container_registry.findInstanceContainers(**criteria) + if not containers: + # Try again, this time without extruder + new_criteria = criteria.copy() + new_criteria.pop("extruder") + containers = self._container_registry.findInstanceContainers(**new_criteria) - if not containers: - # Try again, this time without material or extruder - criteria.pop("extruder") # "material" has already been popped - containers = self._container_registry.findInstanceContainers(**criteria) + if not containers and "material" in criteria: + # Try again, this time without material + criteria.pop("material", None) + containers = self._container_registry.findInstanceContainers(**criteria) - if not containers: - Logger.log("w", "Could not find any quality containers matching the search criteria %s" % str(criteria)) - return + if not containers: + # Try again, this time without material or extruder + criteria.pop("extruder") # "material" has already been popped + containers = self._container_registry.findInstanceContainers(**criteria) + + if not containers: + Logger.log("w", "Could not find any quality containers matching the search criteria %s" % str(criteria)) + return if quality_changes_container: - criteria = {"type": "quality_changes", "quality_type": quality_type, "definition": definition_id, "name": quality_changes_container.getName()} - if self._extruder_definition_id != "": - extruder_definitions = self._container_registry.findDefinitionContainers(id = self._extruder_definition_id) - if extruder_definitions: - criteria["extruder"] = Application.getInstance().getMachineManager().getQualityDefinitionId(extruder_definitions[0]) - criteria["name"] = quality_changes_container.getName() + if quality_type == "not_supported": + criteria = {"type": "quality_changes", "quality_type": quality_type, "name": quality_changes_container.getName()} else: - criteria["extruder"] = None + criteria = {"type": "quality_changes", "quality_type": quality_type, "definition": definition_id, "name": quality_changes_container.getName()} + if self._extruder_definition_id != "": + extruder_definitions = self._container_registry.findDefinitionContainers(id = self._extruder_definition_id) + if extruder_definitions: + criteria["extruder"] = Application.getInstance().getMachineManager().getQualityDefinitionId(extruder_definitions[0]) + criteria["name"] = quality_changes_container.getName() + else: + criteria["extruder"] = None changes = self._container_registry.findInstanceContainers(**criteria) if changes: containers.extend(changes) global_container_stack = Application.getInstance().getGlobalContainerStack() - is_multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 current_category = "" for definition in definition_container.findDefinitions(): @@ -213,15 +223,14 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): if profile_value is None and user_value is None: continue - if is_multi_extrusion: - settable_per_extruder = global_container_stack.getProperty(definition.key, "settable_per_extruder") - # If a setting is not settable per extruder (global) and we're looking at an extruder tab, don't show this value. - if self._extruder_id != "" and not settable_per_extruder: - continue + settable_per_extruder = global_container_stack.getProperty(definition.key, "settable_per_extruder") + # If a setting is not settable per extruder (global) and we're looking at an extruder tab, don't show this value. + if self._extruder_id != "" and not settable_per_extruder: + continue - # If a setting is settable per extruder (not global) and we're looking at global tab, don't show this value. - if self._extruder_id == "" and settable_per_extruder: - continue + # If a setting is settable per extruder (not global) and we're looking at global tab, don't show this value. + if self._extruder_id == "" and settable_per_extruder: + continue label = definition.label if self._i18n_catalog: diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index e3ba9b23a4..5e040cdba2 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -213,8 +213,8 @@ UM.ManagementPage ProfileTab { title: catalog.i18nc("@title:tab", "Global Settings"); - quality: base.currentItem != null ? base.currentItem.id : ""; - material: Cura.MachineManager.allActiveMaterialIds[Cura.MachineManager.activeMachineId] + quality: Cura.MachineManager.activeMachine.qualityChanges.id + material: Cura.MachineManager.activeMachine.material.id } Repeater From 03bd4d8d22f8fb92d028c45838a6f8be4c8174a4 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 14:28:16 +0100 Subject: [PATCH 292/551] Fix profile menu text for custom profiles based on not supported CURA-4796 --- resources/qml/Settings/SettingView.qml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 6929614830..8cecd81099 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -63,11 +63,9 @@ Item menu: ProfileMenu { } function generateActiveQualityText () { - var result = catalog.i18nc("@", "No Profile Available") // default text + result = Cura.MachineManager.activeQualityName if (Cura.MachineManager.isActiveQualitySupported ) { - result = Cura.MachineManager.activeQualityName - if (Cura.MachineManager.activeQualityLayerHeight > 0) { result += " " result += " - " From badf5a9043dd8cb7649faab3b758384f3044392b Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 15 Jan 2018 14:31:52 +0100 Subject: [PATCH 293/551] CURA-4461 Store buildplate compatibility in the material profile --- .../XmlMaterialProfile/XmlMaterialProfile.py | 138 ++++++++---------- 1 file changed, 57 insertions(+), 81 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 894377ed82..4babbeae77 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -606,8 +606,11 @@ class XmlMaterialProfile(InstanceContainer): if is_new_material: containers_to_add.append(new_material) + # Find the buildplates compatibility buildplates = machine.iterfind("./um:buildplate", self.__namespaces) buildplate_map = {} + buildplate_map["buildplate_compatible"] = {} + buildplate_map["buildplate_recommended"] = {} for buildplate in buildplates: buildplate_id = buildplate.get("id") if buildplate_id is None: @@ -636,14 +639,8 @@ class XmlMaterialProfile(InstanceContainer): else: Logger.log("d", "Unsupported material setting %s", key) - buildplate_map[buildplate_id] = {} - buildplate_map[buildplate_id]["buildplate_compatible"] = buildplate_compatibility - buildplate_map[buildplate_id]["buildplate_recommended"] = buildplate_recommended - - # If no buildplate was found, then the material is created without buildplate information - if not buildplate_map: - buildplate_map[""] = {"buildplate_compatible" : machine_compatibility, - "buildplate_recommended" : machine_compatibility} + buildplate_map["buildplate_compatible"][buildplate_id] = buildplate_compatibility + buildplate_map["buildplate_recommended"][buildplate_id] = buildplate_recommended hotends = machine.iterfind("./um:hotend", self.__namespaces) for hotend in hotends: @@ -672,46 +669,38 @@ class XmlMaterialProfile(InstanceContainer): else: Logger.log("d", "Unsupported material setting %s", key) - for buildplate_id in buildplate_map: + new_hotend_id = self.getId() + "_" + machine_id + "_" + hotend_id.replace(" ", "_") - new_hotend_id = self.getId() + "_" + machine_id + ("_" if buildplate_id != "" else "") + \ - buildplate_id.replace(" ", "_") + "_" + hotend_id.replace(" ", "_") + # Same as machine compatibility, keep the derived material containers consistent with the parent material + if ContainerRegistry.getInstance().isLoaded(new_hotend_id): + new_hotend_material = ContainerRegistry.getInstance().findContainers(id = new_hotend_id)[0] + is_new_material = False + else: + new_hotend_material = XmlMaterialProfile(new_hotend_id) + is_new_material = True - buildplate_compatibility = buildplate_map[buildplate_id]["buildplate_compatible"] - buildplate_recommended = buildplate_map[buildplate_id]["buildplate_recommended"] + new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) + new_hotend_material.getMetaData()["id"] = new_hotend_id + new_hotend_material.getMetaData()["name"] = self.getName() + new_hotend_material.getMetaData()["variant"] = variant_containers[0]["id"] + new_hotend_material.setDefinition(machine_id) + # Don't use setMetadata, as that overrides it for all materials with same base file + new_hotend_material.getMetaData()["compatible"] = hotend_compatibility + new_hotend_material.getMetaData()["machine_manufacturer"] = machine_manufacturer + new_hotend_material.getMetaData()["definition"] = machine_id + if buildplate_map["buildplate_compatible"]: + new_hotend_material.getMetaData()["buildplate_compatible"] = buildplate_map["buildplate_compatible"] + new_hotend_material.getMetaData()["buildplate_recommended"] = buildplate_map["buildplate_recommended"] - # Same as machine compatibility, keep the derived material containers consistent with the parent - # material - if ContainerRegistry.getInstance().isLoaded(new_hotend_id): - new_hotend_material = ContainerRegistry.getInstance().findContainers(id = new_hotend_id)[0] - is_new_material = False - else: - new_hotend_material = XmlMaterialProfile(new_hotend_id) - is_new_material = True + cached_hotend_setting_properties = cached_machine_setting_properties.copy() + cached_hotend_setting_properties.update(hotend_setting_values) - new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) - new_hotend_material.getMetaData()["id"] = new_hotend_id - new_hotend_material.getMetaData()["name"] = self.getName() - new_hotend_material.getMetaData()["variant"] = variant_containers[0]["id"] - new_hotend_material.setDefinition(machine_id) - # Don't use setMetadata, as that overrides it for all materials with same base file - new_hotend_material.getMetaData()["compatible"] = hotend_compatibility - new_hotend_material.getMetaData()["buildplate_compatible"] = buildplate_compatibility - new_hotend_material.getMetaData()["buildplate_recommended"] = buildplate_recommended - new_hotend_material.getMetaData()["machine_manufacturer"] = machine_manufacturer - new_hotend_material.getMetaData()["definition"] = machine_id - # if machine_id == "ultimaker3_xl" and self.getId() == "generic_abs": - # print("&&&&&&&&&&&& HotendID", new_hotend_id) + new_hotend_material.setCachedValues(cached_hotend_setting_properties) - cached_hotend_setting_properties = cached_machine_setting_properties.copy() - cached_hotend_setting_properties.update(hotend_setting_values) + new_hotend_material._dirty = False - new_hotend_material.setCachedValues(cached_hotend_setting_properties) - - new_hotend_material._dirty = False - - if is_new_material: - containers_to_add.append(new_hotend_material) + if is_new_material: + containers_to_add.append(new_hotend_material) # there is only one ID for a machine. Once we have reached here, it means we have already found # a workable ID for that machine, so there is no need to continue @@ -844,6 +833,8 @@ class XmlMaterialProfile(InstanceContainer): buildplates = machine.iterfind("./um:buildplate", cls.__namespaces) buildplate_map = {} + buildplate_map["buildplate_compatible"] = {} + buildplate_map["buildplate_recommended"] = {} for buildplate in buildplates: buildplate_id = buildplate.get("id") if buildplate_id is None: @@ -857,8 +848,6 @@ class XmlMaterialProfile(InstanceContainer): if not variant_containers: continue - buildplate_compatibility = machine_compatibility - buildplate_recommended = machine_compatibility settings = buildplate.iterfind("./um:setting", cls.__namespaces) for entry in settings: key = entry.get("key") @@ -867,14 +856,8 @@ class XmlMaterialProfile(InstanceContainer): elif key == "hardware recommended": buildplate_recommended = cls._parseCompatibleValue(entry.text) - buildplate_map[buildplate_id] = {} - buildplate_map[buildplate_id]["buildplate_compatible"] = buildplate_compatibility - buildplate_map[buildplate_id]["buildplate_recommended"] = buildplate_recommended - - # If no buildplate was found, then the material is created without buildplate information - if not buildplate_map: - buildplate_map[""] = {"buildplate_compatible": machine_compatibility, - "buildplate_recommended": machine_compatibility} + buildplate_map["buildplate_compatible"][buildplate_id] = buildplate_map["buildplate_compatible"] + buildplate_map["buildplate_recommended"][buildplate_id] = buildplate_map["buildplate_recommended"] for hotend in machine.iterfind("./um:hotend", cls.__namespaces): hotend_id = hotend.get("id") @@ -892,38 +875,31 @@ class XmlMaterialProfile(InstanceContainer): if key == "hardware compatible": hotend_compatibility = cls._parseCompatibleValue(entry.text) - for buildplate_id in buildplate_map: + new_hotend_id = container_id + "_" + machine_id + "_" + hotend_id.replace(" ", "_") - new_hotend_id = container_id + "_" + machine_id + ("_" if buildplate_id != "" else "") + \ - buildplate_id.replace(" ", "_") + "_" + hotend_id.replace(" ", "_") + # Same as machine compatibility, keep the derived material containers consistent with the parent material + found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_hotend_id) + if found_materials: + new_hotend_material_metadata = found_materials[0] + else: + new_hotend_material_metadata = {} - buildplate_compatibility = buildplate_map[buildplate_id]["buildplate_compatible"] - buildplate_recommended = buildplate_map[buildplate_id]["buildplate_recommended"] + new_hotend_material_metadata.update(base_metadata) + if variant_containers: + new_hotend_material_metadata["variant"] = variant_containers[0]["id"] + else: + new_hotend_material_metadata["variant"] = hotend_id + _with_missing_variants.append(new_hotend_material_metadata) + new_hotend_material_metadata["compatible"] = hotend_compatibility + new_hotend_material_metadata["machine_manufacturer"] = machine_manufacturer + new_hotend_material_metadata["id"] = new_hotend_id + new_hotend_material_metadata["definition"] = machine_id + if buildplate_map["buildplate_compatible"]: + new_hotend_material_metadata["buildplate_compatible"] = buildplate_map["buildplate_compatible"] + new_hotend_material_metadata["buildplate_recommended"] = buildplate_map["buildplate_recommended"] - # Same as machine compatibility, keep the derived material containers consistent with the parent material - found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_hotend_id) - if found_materials: - new_hotend_material_metadata = found_materials[0] - else: - new_hotend_material_metadata = {} - - new_hotend_material_metadata.update(base_metadata) - if variant_containers: - new_hotend_material_metadata["variant"] = variant_containers[0]["id"] - else: - new_hotend_material_metadata["variant"] = hotend_id - _with_missing_variants.append(new_hotend_material_metadata) - new_hotend_material_metadata["compatible"] = hotend_compatibility - new_hotend_material_metadata["buildplate_compatible"] = buildplate_compatibility - new_hotend_material_metadata["buildplate_recommended"] = buildplate_recommended - new_hotend_material_metadata["machine_manufacturer"] = machine_manufacturer - new_hotend_material_metadata["id"] = new_hotend_id - new_hotend_material_metadata["definition"] = machine_id - # if machine_id == "ultimaker3_xl" and container_id == "generic_abs": - # print("############# HotendID", new_hotend_id) - - if len(found_materials) == 0: - result_metadata.append(new_hotend_material_metadata) + if len(found_materials) == 0: + result_metadata.append(new_hotend_material_metadata) # there is only one ID for a machine. Once we have reached here, it means we have already found # a workable ID for that machine, so there is no need to continue From 5280501660e3ad6ded329f6263aa0df2f2e5bcf3 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 15 Jan 2018 14:40:01 +0100 Subject: [PATCH 294/551] Fix for CURA-4789 `deleteAll()` within `CuraApplication.py` used to only delete all scene nodes but now also resets the print information, as deleting all scene nodes _should_ do that by default. Timer now resets to 0, and project name is reset. --- cura/CuraApplication.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 53b65e3d1b..428a26f956 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -647,10 +647,10 @@ class CuraApplication(QtApplication): if parsed_args["help"]: parser.print_help() sys.exit(0) - + def run(self): self.preRun() - + self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene...")) self._setUpSingleInstanceServer() @@ -1060,6 +1060,9 @@ class CuraApplication(QtApplication): op.push() Selection.clear() + Logger.log("i", "Reseting print information") + self._print_information = PrintInformation.PrintInformation() + self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate ## Reset all translation on nodes with mesh data. From 784707bb85347e79fb7030e84bfabc29b0371724 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 14:40:37 +0100 Subject: [PATCH 295/551] Stay on the same build plate after everything is removed CURA-4795 --- cura/CuraApplication.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 428a26f956..099c71c708 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1063,7 +1063,8 @@ class CuraApplication(QtApplication): Logger.log("i", "Reseting print information") self._print_information = PrintInformation.PrintInformation() - self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate + # stay on the same build plate + #self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate ## Reset all translation on nodes with mesh data. @pyqtSlot() From 9a5b2158143b816067cc947f8357419b5be05d15 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 15:16:41 +0100 Subject: [PATCH 296/551] Do not show not supported when there are supported profiles CURA-4796 --- cura/Settings/ProfilesModel.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index cf58a49905..15b123d12f 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -74,18 +74,11 @@ class ProfilesModel(InstanceContainersModel): # The actual list of quality profiles come from the first extruder in the extruder list. result = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) - # append empty quality if it's not there - if not any(q.getId() == self._empty_quality.getId() for q in result): - result.append(self._empty_quality) - # The usable quality types are set quality_type_set = set([x.getMetaDataEntry("quality_type") for x in result]) # Fetch all qualities available for this machine and the materials selected in extruders all_qualities = QualityManager.getInstance().findAllQualitiesForMachineAndMaterials(global_stack_definition, materials) - # append empty quality if it's not there - if not any(q.getId() == self._empty_quality.getId() for q in all_qualities): - all_qualities.append(self._empty_quality) # If in the all qualities there is some of them that are not available due to incompatibility with materials # we also add it so that they will appear in the slide quality bar. However in recomputeItems will be marked as @@ -94,6 +87,9 @@ class ProfilesModel(InstanceContainersModel): if quality.getMetaDataEntry("quality_type") not in quality_type_set: result.append(quality) + if len(result) > 1: + result.remove(self._empty_quality) + return {item.getId(): item for item in result}, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. ## Re-computes the items in this model, and adds the layer height role. From 616615067c20f03f7491d1bbf0a49cdcd0577613 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 15:17:14 +0100 Subject: [PATCH 297/551] Fix quality name in selected profile box CURA-4796 --- resources/qml/Settings/SettingView.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 8cecd81099..57e613a00f 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -63,9 +63,9 @@ Item menu: ProfileMenu { } function generateActiveQualityText () { - result = Cura.MachineManager.activeQualityName + var result = Cura.MachineManager.activeQualityName; - if (Cura.MachineManager.isActiveQualitySupported ) { + if (Cura.MachineManager.isActiveQualitySupported) { if (Cura.MachineManager.activeQualityLayerHeight > 0) { result += " " result += " - " From f823a98708dd3eed2485ff412d3fe2dd03a31f35 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 15 Jan 2018 15:39:25 +0100 Subject: [PATCH 298/551] Fix: Cura update setting after delay CURA-4785 --- .../{AutoSave => BigFlameGraph}/plugin.json | 0 resources/qml/Settings/SettingTextField.qml | 21 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) rename plugins/{AutoSave => BigFlameGraph}/plugin.json (100%) diff --git a/plugins/AutoSave/plugin.json b/plugins/BigFlameGraph/plugin.json similarity index 100% rename from plugins/AutoSave/plugin.json rename to plugins/BigFlameGraph/plugin.json diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 176a4e23e6..cf5d1cd7f0 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -102,6 +102,17 @@ SettingItem TextInput { + Timer + { + id: inputTimer + interval: 1000 + running: false + repeat: false + onTriggered: { + propertyProvider.setPropertyValue("value", input.text) + } + } + id: input anchors @@ -131,15 +142,7 @@ SettingItem } if (textHasChanged) { - propertyProvider.setPropertyValue("value", text) - } - } - - onEditingFinished: - { - if (textHasChanged) - { - propertyProvider.setPropertyValue("value", text) + inputTimer.restart() } } From 38ae75637a7445cd66eaedbec8562531698feb37 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 15 Jan 2018 16:15:36 +0100 Subject: [PATCH 299/551] Revert "Fix: Cura update setting after delay" This reverts commit f823a98708dd3eed2485ff412d3fe2dd03a31f35. --- .../{BigFlameGraph => AutoSave}/plugin.json | 0 resources/qml/Settings/SettingTextField.qml | 21 ++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) rename plugins/{BigFlameGraph => AutoSave}/plugin.json (100%) diff --git a/plugins/BigFlameGraph/plugin.json b/plugins/AutoSave/plugin.json similarity index 100% rename from plugins/BigFlameGraph/plugin.json rename to plugins/AutoSave/plugin.json diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index cf5d1cd7f0..176a4e23e6 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -102,17 +102,6 @@ SettingItem TextInput { - Timer - { - id: inputTimer - interval: 1000 - running: false - repeat: false - onTriggered: { - propertyProvider.setPropertyValue("value", input.text) - } - } - id: input anchors @@ -142,7 +131,15 @@ SettingItem } if (textHasChanged) { - inputTimer.restart() + propertyProvider.setPropertyValue("value", text) + } + } + + onEditingFinished: + { + if (textHasChanged) + { + propertyProvider.setPropertyValue("value", text) } } From e51eaab08e3723d23da464f6175b8cb0687b38d7 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 15 Jan 2018 16:33:15 +0100 Subject: [PATCH 300/551] CURA-4461 Don't allow Cura to Slice when the buildplate is not compatible with the material --- plugins/CuraEngineBackend/StartSliceJob.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index b0e19e7f39..4c27485883 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -122,6 +122,11 @@ class StartSliceJob(Job): self.setResult(StartJobResult.BuildPlateError) return + # Don't slice if the buildplate or the nozzle type is incompatible with the materials + if not Application.getInstance().getMachineManager().variantBuildplateCompatible: + self.setResult(StartJobResult.MaterialIncompatible) + return + for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): material = extruder_stack.findContainer({"type": "material"}) if material: From 064a8e6f6c4b2b8a209b0be2566d67a5fc8b22c3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 15 Jan 2018 16:41:33 +0100 Subject: [PATCH 301/551] Elide labels next to checkboxes To the available width, if there is a width. This won't work for right-to-left languages though... Contributes to issue CURA-4692. --- resources/themes/cura-light/styles.qml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml index 7532f0dfaf..20f858c238 100755 --- a/resources/themes/cura-light/styles.qml +++ b/resources/themes/cura-light/styles.qml @@ -864,9 +864,10 @@ QtObject { } } label: Label { - text: control.text; - color: Theme.getColor("checkbox_text"); - font: Theme.getFont("default"); + text: control.text + color: Theme.getColor("checkbox_text") + font: Theme.getFont("default") + elide: Text.ElideRight } } } From 9a3c9921ca32feab5bf68ebea0a8f464f091b9b9 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 15 Jan 2018 17:21:43 +0100 Subject: [PATCH 302/551] Fix: remove unnecesary cura slice request CURA-4785 --- resources/qml/Settings/SettingTextField.qml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 181cb9cb77..9056bbe45a 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -135,14 +135,6 @@ SettingItem } } - onEditingFinished: - { - if (textHasChanged) - { - propertyProvider.setPropertyValue("value", text) - } - } - onActiveFocusChanged: { if(activeFocus) From 0f497545bc5a88715b0ffd0db7f99d991c4b144c Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 15 Jan 2018 18:00:49 +0100 Subject: [PATCH 303/551] CURA-4461 Create properties to know when a buildplate is compatible or usable. Show colors indicating the compatibility. Also minor fixes --- cura/Settings/MachineManager.py | 43 +++++++++++++++++++++- plugins/CuraEngineBackend/StartSliceJob.py | 3 +- resources/qml/SidebarHeader.qml | 3 ++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 526a9ab1b0..56c43c7f3d 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -872,7 +872,7 @@ class MachineManager(QObject): Logger.log("d", "Active buildplate changed to {active_variant_buildplate_id}".format(active_variant_buildplate_id = containers[0].getId())) # Force set the active quality as it is so the values are updated - self.setActiveQuality(self._active_container_stack.quality.getId()) + self.setActiveMaterial(self._active_container_stack.material.getId()) else: Logger.log("w", "While trying to set the active buildplate, no buildplate was found to replace.") @@ -1262,6 +1262,47 @@ class MachineManager(QObject): return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_variant_buildplates", False)) return False + ## The selected buildplate is compatible if it is compatible with all the materials in all the extruders + @pyqtProperty(bool, notify = activeMaterialChanged) + def variantBuildplateCompatible(self) -> bool: + if not self._global_container_stack: + return True + + buildplate_compatible = True # It is compatible by default + extruder_stacks = self._global_container_stack.extruders.values() + for stack in extruder_stacks: + material_container = stack.material + if material_container == self._empty_material_container: + continue + if material_container.getMetaDataEntry("buildplate_compatible"): + buildplate_compatible = buildplate_compatible and material_container.getMetaDataEntry("buildplate_compatible")[self.activeVariantBuildplateName] + + return buildplate_compatible + + ## The selected buildplate is usable if it is usable for all materials OR it is compatible for one but not compatible + # for the other material but the buildplate is still usable + @pyqtProperty(bool, notify = activeMaterialChanged) + def variantBuildplateUsable(self) -> bool: + if not self._global_container_stack: + return True + + # Here the next formula is being calculated: + # result = (not (material_left_compatible and material_right_compatible)) and + # (material_left_compatible or material_left_usable) and + # (material_right_compatible or material_right_usable) + result = not self.variantBuildplateCompatible + extruder_stacks = self._global_container_stack.extruders.values() + for stack in extruder_stacks: + material_container = stack.material + if material_container == self._empty_material_container: + continue + buildplate_compatible = material_container.getMetaDataEntry("buildplate_compatible")[self.activeVariantBuildplateName] if material_container.getMetaDataEntry("buildplate_compatible") else True + buildplate_usable = material_container.getMetaDataEntry("buildplate_recommended")[self.activeVariantBuildplateName] if material_container.getMetaDataEntry("buildplate_recommended") else True + + result = result and (buildplate_compatible or buildplate_usable) + + return result + ## Property to indicate if a machine has "specialized" material profiles. # Some machines have their own material profiles that "override" the default catch all profiles. @pyqtProperty(bool, notify = globalContainerChanged) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 4c27485883..fa5473ba38 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -123,7 +123,8 @@ class StartSliceJob(Job): return # Don't slice if the buildplate or the nozzle type is incompatible with the materials - if not Application.getInstance().getMachineManager().variantBuildplateCompatible: + if not Application.getInstance().getMachineManager().variantBuildplateCompatible and \ + not Application.getInstance().getMachineManager().variantBuildplateUsable: self.setResult(StartJobResult.MaterialIncompatible) return diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index e66da9da5e..d3a8b5c8d6 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -351,6 +351,9 @@ Column activeFocusOnPress: true; menu: BuildplateMenu {} + + property var valueError: !Cura.MachineManager.variantBuildplateCompatible && !Cura.MachineManager.variantBuildplateUsable + property var valueWarning: Cura.MachineManager.variantBuildplateUsable } } From aace0e03170fc1a8df76add53bf13a592ec6c946 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 15 Jan 2018 18:10:52 +0100 Subject: [PATCH 304/551] CURA-4461 Remove unused code --- .../XmlMaterialProfile/XmlMaterialProfile.py | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 4babbeae77..8767377db0 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -187,7 +187,6 @@ class XmlMaterialProfile(InstanceContainer): machine_container_map = {} machine_nozzle_map = {} - machine_buildplate_map = {} all_containers = registry.findInstanceContainers(GUID = self.getMetaDataEntry("GUID"), base_file = self.getId()) for container in all_containers: @@ -203,7 +202,6 @@ class XmlMaterialProfile(InstanceContainer): variant = container.getMetaDataEntry("variant") if variant: - print("#############variant", variant) machine_nozzle_map[definition_id][variant] = container continue @@ -263,34 +261,6 @@ class XmlMaterialProfile(InstanceContainer): builder.end("hotend") - # Find all buildplate sub-profiles corresponding to this material and machine and add them to this profile. - for buildplate_id, buildplate in machine_buildplate_map[definition_id].items(): - variant_containers = registry.findInstanceContainersMetadata(id = buildplate.getMetaDataEntry("variant")) - if not variant_containers: - continue - - # The buildplate identifier is not the containers name, but its "name". - builder.start("buildplate", {"id": variant_containers[0]["name"]}) - - # Compatible is a special case, as it's added as a meta data entry (instead of an instance). - compatible = buildplate.getMetaDataEntry("compatible") - if compatible is not None: - builder.start("setting", {"key": "hardware compatible"}) - if compatible: - builder.data("yes") - else: - builder.data("no") - builder.end("setting") - - for instance in buildplate.findInstances(): - if container.getInstance(instance.definition.key) and container.getProperty(instance.definition.key, "value") == instance.value: - # If the settings match that of the machine profile, just skip since we inherit the machine profile. - continue - - self._addSettingElement(builder, instance) - - builder.end("buildplate") - builder.end("machine") builder.end("settings") From a7beb142ff273e536c34f55ce3be583a379b5fb0 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 16 Jan 2018 09:23:39 +0100 Subject: [PATCH 305/551] CURA-4461 Add line separator when the build plate selector is visible --- resources/qml/SidebarHeader.qml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index d3a8b5c8d6..432f920b93 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -314,6 +314,19 @@ Column } } + //Buildplate row separator + Rectangle { + id: separator + + anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width + anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width + anchors.horizontalCenter: parent.horizontalCenter + visible: buildplateRow.visible + width: parent.width - UM.Theme.getSize("sidebar_margin").width * 2 + height: visible ? UM.Theme.getSize("sidebar_lining").height / 2 : 0 + color: UM.Theme.getColor("sidebar_lining") + } + //Buildplate row Item { From 8aa51658e28c96f8fd6d41049af3a9fedb2c6089 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 16 Jan 2018 09:25:32 +0100 Subject: [PATCH 306/551] Decimate Tevo Black Widow model The original file size was too big. This is much better. --- resources/meshes/tevo_blackwidow.stl | Bin 4330684 -> 866184 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/meshes/tevo_blackwidow.stl b/resources/meshes/tevo_blackwidow.stl index ef45dd1621cd2a0c949e16410456820f4138c252..36b52381d58cbd0a86e841306e8e6f1925e47dc1 100644 GIT binary patch literal 866184 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

*X>F`cDkP7=4U;Rm`aGb#L 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

@?c(s$xAGsKwIquAkh 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 =|lPY5!w!lStLYwohV0% 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%0A|V2$?MmF1Xv9mk zltvmhJmRHeHGWsY=qHcdc^X9dSWUH*=2saXM@iJVgz*xtg|Dm}ZQmFon;dN;9iO!o zX(^q?to?iKOTiyOX&*d&N=@ZGW6XwqW!-9wm0dhh{Em9=Utg6-3R=h^X{7yqXe^wO z34AkU^uuD|>G#MUV&Uo6Nl27t^uxctO8;T&IgwxX8ORAnbbRMNx+8%RB;PqC+Ls^= z+WQarf>q*|Dzq~6EZK^J@K!XO)MQT=CpD>-()8!Oz0y_K{AyuuD*fhR-{sS<96fxa z7cHgvEyUlseCM>@0Qt3kBK@{$WhwpU>E%iZexrp%dl~Ilk|ea$cIPjIQ>~)AO~*B8 zspC68C7ex#l8BSDv==VY$gTGVQWD!)5)oBlImVX;mRuMuTz(C;k8!AA0^dN znqv`f8FYM}f8iODeILSG)3+Iq&-L9Zt^G>;m5j3~P;0d{&{iTQR7+{C|K)pyp){a= za33f0Mbeei?q%rrkD`{+NV_M)ugKgt3Z)tn_zBR0pAh>DB)D%>rj_pMXmq;spWBc( zn61^v7+LE|TtAdhEw0rE&9(YI+SV`b^epg|mHSkojp9mnZ?BY4Ev4y~lz*>Pf}Rsv zwb+J!uPtifxgjU`9cgb9!${a#IK;x~Cz_XRW3m zWr=I`y%m)xXSQn{N?ehK4KIlrt>xDjv_AZHgBFKhYrOSQLba4uuO|Nf!5t3}@zA_; zR|Joj==YDJ7V=ISX}@!co|hOUhi||byZMab0mkR0Mq26DaHG@MyL%b(HN3>H-tfF& z5A~4*a^-}cm#SJy^IN+6aB`AaiIHE6C#G|l&^l|YU5F=&mePzTdpt3k*C&3IdXws9 zMqlDes>N?s*>Yp69UbSV2{aqR3WcxFq z%~0PrZcDgp_K21+>+t7e%`1Y3-1WP$_Rh^K4!`65yH8Cb?99EOsD+Y2+RJY7yPCE# zY|qhtXsZ;BAlr*txGq{B_6*+o$gHrE)@LmlT4LhZt7<8&^*^jPc)-^#ef;sF1$CAF ztgJQb+O6!<9np>OgDU1BFuSI=~??e3dnxYoo0coVYo@=a+yZXUz<8FT# zw{cHEkI5*ZT1s7_wk3!XRwn5@Dw3YntLAl`;f0P zQLYftK~4}!V|2%(YC3~XwRnbtUDv z^{1!@Tp^DV&UN%&+I5bwYAMZCtzM&|(OtUV62^nvX~>>*y5Ew&4<%HKyS3P8GTm

yhkuAT>f-yqe4 z5zK`=8m^uX-Qz{u*B3E@xsau#bv;LoVgz%!9tUwn*SZ1 z`GYq*8BAfs(gVj)JulzlmQ)5Km#66AU@prO zkoCEYcO#}S;`X6q*Hh0K!CaOnptTI9FoH*C7Kix1F=7OBxlsn9y?K6`2|BVI*pP1L z_VJt@^*Jex5pyxx&eylrgDH%#OxM4SU@kjf-x|RbMp&ln-$pQ(ov&8}Wf+f`!U)Ta z-C71Cn9I)Bw?;695tbYKw-L-`=j&S|n8FCljjagUmk}|7x$H!KYZ**ogyqIo1ZC5W z7{Oe2zP_~#rZB>CWB)dSx$Jy>7J;^%DU7g8*NS*x@pkcAIO-rHn9EM&XJr79p-4{1 zU#{Ib?vZ(>7x(9BZ@>uV;<>1d$mDMFbAHj)5AL^ljl?~pW!PYeoT_=NZSnSEl4tzxc?S(x?LWRq5k>(Q zqwN{L%NLW1cEOwH42oAjjDmL!xpiD&ZRgtNZnustT(t${$qn|&?|AmSu^;yjt{kc|^0*j{XSvl%ZW268 zZWN3)e`svsyq#5#gGY@mbUj^V3`u`4MdWi0Y<9mxkBME|L>t|(HvH&^s^GO1V+un* zMfRLQ%|8tvQ`oqChgheXi^ddsH*X(5d*1Vc*n7&_@JK;07o+QM8dF%*AK4ZLiHxS# z`$XHd)%zg%U519A?RWM0=5mANaT_Qij|=v(-_=%!?baq*B6>9bSQQxs@3K-|x99Lu z8Qt1MCkW!cwN(*wG1~M1T2AD?)hBpmgT3Oovi=nsT7Qo3+3t7vgAw^$jE1e;Ut_TI zSB-@>yTa~+nrAn;XRIwx*-3wQ{L+dB%*E(Cb{$_hWzYYGV6I&TG_D816h_QFaeQG? z-#i(NV6F~3G_D816h{2vS~*95LY@ppFxLtHlI&uw5Ynp!Oku?Ir^gp|zbsD%BbaMo zUBh}1Oku>j72^vh%*d0$2%AcU}X`~@eU(sYEvVbX!*!txOg_j>R z#EaWH8H`}AgFhQzSob$WJn;GXX{ngPh?hD{DD+um2(vEQM5Zue#y1lRtG_eEjaN)a z^@tG6-aopju(VxSPLwc(5r_S&sW5M^|Ak<#%?36Vx}Tnh zU%J>n3CNqpQ+rX9ROW z_UZ+Ouu?$=Qy2jocG+pyoG4)mBVg&Jeg7ANx!~C;mm6ZuHO{(BVFV&(gS!mDdN6{y z5Yz9zY>2D>)Fo}Nn8FA|{)_E9muQYCVFYubrrp-L6anipg%PO1i!L^VL}ENzf(%A5 z7g~(QD-6-)8m9+S7=gBH^6Q3>mLYAg7{Od<$GR*s#0}k_PveRyj6mz!Yr8Hbwu0tN zVFX(3hxhqk2u^$m!X? z7(zx%sdX8_To|eSaIYb_R7_z6#*8n1V2G97_up4hI_k4`F&D;e91XCD+ zQElVqyXC|#Qy78K^2)A;*zx1f(i+7G=ECUwnSBkh=~t7}QZa=Qm?wNZ)DSypD@Qj5ijKECh*fECq-Dhsb!W2eePBr)*L$C)K!CaVMoiNQ1ul{>f+QKn~ z5t#Kobe|!b|9Np5S4?39X2sinXb3A6T2V$Y7v`de%`=3|Qd560g%OzVZuzVsOa@vw zrZ56?>R%U>B2X%xZO>mNrzMkFJkQ%b@0VYHJpgik5d?EFdd8pEH$P_tbNzB!BhAlQ z4@NN8qRPgc`8hOa1aoz6*O)UuFGVodnp?)w{CxYX?oNHq6h<`8YoPf#>%j=-y8WC6 znxB9FRZ}bj{$K=iopShCnxC@_rZD2Ctr}>4zCHwVty(Z{J@a#x!CV7>s;Bw+U%&b+ zwG~qs@y3a7=I4xHu5OiMX?{N7zOsE) z7g-}C>CCmsPm*mRou9AX@A(wL6h^H1xt`|d1MZuZMhPRB>#&!`tY?1C6h_?ss+_#f zou4y;x#rzAhUVw&L8dU`jMU%l+%uGe2hpbFKN~nDxxhnZk&R_pYb; z`C(VxnMMgCnCqFn$I$%T^g!Fr6h^$$Sv=TkeqM@Tt|7aRq4_z>UE4caj zVOMoYJ;(^=f}dK?&mn^;jDR=Y{QS??+?ndZ2!CV+ixcNEzgDH%__`%K3>qfgw>5O15jB4`d=Zs)3jH2B9{D~`_ z45lywqcfXRJ1r3Hj9@N|AKm=iVH)F+rBN7xF{7KGU$!x%v5@Ub#5cgAvSyd2Q?Y zIpT^bjKKWU&CeI#IW*S16v14W!3gHUevQ_MxYiPd5!h?e zyD?7&zl*uB?<60=6h>grOph6PG8n;J*gunxU|uK1u~HeO2!k@j~5pyxx*7||=yc51^AFX_-C48+-?||3zd&zoh z)eBgauWddooKWa~l|Fmk;a|6p4u7yEe0`(d0dp~$*WqPv?U=RU5xcaB)@;-}dilHw zg|&h1-?X)Nlw{pi6ADw>>hFRWyEa_hsZI2AyWSCVG1^wuRge3>Zyyc(zn1Xubyaci zY`ZD=4mZ9t&hyUtp?x%LVM}=FcU1v%@oEdk5^e_s*(x&4v3JlkM@h_9x<8R@6)_j1 z%~q<%#9cc^7ks!l{Ih7z?_#g9H$AUk_m0u>PZx*3|FtS&E=IF#&#RFrxmn`sGKoZs z66}qz_rm8ESIMr)r#nUW?Hz@`ZqPemE=HSd-DR=KJ!R3AkIV@#+n{%3?}AM%!lA9z z0=3n&*=13$`{#t)w(T7;7o$y{+Um-c%Zo#1R|XB@b8ZkALsbChBm-+OUtbKFq~vt2Zj+KkX(L-`=|_m@Ard3&+~B6+G|t zA14(@38L?hRRMD`n)66|-tZa4`D@lz1!aQZ){?mx?Rg_66z5Np65$_nF&fVrT(D$5$}_+`Kv`c-fQ(kW$bfTS+rozobWCw6?0i#!F#QK zsEpc!YQiJ_*fTi(zg6)rRvQ~|#zh`Wc;2mltO@rzv}f?=@2djl;?V$SU-Y~V_s$82 z-dh%-E#a?y+y7^Ld=>y@U-XOYXp}Posz=RispEH+MVpGPn2XW;70~l~+&w3}Lu5QA z{h%S>TSLHWCPRI`lOR64qb&NTw4%(#Xp^BnUnXsC$F3ctxzelg*VhhRo9ub-T`wln!mAn-s4Zs2}eCx791t*6^}(Z_a~2oB}?<%Ibq|& zWx;7uKbVWroYhk@=~P7FuqQf2Bc)U<-RuKBxU`;kvmk~))hXIQG-obGn+-Lt-oI&W z*uHC<;6|zIJRjtovOE{{y#L5KfY$}FiRi&xjOJ{ylEtIEDtdJ3r0NYt58fd(Baq!@ z5q3A#HuHWa&wG3Ks%Zc3Csi+%NMtTXFDf(@e%u=SeX#3(_^PVt&G(Car^#r^D2N~1 zEriH0v_{FvUsXjX-BIlOe=?F`E=Kq2ultrX62I87AsldJ_uy->71uS+lge`j&)a3! zhVUdoTq_9XVl>xHIcXuKYFtw6+gChjrGlrdRM6J+P!FyW#P_1dF7P?ogwdvl+KS>T zvM7Ou7A3Hc#g%GKaTPHaqb;t~x@WJbik^J8IDeM3a44^>0&_{Ygr0ZK*HzJncNOQ) zk#PxgF&g?k8=23aoL(6C4!ig27%UY8b1|B;5PRNq(PNJ2 z@tL%uRx0?`N(HZ(9_sVqqQ?b4EwA2Me9l~qHa*nm56CFL;j{M9Q!>in-fI!HgWTK6 z{W$lwgp0myAH6F6U@k^;`zWo?h-qP;<>kTuNt?*^fLk?g?L6;-%ch01SC$9wN&R3h zMsvN9Hc{I4irqU#-%9_%F={1&pRKg&!RJ3(9L|!q{ke^MN6f`&j%m;PyR=s)e>AE3 zctMyI@h+=(kYSeAxH__XRaBJrYM6|WnTyd@H?>rU&1nfY`n-K~u8d^3yk=dz*ZiS~ zy9F`+oA!~6EFqC7WN#kzsnqFUUB|eUsgr;NhC5Cqw$QrIO>m0|5h2j`0Mgwozz;ysC_>}E3ws3 z>=Bi`oYL>Uu(dvW-b2$WqnBS?UVL6!2IgWk?>zOqm8&KdH`)dX%0QiR$4zMiLJgDTYb8z_8+h=xXf)6~WYS=6C|M^o@z+8-G{baNxarKVG)gf(rXLf8^l)&d^ zY3&WZx}iA#Jc+9ZC3cz1e1KlY;!1m*tysg_q$2OP)4tYfE5h^AD9gF z$DJZ$g~&KsS|8?Ow8>C^tdsZuez&UV4)M9wC{WnXRtHtahs!1vPZv2ihz#apH2Yt& zZ1%5+u0FOr+@yW)z@i#5R`qHs96Ddy4~u-2@y;<7QMa+>;q9_s!d#5z9pe5;cu*-_sqj(QT5z8{{DjCJ6IUa^~Up#96l|);G^>Bbg`Aq6rqR3 z63T9~N!8<@L#Kszw3J7iiwBvD(H3v&kB#=O37WA4Q=gvEmV#g|M%zA8jon)D$5#W&!;9MYj?B8HEsps^>&KD-715sX$1hcp`2g=? zwE07295-xQc$L^{wDeJ?Io@TOgUf8CGLEU67H%W9l2wCQW+zvYQhd;tL?-e zra7!=n!^WXEA_{(Vygy0Y#<2cVzk*x{jrIxA;0--i@%*j34h_`9)NoW&--X?`{?0f zi~pmv)Xc?bzRg9>xR;H;xRKSqao6^GZ&+|&U@bNcU49w|6xV-rD7}I zk-~RW@opH;TXeUKGJaTIy$a)Yx*?0veEXE=-G6dLbnA$6zey0hBZavb?Rmc+SP}I+ zx!iwAO2u4^=G&(vGsUp-@bx1rqNy?~;%H#|aP)XybWVA==@Avt!xC4_#b~yh+#BA% zXSC6&HU2j;F5z7-ToNv!3B|t8iRQd3jPHr#9ci8?>sC?uz+&GWrBuwtXubi?^Ny8l5erT( z&VOAH;Ii{|jOLr{Ja40QRne=B#rfMxshEq=*;4fxQXal5k@%?e25fhWL|D{fSN$>g zjPmf_!z-czGWKCEMzfzhZwINh-uKIk_b2t-q5(D7ZhPnG@x1e9S4PXXUQwI}TM-w> z5?Tg#s;y4Nc*H+<(z-3A&T%*AME z?#>DSZegeBh`pk45BY9@8HAnB#t3Q3&pXC4Fq_zErantcE%T2T4vNAnL=Wa-G{#zP z&-RHy6n2(*&J%*b4BN6pVCH?)Jmi)c+>F`wV`KDLRwiUd|G3D(7cAytG-mX6dc^Z8 zzm`?CijL7HB7-TIL3H`AzL($Rc^?Skzk76yI*8`X#c0e$T<(N28CgzwY)-gJN|n)& ze83iw+dTeJ7XAA4oN$Dc3h`r}Vl?~4^DZy8gcrz2<2;eU(lJ9?RY3Nf!OdJ+xfw{l zg!fn{D@7uMxfqR^m&>;BH(8-SP%_=1^|iSz%!=Mq`ZP zawmKycDhOIb(!daH9gBZ!hXhz-mU%3=by;;kBuKJiw225n2XWue_0*u)iFBt%f;dQ zQa||XJ;y75?U&WT9v!1CWW{!=Aef8M9LMPjWP}w+tU6l06)rngAcJj9kL^ZI3-4ZD z9?cRN%*ANdNxnND(lfd)s0oLN4D@$)!k+tZ^mY&LYyJ6(gL+1z2i1ftLHv3;tde~BLWzHGUW@YQE0ldPLt$ zD!yD%75ySIn2XW)8t!r-$*Qw2tIn~{ahtitC}+~a4dfZ0`{r}zVl?N-@x0AeFRvbY zPh~Vpe2)9JFMm|ai=9qZ65Oh7I>~o~ua{T%l#%$8q6c#^n)4z_4!UcLeb>qOXGf8N z+q2CkSh=xWQFvZ3#ccKLZN70{bsO==H6nw{%Uq0>_1!g- zs%MBldP!TtT#RP@Jnt>38{=e@e5%A1)`~566UQr7iYLBodek0T6Sg_HXLO+G!CZ{y zIQG0lmM<^Pl=075B7>s=E6wH`jvl$2yA91ZxR2iXjAq~jf&!nRRZ`KuGs@tn-O{;$RFFJqspLP zHkxdlH6b0B#^Xfa#)-_uXqN4Hd&rliq5DVSX`%<)gtHFS{iTV<)ZG?z3eMR#3Ofjb zxfsnhjOPY{%?&R8xG9|vutnL@@vJD2Sy6~t5pyvbSt@95a7fQ!)rmFXzGACm+D%N? z6FB$I-QPHBb!!uxEx9I#13_Gj=DI1ja}BBpM$5WStsqX=dSbfP!xm*r$E#|A ztg3}rRbwtja|R-5;eyEDLgs3>34-eZw>aDq$v)&hk^kuPo#K%tb1|Chjpxby!?*bd z+k|T>*I?O){O7g)buwdlNLnA}Vl>;(^Sazs8LZiEMfF#Lcxb1Ig@Xp{8jou^%MEAM zk^OM8S9G$hS?(+d=3+GLHtHFDlhnbJD}s))X88v}Fa?&j(|PwbdoaM;#j<2i=rpcPjp@Lv8Mzh^yM*mP*uu*Z2 z|BRFh?b7#`sC3RJgI39%yOY^=AhT^By)$z$8tvmAZ<`+P%DYdHmAk`XUDAW|M)lfl zVtkTS*F~=u&XZ(y@Fqbr7o)S9e=C~rx6$O{J%Rw&18a4?6;`lSE@*D+WioCT#K*f% zE*1sBT#SYcTQ!uM##fXF&yJqv4;9VXQ*0mhY`lII*!mT7F`DfrtDG`su}_tG<+ zg3}L({KI7I!(8lVwDU9fHyK!es~uRJk2Ny(EnAc=E$2j}G{=oE&i||QYRtuGj)iz# zG_ZA1_AR%Z+@gBk$FfuX=xtUM`%0;pi_shlGSZj6cEQ0l{t1XHY5}-zbBiJ0Ii;^X z_qZCrS)wGvMQE<`vd?l}i+`hhqwgsQw68Bs!JWQ?n>ou3=i!ml17VAQ-kSEoNU<4n zF&g8b>HpC;$%^p2IsQ4a@3l%0=qENFgnMcSH}k12J|!0Kd-WTWeXq>LXpE3|zCqt4 zYp?Q^Y@Dn}p>5|?CqDDRt5mXEL=gX;zBYVUe9l~q=CdHOS}Sv$We4>P9+pVNEXD4& z=Mz_qZ~GJ3Q=CJHJuCY%WQ5#N_9s3s)@3e6qi?@(N0afw?rnlP>7gqn z+PMYbyiwd@c;5Sh7&>*WzlGR}xfqSUec&H0uJ)2XaG>mz{XyynYsfxei+J80yEga_ z3Zj=Fn2XWu8@Uy6ua3bFYZm)QN~yS&;dYQ)rFc(KV0(&~i_zRZ%8Kx$wf>hf^1D+? z#Ts(GV~fQ5seRi|&0LJ;`Y7`cX+aNvu2X6w z$-cfoqJ*QGPXlr-@VuUvm;3j~zP^hkN|=k$m~9{2+3Lr^tCm;)dS_*@MCu1qusURC z2Kh}gF8OhJwI?ILM??m5F&gVk-&dK8i`q=C9x3A=eC=Zjp9bVNNxLiiIM0(leUNC* zT#UwwSMPo%@wq`ScdJaz`Jap1i0*XMO=C6-0-vMipb+)w3h0|+opy`t{V}{Fa#+4-O+wm8AI-# z8g}|o5qVsURv8l;hJ?e89Tm$k&6x}DwKpl^pov4m@&sWNa537RwN%}XDfV3=`{53k zJuG%A8sAT`p7edP=kno6ywCE0hl_n}pCxmZqTN1AImhDLITkx@4;gtkVrZ%49E)$~ zSeT2^cBWpxpUXadKRN#qS=Inh_^u4T9V0&f;V0)mBIaT=%ZvANRwsKo1G5SC-0=DH z9%nbkdpUJ4&TQEk-9h#{e4?18*T5bP<7 zM7)*^|0NO2u4^Hb1EhId|vVxjSna;18>*u&C8$^|_q8^X=Rnb1~Z567>hQB>}(7 zS_W`gTcR>~c+R_+feQ)G5=#7v$W8QT55Y2?9TbGPB^Qc&H~8(_8{5c9xxZ9 zO`gWp+5>t9Zy#P0J|LR2^bs@b3!8S(Tn1cP&%1Wtp21r^YQo>isV(MWv}K)AJ>J|+ z)&OMB_J5=fT7EE4tn9GQnn98gC^_FECq}wf1<8Kuh`AVT`l*ZuhI9`WY|#*|lNQe6 z2ez`3KwB%V#%@(z_u#Vsjth5d*E?V?Mq7-jt!|gtJwamk$j#(raT2e17jrS%^B(x9 zJa}AARh=(88ksADrd(LEI_P3IutY$*MqBKv9#e*P51!b( zAv{oePSYG#w6en=W-E=|f*>|oH!kchK4&gQn||t#<~}`x?nl&w%OrN~T_~?b2})vd zrFwj}U(eveJ!`^u#e>YnXp^UU$oY>TIV%%!G+4Bw>>NGuS(zX?D-$snqpg0Z9&)C^ zPtG(1)*GO_Y*Dtf=k49G!M{rSk2^#U=3=zTTWu}(pCg9|WLT>P zE{+(_YnfdZ{3z$oKaf!db1|CppUHQ%gDZk_m>wEea*jSo&e2EA#c0z*{ZUq472s^&8xp%{ z4RG@TDDX4RBICXACbBvzqS&n}xazw})&G^VeayvZv_3eCtfkuZgT?;wa{hcnX|F6l z7~W<5E4bF2I4(Yat_V4!=-U}Z=3=z<&9{C`UQK#Up}qY=lK{XtK!dtUpwE&ly0+9T&cWO?Uc6DvDx zwW8y=G+&N<8GX3Lzfkh;OqZUMxfpHwsdev?esGeUqd!i@SLP|`VUY-J&6}#ZoJ$Ro zbEyGyG1_8Rtt)3n1368OGoyid3Ka7*-fNy!gq&Cp?|U4FY)1LlKp!IzepYYqqL&T#b~n| z(4Hr!mjgMy+!v>p%|3XS*$rG~E0vK%J8~yP%*AN4mCE=+dgotdtk_wi1idqEMZ>$$ zJ8v-^&%@%mI__6f8P~LJ@OK~9J&@C9@qEy@7>yCYZgUkK=P3#-Zq+{OSZ>(yI**)&N(^8#VQR7z$A`k>~G1}y* zKdv9U)^8^{mu5)oW9=)XbAHh&Z^~V*l8;PF_0*`feo+u-NL#{OjJ7sdYwg+6wohN) zKDs~<)>7kL%*AN=68B(>|LMy1(U(#x=3=z9?J7fZAq7d^sK~OZ!X{RBXp0+Uk;hFn zm%LFyk~b=1E=HSvYTZ$z*ZLDB7g8IsE>o=RcrU-n^F9?@Ju8Uzf?zI2n|>-o@{t8e zKC*~MUL3DHQj=AKr#l5nKC+0p7|n4U=eY}#Ja-XCHQR@4L7e9Z3_^`;}nuA%G-Gs3KI)dr z;4EoNur|4JuzCtBn|4zuRwLa#qnoc;UcL0@%HSDkshNw>STB8dsQG;Nsl~n*Nndz} z_yenF3yxI^R@m&uQ~d7kOMUf*V&6BHR|N-2+g{3LXsq1baJ}b1(k4D%KB;B+U%x2PgYobSz(FS6LFUz-i3MQ7v1nYES^W>o(7c>$a>SHcOn{QN)>F1UE z8_4|N0T}_9=J1qh4nLc%)aSd0RCu8axWy~w>Zak*OO~WWJdgnd&->wuwf@0nZG!W}9~ezoc}-jBVHQyt$w)uINT0bF&HBlHIPv+(OBegs ziFM6`@P~O2@oGNT*d?C_%*AN)xz_WuR+D7=#kLRw`K3N`<&GJv6Rb-e2rrxm(9zD~T)SVzlX@ zZ6ejdcub9Y2kGW#l$~{w>`9{a{o~jAtEFXNE-t&pg6c6}T88hXEjdU=`eu_jGLm)$ zCE*gvSF(p%{87@D>@WQwmzU9IH`QZ+#O}QNTm0K)w8YXa5}^l|R?Zu&Y99=cm4lmP zuEt!9=DH%gCZFmQ%<2{S-6cx6=5V}nO_PzOwC(@eJ@OBgNMtTXa~x;dt9Ty(+9+7j z{0u#;z0$b)Yh~o`H?LDLNMtaVwOv44ET})^OI##h;(UCGLv|rsJ-?=NQ@Zw!JAmDK z`_udPj2@Gjx#lzc0SOgboxHrZ+``T82k*H<53U(E;b ztyvfTH-D(lUzd#8i=>a5DSZ@kG1~m0adp+|Nkz)Ne5|t%!7y@^B^L_e6DeI_OeOEQzS}mmO98>j5eQZT**3IXzOs;Z){&J zkogU(kWM4X1mE* zOUYpNJ6UIVO6nkXL1PsV(vcC$zN;V$6xJ414_RjjlXZqTZr6vwqUH_o@kH2X=rR*hWEQSlJOvhSs=}UEZPW@(!@eo4FWm zR?vFBOfuu0By0M^rDZTbgJNaJd(G!6qg;Ico~-FVEiD6cG1~M~8Obde0dB#thy#V| zgw;WnA$?S6eH3#sn(K<3qnDe9-jO!(Qi)w_;ouLeMewH8M~$m{q)psU=7S5wgUrQf zYZEoDhTqc?df&DWUXvaNS!aHi6yQYwS(Q4l{afC||1MwG8HBwAoGLYLsNsyl`I}o#S~e z-U~epfs&XEEtTv%i)80nh@EH5W%7VF85)V($sKN}@03EqDeD4o!g1NGX-mD9on02A8`9n2-PY^GPKhBgkk+~Rc{!r`w zAWP0eWk2;((!z0!nzneaSws!atLF8@qh!x^JU{;>x&4sQ<`1>*v(mQzC@Z$(rS-9v8X9seS=+9*T6cd-`0QuxgDoWz znTydJW1e@@!g0|>k1VRj9i_;Wjy=0LC&;&J*zaoHzb+UTP4Qlg5qVsU))R-Fmo!AL zPj8z+fWmiW@S7wn@cRwX75i=+Bl5Tytuhis5qcN`6w3>bvfJ;fM^dU7k;lbom62$k zL4aZz=J8&BQ)=B9k;lbom2r%mV!iLJuA%t@dpSYjJmmZ)&$~zvm%XltJT6A7jE*&< zqCcEHB$iFy-)nIe6%@?8?amK-ZjCSsq%+!{ zwN&3cwWv5k>Ih_DG>JPnN@dvZia7Y0Ma8od1j{fkMr*0=mHj2icZPp_5*j73TUGhw zw2Uk#$C(NPWGZB?Qnb4p@Gn2Mt^PW()x%>N3+LR8)7E+`#i?`fTpL?Kp9e{M#R$kS zE=Id&v~WAzQ=I>(oIO8H@&Ux9+OJzIW60%=g>~n4i+j^enz-pnmGE-rh&A%H&&VIDj+;WC8!V-6vVf)<(4_N*=SA7$^ywc-o; z7w=Ah5755aEsWRgS*HF(Qw_Ka@H-K3!hC_}50z`fp?ij!DY`XW2zvgB?zN{i_!M1GA`Y22l}wkn%WQ6^(Y@Z}WYX&|jfl!EP$_ ziFo$BV)LTv!3iRdi_scadA$MZx%mKfJNCcyC0frJktTwdJlzRKX|@8q`1 zq;8`gSgpl-t)8olU)C-!ZYuSBmh4+%E=F7Z&>B^|+qLahqd-B~_mKVy@8y=y^Uk=f zIR8J=@*E&{5HMFM8oiIo*yZ0{eal92(ngJi$FA1CmZQ==BN7?mC~}J@q1`h)*x|)R z)rTb>yk7d(Th7$F#u{uLKo;U2GjuHBc?;ye?W-k+;*ruj zGZ&+|UGcoxpSG?3ky=rVcVR`Y+bAu5*Lu!~JT6A7KdyeSYq&$wt6hDd_imr+f0JbE!A@(t*ATl( zabFdDV9#pZoo7$=FHI0e0T-j~Sv}b4l)3&MH*40R#yR5(+w7!mNsk>H3LhM*<97Fq zI>-n|k)7m(cF(Zx;p2ydHOG#M{bAOHhU_)>44*T?Q6xiC;z6L@Gkjh>afsj5vJNG! z8tVBuQyL0o!?e%f+MGq?b1@qATyi1#mJ7+O3%g@iDeiNEMeSMrQG3l0|FZ#_J;^Ag zUb8o;KkBb65Bp1A*%xKjVto?{gP}t>L^^?qsB#Zf8H5I{h8H+L( zqpiQvQVp!G3CH&D8P6t0d@!!?;Lp3qJ&U~;?cnDt#})Q|#roQ#53C8Vm0Ws{Nj`7p zVzkNDKI)oTQ~fUMG}Dx`uH<(~;tDd{@9;Sz^0^ode?0xyA^s=FsC7Tsr?D{dP_2Vp zi|kqJ;JcHD_Ia}B4j<_;QW4!BrN3CTK> zss4va9elN8W1(%8)(?(wd)E5V`1h&)J4ydx6ug(w_N=A4M(z_{Dn6In9V5FP7~>Ki zi`ad_I>(W`gJF_)Fk&u7^BBeRx=CMKO!``zO~6y!qT26T2PI!$IzrClVzl}^um3>( z;5uRb2kJ_G{{f2QVl?W<$$e|W`ws3I)XC`8>H%bM^jW)$-(^>^UlVR5?e4EKLS`;T zb492wll&}>Y5qto)Np>3|j5K``nok*5MYuHn#BiBVA?gG^}~) zf#V9_eTnDc^o-ts5zNJC_l#2YEo%r@NOtc1MDsRhjw_6ORr^8n0c6Y^A$dP$SwHxL z+`;qMW!-}t|63I?7o*Kj+Fm_<((B>q9%`#KpN=hbyIExz0?}vBiWqy`>*0Mp6=4)` zG1{IrcK5D%-5;N-i~zU-vKAQ`f>jAudMSv)1!} z?a~l-9@9P8XpP)(l#C4!qg+C>mB#J~J4?R)5#58SvSQ0zj5b@T9(O-EC+sSjhrg9* zpYik9LiJD`<1D;*Y~iPqcaP^Hr(8F-FndoM`y4cHPI%X2Wx+ft6>~8EP}Zh z?Vcf{-xbrsD#@UHKSq{RKP;Bu1Gc*7y>aEVFpwdV}of#f@Z82N~fgbB? zWEZ=9TKL*m<-rc}P0DH%S_7+5(AMgpw(Vo24!-|od2ofa?aamKtgU#}z-i7iI@#Zz z&JAHJMmS2=qV7$lQDV`6h_i@6-FDAtee&W8T#RjsjMHmGdGTNS1^Y`TT$ToY*nK+5Wb9Rui!KcWAFXNIM>kC~MbdB4tibv`T*W9AN z%hx_ZOs(t~+$CcM=3?}kU+N3{{$58Mp11VO)#3aFNq@d-Tw!UbWoNIsXV{7njxw-$ zA)(zfZ1qBqcEP&y2F12|f4_#pOT{knI_1KP8wx!>>JoqRvS;n1UK7Nc1Ys2PMU1v* z?W5R(<|$CjoA?Uko>8M1;V5;f&w+MtLc3d59fhkU*Zr6Bjm4~p_Lav}W@&BVE;%p? zeYt039~o0K7o%ERd$kMBI9F|T`_Qq48!ticH7p&y;Jr4I!S9~O2uHzAVuyCm z(ENcDR{MW^A(?+9K7ieMRBX@ck55ip?O(G{5k`T1%s1e&XZ45N3lJvv0z|kA7dJSd z7v?@3x8DxF$NKZ%`%zekIt3@gR@Boon)`Oyfh{$vI;l~g$oc#?_RxA@+G3pOo-s~j zgrn3pGuk~P+JBU`B!q6RQp;+I7-%Q?oIH=6IJbkEzZ*VVXbKF13BZq`J38y;j|N;)w&ns#noq|JUo!V+G%FEugdain$D2VT*p4Vc`K{@4Cwf8TUBj<{Z>Pu6MY(`QxEh2jxDNFu9KKU>K=3=yaM*p$J_S*z)lX`y62C@b)UHcF20qj}Zt7T=|1aEDv zeXUW@E-~7kwY|EiqFwaFIa&wJgQ(B!HG9^2enQW7(H-Y0!YFYhCjKvNB|LBP$*cYP z=d~5JNCbjMHTJAga{7_0{pdwS7zNg4v^{I=E?luVe6vT#;4&FgTPuT-SiGX1+n7Q7 zs7qzcFl6tJ!Tr*!F&CrRBA$24TYZ98HrOlf&(Anka$R4Cn{x&=5BzydVaG~5OP-PR zchp)&+iNSv6pme~GJYC9rZD$mowwEBB==WO*5BpUh27gk zC;mll29gyP=3?~BMPmvRx6+Z5=l!Fub5Q?L|5%SU_et*0CHgLF)u4xaMyVL#DAKkQ z+C4+_woywM{nS2q;oGXf><(KE-=n^;>xEj99!J#|?mX1SaMPb^2^-|bv`wWgVJ=3S zZ!}6KpVvA1@RR;=|M7D9xWc?1x-Q0}7x#>onh}mt*UV`5jJAXkMnS|G8uiXSLvuzr z%D_|x(C$sB=fiJW8!nW)E%%n$op}neYxY6Bnm09e50rbhj_A=QsQRWVVlGCT4Yk(p z_H(aj?Yn(qTiyHF*uoXx>iE-2f)>?1!&Z!Nl)7d{yJy(yE%Eu$zqAi(q*N^3JczP$ zX+7`0uqC`n?mp`ywU)UUZ9Z2$9^GiKVDTG$;@Ew7=D5PezP5=oUXlCZhpSHZtZm|b zKlchozN-kMpzZsAe7y_2R%7};zL?4(e32-pPFsmeC#RdA9OpSkbX(c1~ViVS1h?8Jy8dDfx0t=j7w% zhVUn(QnZ(iAG_f8y4Nwgw;^WW?RC6ikud{ruY3O8s`M-`Z?AjuIxFLDa`2-wZdsiV zgi1!R`v*URlw7uY zdV2pLTi1B!JGPzg z2b=dKyonmsFM3F)N{2_1J9kF-YuK`CcLqAlHDzvD3zks zc16)!yA4V1$9^AwuU+~4)MAgfZEgAWZqtf;98LQ%zRBy&UR{p0$8jAEkw?Y8d%cb0 z${uZ!6XfLXGb(VX(C5{i2*;b$)#Ylu85MH|m? z2WXPr0h&BmnwH))Oxaa=eY)TD;u)VZ&o<|3bzjh4LLIM^D9P8lMPO3^lsoe+}@!y1G<_h^YS>U`!pD%6u7ipZx@G^PD5tp8WE zGmV;l)QsZAeHi18YjQr*TZVehl_K(~6wSE3U;82PzuTMao_xf`#l>%SPWP#Y?{#tU zh&wx{`_x`<-g$JJA@L`j43S4gukZC10cfwhzkK37q+Er1&XpqasT57wy%p>8XR`IV zNAzsty|XVaUbelh4ZPmQp@=*xMcX(QU{7@Cjy7_ac1i=Yy*(D2et5mv_TTP0Bz|-+ zL*!8@+T^P9rq;==i&hlwfgkiW0OiW%l~it(%qG6LzI8GjIU2Y4U;kLC6zwu?ZK!4N z*`-{$HQ@Y&ddig|@~IR}xl(C&J)li=$)`;W^=v~C`BaLgO`P-gfMm=!y;7U#y&|VV z^nx8vv5%FAd@4m#uJYR8TsfL^u+eb-Jc4!W&N8XIg~np(WQH_Px*<$8`o5&2Xj znnFFt@qeR7BvblqmCDtiJ!ce8`P6Kp+Ne;^HWZOhRU;OTa&^Vps-*XYa|<=tZ-4LH zsl`j*v2px$yQ#(YQ@f=5`0IZ_rY-^ z;zixIO8uZ({q>tLZ{y5=c)jtw3Wx_XL>?9S?DfX;TgHrt_u0?da4Skn#>|?$YmK(n z>&@;C89O50s=Fcbs1$8B@n21&;#1CCm&%p4e)3y0ibot^M8oheG zS%#Bp8_ZILs+k3t)N?_q5OL}eS5i1zrEp#@HvvRA4HI$E!{k#_`Qb&VnNs5n}$ zw~-(JK!@a!C*~I}!}opDADD`p9c*Rd?CzL2ElcN0ZHXeh-Vlca zad?KvqvFWD-sWo0ruIqqeo5g)th}^!U2SP^ksl6-w+AMLZxQJ$m7-k|tyeBrDv9)J zE*bO&E{W#VRIZfDWsK-hrfnYvNjw;m_|(c)3&WEiYlHsdxnxv4f1=qEMJ(BFTJfb< z%twWKwty=Cqwq{3a{4ssZsG+qt}%lJ^qD-;R$jy=C;9JE&04ExgQ>9 zEq?P--l{CQ$1%A&d3{wfbK2a(*K7MHN~LJ$x$#4Nt@nzS!Tl@W8|rBp6p>G*XhwYl zo*Wg&<87|owo~GmBb*t!=mEUmyuk^u?d^VRh&(Dqo9w;}#Icz-a87X?+V@b;aU2Jp zk3Vl+X~?i+4$Y@Ru9u8Ad{ZUQ1ER8xN`!g?_Y?Fi?io1RP*1s1L_U?G8JCQMg?n)E z{K6R6lIR!HiW|{#7u6=lZVJ);)sT8g8Llj;4MEm4bX0^tO z#r2$e=Xy>axMg5H{0AbL?_e1wU{zE>CA&jz8H|G(k@?8!Ydt!nuMPF&pd#|A6ir_{ z;>e!K4!D#4N}RJ?z5UeUL908bvFKHgPAN{9Zg;>&E2k8DoMZJ-^q;{!liF@W3rq0D zh*Bwf;yY7{_kNq9qm}s5sqT;XMhbs}ZkSqJU+SFhEkzTj78f1EGR9G^=QtFRPX*~K zqbZ61!MWNoIA6;)f(|09hP*e_vkgV$Qz@El>~P~b$>*aM6xfE2P;H6Vn=RQHh<7qX z9u@iQ^~UpCHcw9QRaM%?X}D+f?ngSMdl?Vnx0{z*nq>&})DK1EQ`Izudg{loFX)~e zx?e55bL`fVGU|P2Pn4VZ72v||$)9@F7G@#>P%1@Nj^hJ-$uVq%dFS3srx*JUxAlkW zcBtn#6p>GbvuatyX|d?bea6OJVp~VKO=RDB+sSvxG)7zE^=3sCkw>Lykl{CT~L}){OK3Q^F9AEqd4nf=E9oL<4?;cpp@@8{nx;@sxl*lljY@4_rm2ixLOt71gzIx96)a~NO)IKe>-x+#^u3{; zZ73q2O3`d%19Y$o-zieh)xx>tQ@6d|^nC5NlauyW8zPU2vgGw9SEE)}B~M}{JQf~D zr9u6YN)Ph&t*J^*L#Fii;MJ5$(dw_FXbo)QmYGd-X=m%aIf>aRsS{pr`f(M$HF#{e zNn#$AqHP?v!G9co#L&V9Nc+mAQ;P$7n|`QHtQEk1j{_Ouid3v@i}Mub>jN z>Pn@BbK6Hh=<-UP2=%n>c{Z_oPBI@Qtk4n+T4}Jr=Z??DO zD|)uB_QUIK9Q}aUHACc4DcZ)NmLc!}zujeap6?Cy zJPiGKsL#;CKuUWSQ}Ic~d$ah;+L(p->P^H~yJG)JsT8g4LC=x96FG-^9D^V-g+|2xG%R{PktyOpK5$lsAufc;fCqSurIr&HgUnU>BWgVnU6a8^6AB0 zMw{%0dfHt@PH$__X2{cUk`3C;Ch) zzBkayQB-wz-{g&bR#)E*o2XQZetY56;*=-sO;OYnbM@YvHdnl9dgrmszdN$YZvm&? zdA;c%a!tmbYch{Y(WZm<4DX#Be=cqe0SEWIX-aYBrYv8u@Ok(PQ;MrTH{L|iRyDno z#SK-3U%-lbv`wxlTKSLsyF;hMp3l-P16$X=d%cYV`7C44XPHN(Xd6e(yuQg*AFQfg zf^i&GKc#s8`8E#i`*x2^DSm&pk7MN>eX&2bs=5PCg(;PybxcuoAM&H@Hf>BQS1Ju| z&)N4-Pq|V=K2=TG8<@SSJF$22_@t`BV~`S+2K7rSJyG;CAa2GT>o+0lQ>qHI_$%yL zB4gb_&n!u^p1S5RE?L}vYVnB=I;MO2p`PPVL_U?G8JFxhcY4y{Y12WUQF2OW)a%Xq zv;ks=43S5rXyf_G2jD#4*0Zbk#d!wjEyq!H{*>ZzYdfa8GVrfciW^pQOzhPj{rV>( zH(p&mkLy~YQndHV+E{>$T$kK!`F9oJRP4Lg+c;VPaqqi^$fM$Wz24fGfpJ{3&Ft!y z+_}qo#dmqHs9in|v%6jTVB|Z`u08@hS1Lt&8`dl3p!1gdBF;^|H`LSaDk7gs(X_kB z9~2`GL>iZPB+ND{?0I=5%r+E}Po?M|v+azpT<_@5-L_lIkZ0Q~sT56LdoXOtzdu}6 z{XR}dyJevK_>7WkKI&Shs_%5G?boaEpnxGCUBA-gp zl=cD0?X$;SX0Nn$wa#8|Qt~2l`y6_OA@Zo$cdxf`Tm}DeHvGrq7`b}`j>F$eDxHNW zI&4JmJ4Z{hfw3jrtxrQa8V0Imw^y&EM5Jrg0)I z(dM-s(l{~HbFLJTPi6MX(6l8PBK3p8!r^}9}nUT~dx&Y6=CtCy(T<0|ZVsAn6BP^%xP6ixjYg^@p3*Enz?;;Vgs?{bCHG}8C= zUGTdqc{yR=H>YW;aLiYMIHG2IvC7hHTVHQ4LT zmc;MW#xI@LGDYN3(SCTn*^-?gS2d5hTuo2k%O^f^#-dMS&A|37rdC8gm7=-EQH^qG zr(C&q(Mp7R+7d6BsLfWhKBk+AhVzzeQ z69b>U-r7(^9u@oU^)`;lkn*0jjf?Nb|CH)`H`3N(T`M|4EqFh2{n!&4^M!29q`oO>^7t@}RuaMxPX^T)77QP%1^cPqYZ&Uigj1ZjFmC zfz<1}Jdz<*r7c+q?|k{+8y64z66dM2XsLNmwC#v@zQlg#3rD_b7t?dj5AT2B{CK_1 zl_K(}I6q!*bCpH<=~|7^_AhJf7GOr?|L?86)40UzZLYG_M2g6x;(NW`+USM|;2dOR zzY$Re*GrF|X>p>@52?6X+V0mLCqCP=fAV^(*^N))djq9Xw9lc%i6b#r*F9x1gL@pV zIT^|BagoJ|p`JRZhkl2F_nq_O^)^=>1d&Je!;xpJ)O2>a2Dp17 z`D`BGn5T^Ap`LoK2>Op7QYo5xJ{UVilj^EU-Ld<@)z<7Y_fF$>?>l?tJU0&39p5|Y za31c@#P8=yrD(41Ui#49gxejlFSFZ~flTQPll}-pLvDRi!>ac(2lV&&EXU@^KhHeui-j!8pE# z)_UJbrDz`q>&ua4>Z5#i-L{**vV8{5y4l3cpQi}7$b6EIrfpXaI&VGR_4kH)_DT`q zy|!wk#8jf$#x~e>-ge8?jWeKwK0<1aOC|a2vtT^$2Y%fD;i|?@!E>cjwCZDd1zDi4 z4H{)TH%CUMgQ1?|$kv=Gf~(OVQYo4`IH@=GLwBCt_$4^#mVvzWo{($aTjTk$z4|9l z;RcBq`@2e|XtyQCbF~a^GdNe?caKH6f@C@0mQ+$Hnz5)#iF1&8?h-?L9_rbKBJ!ye zO+DAy4Sl!WAjGqJ(?BNqe@dRw0S0XPG#)_}%5SYPMhE^H$!6 zOA*|;`ymzPr(Dmu%6`X55$c8c%LZ>^XWzZv#*zJwlOpn{*mtkDab&yBsrB(0?kN(N*#u8#6jqcSttJSvs_Klxk-M9z{rBZa|Y9fn8je}XN zPW@o~xd8h~w5T41SHz+zB9BVZEaN;Jb_cil#D1G_1fOuX?)P_C8(wd15V2{cA@Zmc zZEc*id2+J%t@dj;e_vkx(%z{*=Pq8G4#x9PPaRZ5K9&7eWN40~^+ny2sr%QKHee@} zzwjP%_Fkz!=P#~1ykWOu@)zFQM_L&REp;BxD6}qO}NPnXK~IN zx}Zec&fliXA zpHW8Be`Ke3exS8HW%Ep1i(W#R{7^)AqPh*L3O#=nzYm^%k?jaO2RTCZ;h~=6P((hJ zqB&QmV)y)-nyS*d&?t?g_{-ngC5+o~_W*wFtDU!Zx^9o6cM zT{1LnyK>NZOAFxKWZy$Q+fYP4m7=NVzre}NhfgydRDD(+c)juCI3RA%5P4LbAFu!M zxuOpGEKs{#3s}ydt4b4scuk1UtRDd^7tFM|`DJ3rh@%RBlOGjcgp;U_Y^_8v9 z)vE<>V82??lW`oOo^quK*PKc!Mbjp#rFM%<*{zV*vNvEGipZx@G-da2{MvW@Jd-Pr z062@vXRkM&e~Dki&$z%4c~puve%yw$&Ru)fmbyYeeBPr^3#HKYy8P z=PUvsm7<+DrnQHGgQeq#mRe_LAl*->7O8ec(SF6A$=0~zU?Ox-snpA;UqQxRoC=Hf z8(JDfM7FoYacEDphlpf;)-#z7x!MuqP%1^cT-i8YTUV8orp_&$jo-ZZtxUg-d#16E z&kr?~-^$E>k9TC#?jDTqac)AU=J#+rI?yd#m z-VBjP#h!S*^{R;PKTdmOehDWz(l6XLG}t)&y`-`)Fnk;rJ<=h0|C#xv4?edq+N!`6$fv@3kY69BX!^nI%dnVsSD)}} zutU$VHbOnyP((hJeeY~&wy_#trF?+=xHo`<{Ej7RYjdUZ!>>|if4xV>^DXdw?Ye$R z>2mHTre9~;EGk;(t^7S_!g1)k98ErZz41Kzo-;+{QT>pE&*2N6dEoim&~xWA-{n1_ zgzKB4Xn*j0w`6|lnRWKXA^A)yMLW+;KeDd}Ql9hN^r8!Ff0y4Fe6p{_S6**^P!V}l z9EaDN>}KDRrEPeeK+Op$3&53(*UoM(oss%!+6wR~s+y2?mm0IgOpdWO- zqhy47`oTOsucT5m{orzZ3ovZb+!Ah(Ouq&2SgoQbGQKGK)n`>nJZ)}i62_ra8tG|l z7e(2Z-l>%E{PzWS8K>-faEpDs-h8bh@~FsXuQ#4&UoV%a=dNp%YSk#OH$Bh3UQQ8t zREjqJ$i4XyoP$pt|IcO?7Je@g7Vjy>0GIH@{7!C-(h<}YfW~uuQO9b z9u@oU^)`;nahpy{+>yh%^2n02s66m`7c~puvehh&>Up{4SsqK3ET9$hj zoOiWqI_pt16aM^8+WJmti@Qa) z2<#zt{k7>Jzc?Lur|CziXB&#hr?T84hNf*-gujb&hBA-gpoU7A57@VAr zOq`L8%~;=L_{q}JS2)G$(H*In1<27FGgkJ>dqO?;9#XeMJ^7&{&!EJlcbkm|UT^%^ul8eKFP~_yyxzv~yLLm8#k*TRvOFq9TN_I^v`)50me{Yj z9z^c(C4)_N{k^1Orm0p{F1w46YjVY7D@vaMp;U_YIka`{g=pi#M^=>X2R|H<&S=&i zXVlxUahwmtp=hHc5dPlgT=O=JAJr=cC%b3)`utt&ySC@`)`lYTs1$8;mE}S*4sPPv zO4AS336J_rKeAj%DI$-GI^p%EAG<%(KG`=;O1mM-(0EX#PdOV!6O;DIEm(7|$GIP+ zsz7IJb(^b4uu5HYNK(2N`z5*tP%TpJf(Ll2eRA+YN$CUVpi(KiV$I;$77|(px6T}) zTW#t@sHY#yv+b2sil!gT@tG!?nLo1ll}IWzO#^qbw&eGz8q zzG0``Qyc7Mo81o(VQg4#2!BHDRJ4~(YqJ}U(l(fZ|G($$nXYkoyGC1#gM1EUN{J%E z6L@_=hcYEG%Wj;?6|)#W1;51iGSl(3r`nE=mrbs+49Y3OpKyeV_Ogw`MNkLA>! z^t%(9c)Q9k7Fs>_mewsTy$BEeDkPEju{f2YnXCMbafUA6+LMlhIlDi)XZJK#=Pf$> zp26~n^qwCplY`kkKPf_~6dlUxzK`8e)eM2X9^AIsvWvA5%4{RM=O;ykCzU7C=lR$AtIW<;Ml#`vK#>Sg1{m@%E>nhy-&PdM+2_OkIKyP+bX4l?`qmVezdjkaCF z`QA{bo+~0enULNX;pp%tTA%FJw{+w#?bHL_IP_u<(+@A3eq=Yxr3imQJy5ilO+PM! zf4UWUgzmz(mb`JO?LF;NKJ(U=hNs%6c7^AuOVh24TiJ2fRs!$&08b|fm7;kU%&u$f zP0)`6wn~2IwrpO8x1^Rn5iOAk&;`@`R!3q98--YZ&d zeNz-Yj2-8nU>sLNqm)X~J`SQQIq00CG&ncOgHWbT%;Pz!6dlTx_7!WEmi9qz=k@Rg zYL~Pp+QTS10TFl!vHNR?8I(%VYR97JvCo#4E`crSh4Z40pl&-Nl^Ed@^L{KXHNckq z2U4O`iuN`v7M*|`+q3-khGDDB8;=SK2FYoqOKiLyk6-$w5VgCz#!=??i_(ZK8Tk zmmjX&-HXzegfeZ3BEpkOixb|&*^L@kl-43PS%qJCl~eB3I6ppen=A2y>0Lq|WhmPH zpz%Drry;dI?u9As%+tT$zs+8Gy|t0u(~u(as1(g|6rGQ8oQ0LqZ?LZAjR9+m7DuTk zQx69n#Hy>!=GMuP&?u!+H18yM@xK2*KS&GUUWT$8%ADOiKiFKtT^3l69eTT^G99@` z0OT`oLY)1j#adoAAC=vNnIilNt&gI;Y(DB<+>5*pzczFL&v{SnjPYiX-42omyruTK zYPaou9-m*@XF-SL|E1q^2CJ`Vx0S~8ow2t&6k`HcL2I$oj63e$!f&1_|I20Sd3IN0icl&=hcYGcoKx48?#^!8^wBDx zId48!rh|&`C!|uemswxFM=_N|-XM4X_j{yqdqu>N)mt0cJ&GwJkBYkO^`_?<^{K9T z1V}9kWsY1C;Yp>YhBt8>I=eoL)Eu8__9T?)&lM4#RIY@=n`o~NJ!M^C)6=8Uk$bP` z0eGAB)1R0=hH`U6cw%?ZTZCL0E#qr)QRvQyVqUY&d*wk%W0GAl@nKxTg&yDA^q2~)ftxBH5-m6l%&J*prX|^Q0 z1w8GQkDS`c+pOn3Mq6Tch+COFSAg8ukEpd)U_pV*uC>B zvueCm_u*-76RQR!rH7tvpX|VxTBsDQYf;=MJZxRz(&tPP)t2za$}z9oUZ|JNG8}f? zy22w%4B<~Gaf z$!vR`y`m2Kyio^3nNp&N@TAf@yXCXkMwVEyB8O?f4yC5!xx-dTkQH^yEJa|vdPtD zx6CR1VYAJyKcW06+RG+ad2>Y_^jV+|hB7&*i11`Yd9H}|xibH8MPX=ZJkCMR!Mb++ z_}bzh-*1=tDDMgT?!C2foO0OE(o0A6Oxj{EL#Y(Kat&_2*~<4aR7zYLIEyYZl-*F~ z>?$HW!OgvyR1zJ^9QjYL8dJC*=bg#HF!GU2C;Vh)vDLBGlTdDs2u~_!G`xvx&Oc16 zD!q*yKX2gIrT(jGi))^;xzhPLW7nB1;LOBDRizhedMDj+N>8a2t@DOoGinwT znE90Ba4Sk%;#{LO2xaPrBEpkOuOHq-{djT2f)Y;mCu}2l=W*p3rB3+l+OOe?2u~`# zes~jmHTf3{3cLT&#^K(X?^P}GvgzQ($a4F84!*q9;O{j0XP z{f!n=cbrjM+-HILL9aL2U3tQSLYEAYM@32Wdh?vuRC7&r&aytA=gmEGcoSv!Qsk3;HRHK^HMZ^=+}sjH z(UZd#losKOC-Ot76zyfRSHn8gmJY{P3eR#MPS&q(4JgO@CY*2Iy|(lK&TT({^`KHI z+GAg$^JTZWHE;??emx?HS-3|x#sN|KaRvW4x7?F`5p*e>(`8{Eq0q^ z@$N3wwZ&IHqi<)-@ECah7I!W#L@r_+N~LHWAHEr!QB_)kukZhZ=vCjf z!yYq>R}Zu{hHgKzc>Y7)#+MgVmCl6!xCd(krBbxEjWgTdtZLli&wZ2M!mBBjqSar)XFR#2`q#)cLCY{Go>?pmpno0N z^x(9a#S?m&uMK6+t|G#d5lxB?W!kHM!q@JExw-?ht1{|6q4argO?J12uRZgG-pSRN zU8PdA%5)T6zQyduqw!_@aX1mb%Y`$Gul?EPO6OG~%cnxgzqZG^*k3-kdCH{4Mf@u?_8&_nq_OWwRxZ0x>#6 z_!Cko+RHY(qgu>vOpu#%8P>J>#79nk=$o+G`u6I^w#dzSBRHs3iuSoOTcT3pbHXPs zF^qjenchGV;R(K1%A}I$P-g5i3mH{@g3PD0q33G{&n!NDo9WuThMC0{olFO}uANz& zHOFNZc-@lR{A$qN8y7Z?ri(l1Sj1tPU zSBeNvDx>1?Ch~mBi(LzkXL5D%@R`MJFSa$#Rgl+?lWdLSWs9#A;ZNxM6zyg6oF6^8 zq!D_aj^mBdGmAscxAowqvu74}Kg-sGp-kJZi11`WlcGbJ9Q^m1RgHW9rEl{8zz?;3 zI-@$%Q8exIRgFDiuO0(GluFTRE5Y;HF@^E?0*(Ceh>YH#)uA(sZ;iDW&dcV{N8+o= zkF(W;KcVI*+RLUx*@jyjK2aOxWkdW4hz~P_KcTKE+RLVconP)+x?#@r zv<*k_U8+%Dwl*GorEBSo4B=1sE=7CU+Q?f+QH$IXQ3per98^SjGQPYrCEC|fwwIyO z?o!QlhD$!>HIyk=iU?1Tk+Qrqfm0pjGJAE~zq^)h%0?a#<3tiGrLq#CGOFlM{;@Ww zIgX|*g);SAdljCHERU9GZ^I;Uw=2gKl1vhPXM*#in(AfK^U*WM6i&^g-JkHiiuSVU zd7j5WSP$^w2$eXDDsb7rqxqd3AIXUr_FImvX;%QkXF_!COCqP=X= ze%Sw3HC}*B=6m6!tV*?d8Px*p6d?9F4z}ca*b=2uw8j!RIq+!Xz)KKe@ZaeRXX5@! z^Amf27W~KK>(qbroYgpR5_)tuepgc}MYDYEUhY4Nd$ekN2l)+YOH!&K<}-HwU}o`} zVK!G@wz;b9*sAfZ4B<~WCyMs6%@sT+ZF}0r&R==lHnOR{PhA$zjgWE{!<7+ArRY#* z4EOr3t*ZZ<^=j)s&Mc1XVR0gRa>{-dCx$ZH*mhIP>d%3=bH$|#!xQ8g5VZSwTjL!4 zcFXGTvNrTdK7wsbu5Vn-7?J{G99S-s)y z+SF2~V=lyvD`<#o8lA)Td8~zV=V;(qF3eO*o%8sc~@~sBZ>JsT8fzATl99 zO5V>nNW@c_v_E)tkan*(*;Pay6?MYvO+WtdQOm~7*<6LVWSq=yH)`rbnB_ce5ug#)YqC=Up+haq^#H;r04zH#vZ*z;M7(`_7~^V#)WEs?eH_{_$|C42`k z66a)^Q#sl#gW2}$GH*aX=(e5Gp3Z10iIs93JWlubTOF!YigwSC#iHUr^ob%unbLmN zCoQYL&ZOkS8%;7O4a#RPo0PoqdCO{8>assS1#(4cP_&m#N>poI2f4%I8qE0#W%7KI zScdRqM3bU@Mr?Lf&-F<@f^A$orE%c9nKvN9J%DR1eTI$Pybo?(M0WASc%C$;adN2@auMdQD{y84gET-O%XTB#KM(15yh*UV z)s=r&3-yfp6p>G*XpZCji>eCuW9KeLulAi*m;SEC*2g?qSN<)v>&&|JcQxbSaZ{@b zn}K)>QJGRHddcH;>93hK4)DCudG3~)ygdm1%J)mWT;_SB^W2}1w~F?%@x1LftE&6r z_LE6Cz2p6*^!bcZ?|jxxcK`Ins_Ng}**Ezatf*2c+Q(#C`wNWxb&ULf_!YoM&UY!5 zqNAwxf~vy7*h78?dzMP2XrC)<1FO4|?^y;8R;~>~J$bGOT^j@{MU&^)v#j<#OP5iO z!{>*5_Oi_t_AIM?&(fc$gpx)m?Z}85_EnFh7X> z-Rf+AH}=`(jJjo@WcchFKmKpS)zuxbFZyTvZlF|(R+&!sEK9y;=^DlPIbzScbpMiC z{*r({)AMD_Oj_<@#|I9Uqc5MW36^ar@Hd4?8Gzb%D=0;vR_?!-xogW^HtT0 z{@OP=7@ke36usd1y7DhHX?)e_@zssn!(L(kg7#cj-d=BWh4`w`MO%D@ox6hX z-06(EZd1a&Y;9n7u;9Cc{-n7U`I}5Xup3qIJ+dH)kiG-!(tT?3Ae1S)iU?0CB|N-| zlBfuOLQXlFqYY*HK}CcomEJPEiM9lLuLa+G^^tQ<+`@6RUbeZy-fO}4Uj0e)8TB{W zTy>vbRhW$5qXt5*R2qidTvz^0P^Bk|@Y`L%f4fsEMYp>g=nr(Q-{OPo z(mi(aS#`qejUW5J-?j7}^2##O&!bYb>Bn~)S5-x<4~?uO8ZCfwI%r4 z|HIc#N~LJ`k9<=U;p|7r&wiXRsxCe6!PXDDqAopa!oGXidWEweB|rP&Pe`R`FWbn6 z4p~q-?GJY9#Swg0--qhTXIQ*!ZM4JboyW5iLjI(APy9{R26oR2{(F>b6n#{yQ|rp- z`a(I|Z!aUllS*q4-o&~3Y37@Fva`P6!qJJek zC*p5hR98Mn^yyahG=zX4=psn!u7z)OQ{s?_R7{#_}#hWzdO6Xqi(AQ@Uq!>&xF2;un*L<`?|?52aG{oS)a1zqE;> zU;lhvDS6($eA)fYy7c=P&hC=$>e6rUD92tl9h`mQy3+J#4dG8nrD!jk4)(-2{*G~6 zir+s@UszxM?tjC%_2utJkD5_0-;5sk=={RA4|Paxhej!tqUZdrzMNSg%?A*BJ^-aU zYF&MrbAUYXvi0hizFWmtoniR^{0XTP?PcTOBPXsaOnP=yDp%(%t1Ex!b^6zc;j?co zLzzBG5#h;%CPjxb{UAS)%L;p zh12j2?^yhv>Qa(YWipoXJd-Qq;OIx@7mh@B)r%2@D{mF;a%DP*v(6+GwE)cRz) z(p>WK)zTQYl(>KK*{M zW6}eh^YyURlS)kuZ=y!w+t-4B&-c~w-oLW-hphbDzmWBX(^&YpX(I49mK#&E6$HdhA?ObQ2L982H_l}gb* z4vQ049+ng?#P_vbAtmbRXWmv{&f}z!0Wum7NDBUatx_p^^hNdMTux*{fB0xO^RKK3W|gc2bdP z>fggf{7^)AGQLUCp-g{{3^eikyI3ZjFTgd+30KqfZFPN?D-QWA%VpYKMT94a zWCR_`ltg4zNvhiqNoCig46d-fC*)cvH%EjgBg)YW(cw*$-8G9=6plt-oTsq5^V#LR z@7Jy&%@4;me0Gf=OBb&wj75I921ue(Df-@H8q)l5CRfM;7613c!3lLRj2wBkPpwb$ zhS5ibGUrMW;YsC;hBtBK^{bZ_?&;MgX^kkutqghYeWzr&B{C^NPNzba(>p zrZo3X!E^5%b!UA!bKJ$7>&tm~s$Qxu=ca?*#q55A{D!>wM5z?L%Zv4rdq+p^BcyHj zS)gqXW!iQ{geS;!nn@qgq0Dj2>%CPxXSA&*LIhAFl2|E~l?atlMTau^fsAsAXO!D< zZCyDh;D&AL(|mM{Uc79vk0SgDsTA#Hi+%FO!O?mT`QA|GTqze?(`<5AR$>91lFC*pk#oyGY`5LJcUS>V=s{OWevL?%==TAtbXfK;aJ-BDvxKoyu z%Vm^LR4Tn}2;}jKJ&%_^Q3)rNzsaQi=)PMe*Z4Xri$6I(ue?%M&e7;)tjY_3x)s-~YWa7Cdy;tmsN`{wh z9LP19c&g9!IGZ?RMAvhk9r46+M}IYEp$Vbx;xENu{?8 zZ=xSWez-!GA1?9MIalu0s72mG(_60(?*&*h zy}o$F`*s>P)Uypm0 z#T(xmkd7mGXYI*^X1!8G=x?Rh4{zegPa!W}w>Df7scVz3YA7Dq#4k~hnItQl4ju-? z-WkH5kV?^BHfcwu!sOVu2BbW9uSP4g`I7o_ZbL7d^+7hoWXCrR;ZNAQqP=Xr>NjU& z;Wyn|BwJu5teTV8L+jOVXKyU5-KRw|3sIj^DSG78hT_O$^6%>S8f@o zok3p5OPRB)2&GbVC{uP-+8sf;3Nkjb+=j`OBJ!yeO}VP-)*}An?2V;4*r!%~_R+FE zpAnngu|PCkv$3=pzj-N@qE-K+XuH=3#J|FP(GMz>zn47ldgDjKvH|gKEe(-J#h!S* z^-87PrJ7#YC7-es%3K>LB0Q;FL4-F^Yn6k}DbBm{CX|~a!jlmdUM9SW{5TP_yW8~} zO9K%5-1J3#aotyzP4lLoHn9c&?V(ZFqB@hkEiu5z6yGr4mCa zNq%xb^2{ry=f0ZYocR2(Jull_-2w|YE3U~eq-Sl_^4yB`{D26EV{>`-F44tv)ktCjfHMq zTO=3^dwWEuH|ivpV1J2rH_Yz%rf(NDq<2noOrf4W3U~075&2Y#CO>d{MDnlw z?1ldpcxnk^y_^&0K<4{CCm7*Do?%1J7_Kbx1?`j-qkbHI(lz`tFuQu`e50{pB z22!aM{oV-;a$gZ{&Wio6EgvDr;Z~I62=yF?BJ!ye&2iw4s`y}JWXByXl116=D(z0MFW(=vWDo_oF7_Ff+kPD*Fk9d7C&=NwyKzN50FiNDW?XbL+Sb@~d}( z|4=GLt3G0F@O1n572G*-0QB5@MXB~)Q9pbf=A-t;IPOPY*^}^Pm{KX)$6@-R7A{zy zab+Hm&!L`rt_bH;C6%J7=R=y>$I}l@N?*d)s+D>4frj#3uWFSryFfg5SW>zGbEQ;@ zE@213Z;g#2+%gvXEn_|>uI*#XO~a(yjheKD{Y69)xo&^f;$&KzxdAB5En7z9Q`LwhQm*j(e8P;=Y{N&+II*-E+K?stw`j4*yE*PPF^QC@HM3imt5t7{CAN5%Jgy|uyf^Z&#-dh)|( zm$KBk+pOX>wH#Y4{C zE6p=;_PAL^-j{5>y6gPz@ti$tOTWW9N~sk6;@DZmhLwhnqF>y2PW7>vm7=MG*T7yK zfxF^wL+qoTzUhUA^1bmI8AMSlAnwIo@q1!+l}gdKUfCdb#pAy1IJ<8<_IW3#)T+6D z7zdyDyegi8yBZF}xh17iwDZRN$7^V#G<9z2>@WK#j^O+_f_(NijOYE=RKvZ)N)(Y#rD*D)dQL}Bs$I7ki-daG5=G=wDVnzZ za-5iKi90~(Kjt)GeSVkSUpwZy`r^gQZGG2H43S60NY?9Z&G|3HSEpq0 zm9E_NyFL$5GI9u@iQ^~UovPUs!?udga02Sm~|9WmUQd#CY^zSj}fM&0qf;|}Llm6~7~ zluFSzT{)}x(uek@DC&y*rPZ^>r2J?)WLELJ%lQPq_8mE^cx2QeZ7nom zS^bj9mD>--RH2@-tB8E6nzHpVp07ddvn9R)rR;jtM^0Uaas2&RwpST5;AJrkvQ*_1s^~K-cVf^rV(~mD9C1+e{IK;$ z9zQCn6wNsCng2~rZu_0_Lt9r_@_HLb6A<@ih&(Fx(Ccj+&wM*M?mye)O7%daWv@4z z_%bB1!_9`sqoNjhy=l~|Ur$aB#7!}jE7w{+S=+0jIH?_VrBdgS@npl~WZ`3m$fHuU zweih`-Q%xzsx1vhe5H}s-Pp~3@F0^Vjnty(Gpr`A#oYj7flw+%fBP^_F`wZv+}b00 z#*Z8{v~&%;fvy^KethKFTpigne*A!;r6bXXQYqSPj71rq{KM~*`D*JXb_Mm7?iC_PD!m z9Bo+D_%~>jTK)U?npK=~iTMxp5>fQ8d41#YyR2?J0s5g-ieCPDL-DQOyZ`8bj4H#v z?3()8m3^@We9Gc0mv+i-sOLBokxwgb7e{yN zn8t8kZ?=8JGZ!acoNI_YDr&ITn{D5K%zGDHx1^CxYn^Y~kRjwD@1pLGKlHTi@#lYoihQYCB*Yzryco zN~LHYhxx${bEn5|G?@cE7ec@hF_{^?GYV5qVVXyVu(|RBMB@*OWDt@*3*N zb49qGS5hfDjp6$CkJoHDyYUtHbG0(Zc9~VYcca-WwMsY%*sp*5WT)AU2LPc|ir(R! zhT{8C$1L7$GjvMQ?hIQ^c(lY3-hs0Xe;IG_mDigNDk6_c(Kc7=4P2vW+g&HfwNOu+ zsEB+jMboxldBgN%n@`MtRIGk7`$#+J^=1=^*tF6RYAu~AwNYYSqi7ub$H0$QHU1Sc z?DE4A>WZ#XN`8J<-}s(rb>m^sUZqm>z#C^3A3xJH7X!OJpWU>L%s!F_ zUT^$32cC1%G8>0lOQ%w_@#BR)IMKiH>c$NihwB=jXiv0NXf1AW`4G4ED3zjJ zA1y9f0RM5x-R3`(%HK=9^Lo?47C_wlt|9WM*h8)64a=SBl7|QZ(&V zmjn98-L{!seJW;`BmDmCPU)T%XZpCcv^e8af3;zC$Fv^zl7WML+RUzg0Ny~U6wNuj z|NKrV8h33WW;o~>lM-5nCqCf2EYiF6WNRYXrhTIcr$a)c9_ zXtj5EhhrMoL`(g~GPl%cW3Kkya&~o3uGNG}(ews~9miP^o~LmMIk-!Su_3;k%lPaP zWA&V?jOQsLpGwheBa_4wL3y3HQ>V0z(4NJ+Rxh&KtXE1kE|p5}ZDp_gy_8+=A!Rqz zi|kg6qmoL|l--etkXxN+a>Ypag!@cC=owmp|C}qYXBjtCKoYNAYKS~4_a8*3<>)7n zj+c;;9Wh+eYaffeoX_r&m%MAbNm;2f^XIP3X)KytaFE5+8qxO} z?6xaJ`sN1_igw_2juC@~IR}d!-i6XP2CEYe$}kdh%Qm`BaML+TfqCa6g;hIPh?I zHMe9b2eY*ZZM$1O(;Wl2XOmno^uBL$2IUDEwN(pC*+iS1CGht zHc8w9@$R$8iHw_K(zt{khffsk{=;~#Ud`iB7OH6YCkId$2pAlY8nSFfX7iP^(AUo z%Im>u+7g{n<)+sg2eb8HipZm4-@V?(k!e&qa@Qzoj@nwUH@kbDX>E$gqf)f#U=~@X zy;5n=zI(lmV}V7lDI$-GefN4B$0hIv!yYkjpqyev{@gB|(!C6?H=ZjZkBaa0dTZlm zM3zH8Tvc5U9b`1Q>T`>CwC}Dfrh^^t>>IcFcvbZ$h{%*m(TrYKZu0o*-4lDqXHTvw z{EBjgo!{qMcTVFH?u$)%!XgXqer<7=#Vg1m1jOMdRu$fdTq%{Jxwkx^cjqiF$$ouJ z*ErnSoG`s}8eeHoyx#bc{lc3f@~AjJUT<@?BlZ9~JZ-BYeWJ7A_0~okAa=+Qc~pF_ z*IOIeiazZXSMI0?U69`$EKS=cs zkxym&qMUWx7ySp;Y6rDjU0nl7R2kK%Sfk}A`Wh?xYmmMEX-K;tVIEn_< z^p3A;s4DD+ZxoeE(awL9_UzY;5^XzwA6Rq@<;Q;WSYI+(;_n|;rtB&rJh9(A939@o zn4uS}&rhP&)hEH9tLAv$>8agbnLnQg3)f@Cs_Myzl$A=+K0cePdoWkWW3FxkLZA4^ z`Cfff6n%oZ`nJBRa1r)Ll}gb*SJpIR-<<6+R5K!va74Rd@4oLUY&~THr%eH z_CwZGhBzxj}{bUGh0dpY7?BHX%vVf%<<^J%;7PaJdv`%(F(LiEmiEf{ zp@@7cMUx+j@HRLON3(~ap8QZmK9!<5j$Ltb;LyEm3)p*2&mq_S#`^9anbz5TyNzQE zPA44StG4h<*mkAjIaEjUL}UA@U9vs0TQ*OQ$0J`c=Ze3RztpmG>LFd0sDq)NwnP#6 zRCdP8y*6(8!x^uM*=Z{N;@)?7=QQ^5_fnQZJ?Bah`BZj>g}pUB|0PELPvk`Y6018O zIVH|VPTu%ju^dI~FuNaPt`=ams#J>hxyoeM&XJ{Z#q%ZG>|jw5&y;<43VUMbOIUCE zk)0z;5qVU6uh&}}$0LTj@Z_O|Dae<>lNC!QT1>4`u|~^L^fSb8XXAE<4unsr!dd5d+T6k< zL`yua{9r#y9Dci5j(xvvD97WPcmihjG8yo>0E@9n%l*3H$DxHT|ghvMSy%b#7scFYL^=>w%&xM}7hL@i}7ZiRhKf z58vfppKW+#U~LQrKdwehJsNu%N~LI*F`HeDmV!61llE?-LOpd*5pHGJdZ1D??Uib6 z&?q}iLrtZ;hI;CtB3#casT58Bu>-!e_LyldBqN z?U8%b7QO{PRDM*#Rq}D($4+b&cw$Sb6s_`BX?@%-an<1SLz@`t$&WmHRY|32##jG@ z?6!jJ?t{qE=Y%74Nu-T(*)@B0^7^WHCN%16eCMT9igwwxx!NA5+iD-T6Lji@-FA_i zUT^kl(5A`B*>@QtkBaa0dTS#)NuFA`;MMG_wn4XbNn@%|Pq|VAPo@8mO3}2`itu;Q zpF5h8AL_{uMdVW{n)>kpzQ-9h!fYbHE4cV}^MlIgP|r3Lkxymk$ms2C&A9=-wkkXK z>e9|xR4d{2rXOo@YO?*+=AHAX6m9%C4<|GKdAV^=SJgbfIqP9tlY4y{Uq_0_qoRNH zdh@l}Db|$d`h;g)fBJ>B;q}%=c2YJ)?&ZIkfAxBk-Rx_? z6p=^8`SE(2t3ChTA%5i_^9yqkE%9rYr-oFe@t|uFdElC6w*3hp<~}yRa3v5*rD*%Q zrYeiCm`i_OWFMxl)e-Wmgd+~1WZ)i6nYSqF2gI%!B9Dsm&M(s+Pt2C6EUA@1 zK1*bcxaQ!ba4*K8REnc6wrd;YO@+RO0--j1$~mS{StWnY@BEj#4Sw z+qQ9JU!SG+DtOK;L(jH0rch5msEG6nw;xa`n!fhHntfB<7&2>m91xWr`P5Ib7JY>r zBw~vv+sEtrC56jzrbzqibH&l>_@ZdWQ|;s3k-h#1?1d|pqJ4IMTx;pKT_34MuC=C7 zd0JaZrD#TdxBqrTlI(BxN=NS6MK2TTIlGF;r?M`BaLgy~@7SOXW(vm)a<=x7k%h9u<4&^=7ZO#_ayRN9F9M zl97#;_R43M<#KMS)WZ3kR9ZF5Wf3ggFtl+n+IVVZtA#$hKi&o{Tpc8FWtCxj~Sg2Hr z4sCFDvwTY_2btfa`z5xQ!5mBdpR<_3>&>=j`Ib^d9u=*D*PCU?GI^#5=FHo(?>?!n zF^lArSFmik^sJtU z=8L6;t>HhEO3}<;^ub)066C*5ma@p@WRKkpkw?Y(@p_x9xT-}w z`O1xjCj5@W?0X9y+$W7inGJ8qntjsvf!X)Im~G`KdJ^eUvi9XYmrBF{v%;QHTm7*zE(MN;hUT0cXF6{~P)a-HeK52CC^%f_#2BK4j z$fM%?c)iV4?Jh&&lRH`l8hzq^iSPA#YvY66hQzn;VTe2`zSrxm4UNd$UeQl@bVk_? z^^{#jqMw$8;WpFu_u8_(QM;WWOdvPnKnB?+L=xB z`FBk}ZbB~B->)$VpT8^g@j9!=Z+Ad!J$GZF4R!~WO3}>MS#vlwm=-R}m=#k$I^uVy zIp=ptSMF*#Lp{f#hV=HjKZ2v_2tD34B97UrxwvM+gttbq_ z$dyXbI=(0xiwtJR;6{)05%szJP#RS4m{nQOB-Y8$! z`g^JK8rzjK6&8@GFwGm~BUGL6wrw2u{C9A&VuHyobLK66)7DYU19;i?x}A5Bl`t1tKNjnr+Y)LluFTVca0yawXUh;fom`=YN+Qp6p>G* zXxiO5O9#YlTUoARZ=Iad9(uj?ss}QEAHJm_@~9MTJm0W?oA?;WRS(RS%M$0xrG)Qw zxiZ;38yU>{eYUi4G!ROqXqPMNRloK_l7Hg{3EC1}RlAH)mb~8NYBaJse$vShc~s=H z*Z;U&(aN~Q@Vzcq)<&LORZ=PX$7~{7cWX!4_4X`g$g_!+REp->;8x^Zp5DDh{5E#g zm^FD#SNhipO=_LhYGV)JnvI1m5I6h`va3{zW|rm`u65g<-Kdk=cHX-1pHWq*J~ONM z!X7N!eLPmCy;6iyDLRxnSFa^23cviWbv*P7yLYM6*%q+J;(7MSHy= zvP|hIB9Dqa@p|jk&CvnL!t6!_W_Ew>9rJe@Cx$Yuk0QboyOqSz;Z2;~2gY?yrXx!% z=Zd$Fys}@{bZy{Nv>&0&NJbIiiQVAh=9q+6He|*cjXX?vlaSBfY>l==G+9 z*?mPRB9Dr8(Cf`6YOlO?+IH_DZF?wlt`rfT*iB{}2hrh8oGaWlk?_t5&XumPn3Mk6 zmNpKrw{grscKlDX+Y0ii*mtkDam;ypKs@Ff%UsW_@)vw*vg>w`?+x|rl_K(~EN`uQ z?ec8}F~{K=MH%(?(w2lWIhfsVkRrm9N{bWTL|dZ0QiS)gvOTt;h&$UjEc(o~ z8w>qlMW4sY%Y7CqzYkKgE(O3~hi`C8Rlmqe~{T!Z=EP^JzlB0Q;)rD(V9HjeB*mQ+7fs#UkW-t;58 zk0nLqQIVToZ~AfFKUNf`Y-$~E56^iN_DGhGHD9aVQoSh7Ct@7+i1tqbLa7wZd%kXb z(|v7ryJITtIzpcX_QcCJ^6Uo56yZ-urD!kPII`PrDiC~^OAM*JY;9yW>ZAyN(!3|y zcBR(3c2?RCyP?8t3~foCo;UZ%;Z5|lCHRlCGylPx%$jaAd!^pe%jVS{1Y%l-@F%ne ziuSU3&g^EnbmY9Z>!6*wrTZ5;qh7YT%5JYq5&nd8rD!i3Kl;K%>A-)Q0HGYHf z?TOve-5TCTT0OQ~>J4~BxBt*In2DFhUB^ z5_ztO@WgIjbaZ$Vd49)FlR}qg+s9Q{pX)5@{O}gFc^`S4_!WN1Xj^I@-+|vhluFS$ zZ;&gyXEdRY;_YtNpZi0P9K17ayCT99yIa)J;Y}R*_Pe)DT4J5UHhA0K3ymhbDt%ry z+5G_b_PvH(NFw|RWmM5#Hrag|cYwZ%Y|xV+S1O4*KW1aclbESyz#BR2xBoZCo#JSqGkQD9%&$q*Flyi{s>OG;}d2d-C zMW^C7gL#YF#{+Qdf>J5kd2U*p-Gmu)c6sCFdnH@rxb)HMhceqxM0jHNWjZ>%iE&AG zgQU$B?wsuLzVTeS=4In~c1vZ7@F(Og@0oP8myPF}vC^J^HF^QRrRtnG2RT~jxy{wv zYnK)->D?wSVg;#Giq<)dqU^55v{$@&al2P7rsn;OYyM(7?`5-a*B zoz*gg*|l3-ZT)HY1o~Pu-;#P_NesdnMJ?T6+UK8BC_H{?pG6zx9h$90gi=v<>tgfd5-r-P(& zy(2o5=|6sV{JO%{&y9+y=i0jWkR0@~^-2-`gj9<5vPsFsILq*B+|O|<;&$G|zUzN2 zPUKy$XYWa0JFaQ;MfJs#{$lmm>w|?W;$DjrF}q5oXx{wZYJ{Qj>nnb}dKi1W-4R*p zyEK~AC==h;;-1m}0Wlv4rBbxEje7xbFY=?=ovc1`&WT%tbQUBgilPVmZ52Ooy4~Wc zREqYp&6Rosm-gn;7bKCgtBCNVGI|MbqU<#n*T2n(mS5jOt9| z7hXvFOdw9hTq%{Jdkw5F?tP8(85&nd}NYP$4AGPBAxrLW; z#(fXW?&O284|ALK-L;7GqgDd<#No8>+n-j&7hpZ8REqXFwAsCP_`1^JS-ktoAF(!w zY#iz>y=>#S<(PG)FP^su*`Kh#iuSUNqZe*Nz!}Aq=fAkGuDE9FebRl=^On^WPyWdE zMMIghtBCMqT$7?hnLg@8+&h5G@@X5pUs_i@2m8BhU8zEuZ73o<8P}xfP-YvrYof$c zzmzMNlIC6}cpUmDMT93K%hE@5coQx4uYbO-lw`B(o}N;@`@F%2Fw3n?{YDL{zHka@q?bHuNgeTY?%&a!iq0HHx(YdzpJnjJ5 z3F}&I{n$-)#XkSCb-!CXqVXI3?zM&Uad*ZW`29nv6kX{*-sn(U7(S(Y{5;lCj-bzQ z1n0-wU_D~dcD04k_-dppesNbSMSB}IyPx1Yvg7d8$mj62H!i9xUO&ow?WbGS7pIoY zTW(%mS3Gl|)#J24r`o~^KwJ)lQYre7rFF%Ru%frK25RBll2IB|`a+qrtBCNVrfd_5 z4sW9DzJJ1kQWs=0r<5FYMP2c}g2}E*pO;NaE<9yH>Ejy>;ZOKpMSIy~SFNZ^31c6( zsN_K?)1NCMJgM~h;Z5Y=J@_i@6nq`_26l>6+MUmoCHJ)^SG)gzjGYO*Rpa`{7aGVE z(lr!H(j`eMq_cOdTyYI?4M`aiDxrw0I;ZwIr!sd%rAtU6Wh$bivp1&@e?z7WWk{Kl zE-A%D|Myw%e%|-H_gd|4pAVn)InVFApLbgCde^hw;f4vRUCq<^A7=I^Riw2o*qq;O ze02K0Mf!R3bY|Uhgv60k5L|ifgw!;Xs%56msUpp`V0P>Icfaf^vm1icN7p8m;jDA) z^L$n3%J7C0?YKm*ZJ+qCA->5IYLUK=v|igj@ubRrsWZ*~3F4!3hsto#83#pQ`08Cy z8Rks=%kTPYX;&n?rAIAke=Y6mrU%An5BzONl#e?etqk|S!rt5L4g9s-=OnzPXDw-e zEvdTirhcha=Hvy*N6SoQxLw#Pidpu1$@IZ3T1Bx%z0UWEhWH{+s730Qv|igf?|Iyr zsgsXCEd3Aj#rafum=Dk1ls5>h_u!}f_48@?}l`oVVT`X;tS6>0ThOZR|xT4rxH z`&meR47{>3d}d63+Ylz3B9(ZJ8sJO)PH}qgjyt3r1jdi-B)gCk$R&?+w@<} zvz8XEXGuF#Yvy15vqh@MKia0pn|4JNX>AMEM^}^c*UbH~hq*uWx1{}O3MK7YR<>Qe z-RaEK0j8{EP7zh4)t}Azc0*gFt~s}D`k$s3)l|uEQAOIU5;FPt#pL5B(^FGLTJvFj z$olrl`TEcvPI^myTFQ9WUrXC1;VlDP&ndM3CArV%-!ne@dA?87o?7}^zBTH#?b}JH zMShpGUT?W?FHVV1mEvK?xpvI3;3yMM9$=p( z`gc15Ad#e!wxoZz?JB8fD85tuT`TuF32!m)YWaReXn!sDIiEP%Gsw6^pFYyY{I&Ex zB)nyy>wSdwza*tQ>;0CgOU9Q+_c?n@ZGDnky|yi}`I45YyYhruL`7P!ZCSA;YTXu( z^t6TA`XJ#gg-?C|OY%HV>P02DTGCQhg*hjYtRgL?yKKt%?7Cm=m_gf*w&{1w zy8%_C2VGJbc5SZD^Ha>J@6GSnn3V|RStpl=&A;9^deZm!y*&JB!@f2qH>o_l_)hzG zvmf$7b#m`a+?f5uj2WmR-F8lSxas&N5pDXCZ4OV*G_xAz`EgPA^6=M__BG=KGk`Rf z|89HH79V#?|7EkC@6+nuig5JK_H4;JKBx!}dAmt8_SL`JR?_PIPU-%2Y^st}()#r8 zwk3}G*T!uBR&{b`n`hKw)NQYmD#ACOuyuaZn)2|+Q0sh#X(8vfsFVB7v@5Devn>Qc zZo9+NFPoG}S!oWXOeVcKA{^GwmYZJNvYPxyoAjtpETI;bkEryQY+0EZ5V;^fA8zvE z;bDi`eWG#nz(dNzNtf*tjj#3E=G@G($nBRW)FM3@X}z{R+`-E_<^J=#o#UmgLA>{S zvLd`}KgmZ=*J5makVsaMmi~$@kv_Cl%J2H?V!~UPk{(5=I&%ER>}7wgliS98MQ(jc zdH9#x?R}@YmGaRNv1N7n*p1mA&AmR##4@NNy=2Ysu>aTgmxAD%J2z%08y_c|ScVc( zib_bot3GV$!bgrO(&|I#Xyr@#&HO#s%!9rH`wnjg)Mp>hxQ znU^v9`r7yN&pytCt^3*cbG^2ARBI4wk(7|uYkSvz)U;mNa_hH9WoxjY44_t2F z&;7OZ?IgU#d>@QbXlZ{ft^Kz@>el>_&&Tc?GGX6G?0Ze5nkm;kYyIEF2Z>~r>|$<8 zB%YRkP3~;Fu+W(T&`KRC4t=XVuwK5YPT4~3-lG|UZZRzfw|GVw48vj(c zW*u5du}XRarESm9>W!A!n*6&nN5T_#t_=V02J1urZhZ{;ux0jyJdvc5-_^fcAI!Pt zP<~5GLE5Xomii#!Ej?WM2f?r4i_0eF>%8ZGGvRNS+L#PSta@$xtMP`IkSEk4 z=_Re#HXmm;s#o@9!Tn)2*8!H+YwKfy*_--U^EUs!c{+>bkfU0e zK5<|{s-FBc6RvD$|8C~iK2_6ssd>{r%Di)`5AjY~eb`h@{p0qsb!Hd-d1jo*-_lYL z6{9U?mB^;s%T6`KRVGzbk*4p$p22#z-_`Ukir)0{cT~Lhp^CJ>miuGK>hH_$HSwz} z%-CmYv&yjd3_GUgsF8a0X-U;CuPv_WmiM7gH7R$N zs9xLp7;erskdwwFRceuPC#~1EKGw}&Tr(t3X#XlX)Lu<`AHB9Y@A~56noIJ8T0})! zujTKBIoI6EXhKUt?s@-rd4437RiTQsj7#|B^uKF+26W+?8}{4Ys=<^N@( zR4sjQujsyO^v_JF*HR*P+-Lvp^+AwHQzdy)LUR7_lUpOGYS=Ne1%eh562Dx#Fv$lA zs@i`)atj14B-URsGQ4L+v5(E0N2X~ZA+gsuA!S8^s&Chh2yd#tcU09=r;QR1V6ZLcUs7T%m+7txTE(RT6EhcbXFK4j$D}Q$-62iQL`WUy0YYo#;|U3kivS zF27BQSN2=ze9%HdW=-xnLy0#w?imr%u1HWNUwEg@Rif1%-UlrtWG-*xwMzWwzh6Z4 zAwEb@C0~~peW%2@2e)-~P78@XX7xbb1NHs*3*GUQ1APK5uzF(_L zk_cKz$hsnpKLo*ohpSwDkf2KD!+t#@$pd|NXUxp*JrAa9j5kmbxwjR zS(h$R5u2*hFTKvyIV~h)je90&k|+MJiT6PZ30X}Z?5PA>2??rXPmW_QNg`+=A^Ttb zQmw@A{WiE(LV~Jjhn?4zV5(>#A-jtmxlxJJFZDi1P$j$d4C~M|Usm_;?aPW560+;* z(N`(KRFR-c_Ws;wS`tAE3E7Lc`rEA$RLL&8FYmcuJ|9dKEhJ=D;IWr(ji5?)@BQ=U zB!U(aa$3P#tCTQx?(SL=RLMT;e+%>k$?f*B^&$5lEhOaB1%Kvb%`Qi~`-22kvVXgt z`y2#2HuiN+3kf-?Nl&H?g5@uq<9v{yO3%TvcP;CK77}{mRB3`LJy9!8&_Y7|`E&bB zeLQPZmPwPK%Ad6*J)HlSNz+2Y?~Y$g&_bf{+>GD*`5ul0Rem>q@lo7L>{$tg=W!IC zn?WD^Evj^{>UinWQa}`(UBj{>p}TR*@9N&zaUZmh&|SJq6IAKW!*PNZ64DdNZv3SQ zs-)+$`y@+!ENkTNC|XDq?gKgXV&7Afpo;sg`LdOfJ}o2)cU&}2PS^X8ph|a|iszgb z61oqIB~0(*p64W}@;lHJ-ygJ)kSDe76chyJspdxdB&hOx*%bSrg@lYz{GMl>b~xHS zok>uo>(b+8MGFaCv2F>DmS`cNEAK6_;9);PCP9_1w2G&S781HD-V)!;@IFXTr7L0z zeaJJ4781G|Q1emcS|SOmWOS}8HO)MkqLIE@NXV$)ugD$p+nufk`CC-!>{gqq7gv7h zQbh|1U43SWp6mQu5ecevrfgwZ$z4ke37y*#CukudZ+f~q+pJLxPjmSoL6y!HiTj|1 zguE5Y8k*7sRXXp)5|`Z4#k~*GLPBGGmUtkykE=miNND8F68E;SZ}id$wNlChzDaFLGYLUlU;pKMS9k7#xi{Go=KCSs!KY9 zSVo(DY-^XClb~wS9~E1OWza(6ob57*Wi+1oqRR&fs`}nBvM`q6%8CS4t(%N2h-HL{ zKB($-O9f&XT2_*CT1aGOjzBD9_@4gVnFLjR_pLxIgFa{>@x`$t3S${=giL~}MN29W z%UH6ynQMt8sA@aA9I=eq(|k`&3yCTHD-g?I4@ZJ3owZ=^56!vsSG15=Rj*%DnH5{>w$y2Lbeb7Qe=QCIz=IQKwkf3T(m*I$I%%0|b z&_Y6Ia#$ZNFTc+DAVJkBvxXyp6Kg6$g`Ff64Fb^ z35ho6rmS3jkf2I>rQ}!!EhMD3^RW!mu3TA>ph|jIIomB>AGDB&dhKXe`QrC;5>&}k zLeBq*`=Et{Jbm;;l)};_L6to1EaO9W*OH)0-T-_o!}y3=qWGYNguGek&OP!a&if!imAw1- z-QLXCSJ&EUAtCQOvIj`Km5`uH-oj)D5lal;)4$!3pi15oeJtaqx)WVl(LzGrCUu2t zVV#qpO5Tu@V;QuNkat{JQCXOCX;&nulJ{s?cUhXCO5W~uCa_t_+M@7{UeimJ#2Iwm zzIm$kuJ3A)77~TA3}0GyUWWb_Rg8pqz2uxesM6Jdg*lhDOM)tysiJE;3w_W+LT14D z6}g_VvtIPKsFE2s$pkGV3TIQ%2MMZV9+0jX_IfERT1aqSmM5gFNKhp+pk&@_Vd;tw zT1ZH3>byno!w@-*6v-SojYi3})RWBjk?TT&D$*L6iW9Vu&^VJNFc&9B3ki)NS;9mI z^@&qJP^FP6OB_;uhmMeQw2;uqR6HNFkkB|&oS=n-^n5ZG#}aRBoDe1#LlBS#AfjXA}Akf2KAOmTu1 z5*l+VO;DwArZ_#nq$`a;_qPquaA)#@mc&cb2p)n^*%oylK;W-jiX`CtUgBB7R zbFzf_8t(E@K;)xbqS821+y^cEU5z=FCaBUlQ=FiMgvOjo6I5xODNfKrLSs&)392;C z6enmQp)n^*m^yd$L83rq-n?ZlPTYsatRjnfSC=_Ha;;IS(gal+XDTG*9;AhY#+)pH z`91{%RT^h1^dV1YT1aTj$@y?kH4;>5oGI>u77`jkDos$Ok*PRA3ki)NxqL)DoaCGY zRT`O!`=Et{#+fW}X%iP6j7nD`TVf%hF{ii>{uWglXDTGLl}KbuEF?7MR7gn9`CA35 ze4HsxXv|711w=kdRhrPql&Cb$6ekKS_+5=TSpu^Sb0nzJI8)pQEhIGNRGOel<4kda z77`kBDos$OaVAUD-^|i8ggEc26}DRB4N*@>Z<-*#-ggL4qocOcnZ&RzeF2 zjZ761(n@F{p>d`{LVVCdLgPV}=q zN>!SmO5;p%f))}Qb1F?xrE#V>K?@0uIh7`;(l}F`poN4+sY(-6NzLjCaN9n#m554K z0LpKPKfM-0)(;l?kd{alX(4Pe1({Vy_P74WX`N`2i5>&~ZmQ2t>LT2pA`oY3{NUCTd5#9f0{a|T=DqSU5 znxIP8{8<8X?g~;xm9D|Fgo#EqP26cG9KgK-}ubY-BZbe&(EpoN64`72FOrR)4G zfjM_MT1e=cKTBZFT>(Lrtag+2gYi_+LPA#wmL{mub$)Sz781JVuQWlGuKBYB=G^6q zeaM_UQRzCrxDQ(RySnDj5@sHmdrKujm97l51m@gD^&zwI#6m*X{KZqn-=a#_`NauZ zNa&is(gany&M!{TLPA#wmL{mub$)Sz781HjurxuHuJel%w2+YAPUhT|CaBVNesO{p z61wKEG(nZF^NSO-kkB=Mr3tEZonM@wg@imsWzJn`f+}6-XNjSg_@0^;61wIu?t=tX zx@s>@&_Y622^JDE-X%emuKBY>w{JST*eeODbe&(^2Q4IY&0irQV`>sq={mnSK?@08 z^JfV&=Pv5uB-^#bEhKc6U}=IXU4v%{Gq2CRvCu+7 zR|&>_kf2Ie36>_P(lvjU!1}?0GsCE2)G!Fn>T#pH2WcS@#T@c`i1~LSxua&?o(cc; zkA0(kon>bTWcc?dlL%T! z98fVbJZO#*Z{52-YVDG95>%}jW9C`@pAt+JEhM@hJ~Hh0;noPMrgRz^Ua&TapoPTx zl_SC@Hy0C<4-!-@`f)_~iP;fIcC+)jkh_)^68-KS5x&t{iB^+rSrrphO_^clQ=47o z<34C1vHt84;T;!jjiBnbOGkvCU!%l(tFE4BbCb!@LSoGxBf^E_mDu6=_3r*4L6z>< z9nS|XBy|7w(gan0@95(CpoN6)Dj)Yjf-1iYb+HdxNUZN$5#DjS?36DA?++4Gbsbs} zw!BaY-?B0}T1d1#vLf7ef)cmi?CXOBRps3(!p;vVK_9e`Xk=De-0`UrOGX~$S_uiN zx-_W>d#_f4K4>BF#;4`scdhozmsR`Qhq!h{f~rO9%frs?m7ot=NZdBRJbdALCD?XJ zP}TO`^6cF~7U44+C>LQb>J@!|E`JjbFmqF#>^edET`jD>=5>)lNxjcMikP`Gk z3yHJ(m=iH_N;LY52aAt;C{7hPYNj zf-33xModwHsiK91^r%Z7+ZsWY?ZJ}>T1d!~;gF3=n0&Z8Cqb1wiAEf8U_#rag@ioe z=BAan{bpZQB&d=n>iFxFU|G>ZLY~xr9j!#GN!|wus$^vFkLQ%24_Zjbh@<_hTO+8F z5zh5LClR!ekdf0Jb?tf5K27peBSDpn?dG*kB4{BYBfyPmB`$u}k7P(tB_qydX196U z@4mXUaP+Dc5;BrKYOn$*%4o3R&qj~k4Am|;V4%hRFP&R%$!=kXqLO9_*O)GG77}vCVRHP61XXfcqK{v_y7WKKSwDq7 zsFE|Xef-Mw)UG~gAt5Js`}mc4;<(Z!L6w{#pB%rUg@l}WpB%p;LDk|vD-+^ZQo6K| z=(EX0YZK#FB&gcuz$(PASc9~XSZDT#PmW)aplb06Ra=N((L&<)vZ{jk)qh-lkf7>~ z%c>B+Vm@dg(d&Y${F#dK#NjA|1XaI{HoGC3(+lH011%)hmRGqm9DSOk21!uW=Ao+S zw8Xd%T1brjcU5$TUulA>Zdp?wE`DW3uWl4h3yA~fR3U!FvLZp%As?F3b@3~o_e_o! z5@X(|Li~z8NKiG;?5FSJSM)&(iK$;!Z6SU|f~w`)R3m;xAGDCT=ogcZ#P}5ns>=7M zM*NCCXdyAPe)SgOS0t#qsd+WxSM)&(i2;qP5x+8T!mgE&pz6mq)reo2e%HOF(n8`+ zld9zS6$z@Q9$k(274tz0iAJrfw-CP~LDi(R*%jEuujbG8`Jjcwx9zGCzj|+#FDnvM zEe_2Y3NC)de9%H-+oMcA6604SsA_XU^%kO0w2b}1Ud1_A3kfL&AHSNidV=%8-=a!NJvn|w3kj)BAHTZl+dW;|B|(+69v{DI`jBrW zw2+Wi>El<2e|)67qexICcR_OeiWU-bclr3$9$&uWe2}0@?&jq96)hyBm+VpJT(kuD+73-W964KlG_*K{Uu6901P$j)enkrj8Pz1muSifOqp0Ng6)hxWbmrq%UElLCuD$lGLc{EELtmAvoz_!aX(3ki8EPL5xZ zpi17`ef)|(Xd$6z&f2$$gL+Sn`Vx&A=xFxsePlBvwt#gkuLP@mT9~-3&TfNZfW^COqI;C1zYZ#Km4|A>rpUNvcv8{o;Bb z5>$;iD-$*tp+0>7lgZIS;SsF=g5^mk(MGgVxJB&b^c*vN3>d&NGaUC}~f(V&sx*q@UKT1fa=R+6eicJA+T zPJ*iCM~w`BY%KGZgxLGU+Z;g)iN4#63^$c2Q8{L|BWNMv=Ve(RJ9V@roXL@(YSNn{ z!eRZ?ht`Lb6)hzEysW$rmnsre&6+$SJZYl(D0|xNDVw8(#1~hY{Y76@Vt%VmZUjIJ z2|trdQsw_;awMqg)pbPp=WptR1T7@|Os--dB&a&8>4@<9BV_(nF+mH7^}m|gZ3B`B zT1fc0U&TI1P}S=b^Ns#t_3_B1U0h#63kg5>OMFbLGt9Ls5>(B}nmH3+st=YfEhPNh zFY(d)n8~j9AwgA>=@nszW-?=|IOnvG@N>U}*!GWKUE3u=)uVS+glAuzZeK>tlTfTPK+u398m#QxWz(Smt;Y zmo62FabB~tIlBpX{@T zw2+Xy`Pg+y1T7@|95zW+pAEmd(j`Ha^h#Y1m#A8CS&~^U{FeZ@cBUtiLU0ZwGqhT(j`Haj91bF)rT38xpqYh2^mGz zPE>-aqJ@Nv&TPz5QuX)a?Wj-2yCkTR(ctSf#Xf|fg@lYtZOpPb=On0-F>31-#Xh74 zX(1sa=h{GKY>AH>%ci>;q=kfx;cb*th@*P!>q?gdRWhC*&_sQ_+4~tc0-%M2yk*pF zuLSFZ783GKW#gifs=ZHp#-)k`Rr2n0!-?wShy~}noYO)=-mhkzqeRyY+qhno783Ff zcTY6iu($?kAt7&;t^27D=A0H1euiMN4-!<__uV8Pw2<(T+hQNIknnNXVuBVD5)ZHu z;Zg)uJ`P(<&_cq`LM%m4<>Ro$1T7@|EW}a-RXz?|Owd9?;!HLoT#BH|$6<>JT1ZHQ z%|?Vv5mfoeEeYx2Xd&U}Es~J_iUd_Ya$8K$LPFw~b`E4If+`>DEhcCo;b%IQBB-)= zn#}7fCK!$KbBfIVPHt|L5C>fNjq9(dBK_INj9;-YAwgBg{}#os5`9qRXCz6g8eV<9 zi>lE=qHB{%#IKrMF+TDkt%L+st2$RAe#Lx{plW@uO2n_WL{QbeyfPtvB`uLYsPglq ziffP-67SzrxrO)@399~q4-!=Qxmd+MXdyA6c@^SU?Pj}kmvSVi zI`fz+#IG8+obT=r5>)xwTg9oOg~a&NsPrzWnEm(Nl@kIdljdO782vDO{!e{s^euZx^_i^DnH*#d`zqJn@bffB>Igr zb0%E;>V*L>CK6Qn`Ci5OpoK)o`>M7Ozal}EpYJ6;F5T?kglQqM_K~VB#IHzDb<2}g zp^snPH_x4%l_NowpCMM9b6Q9QX0}Lj{E7rseuh}Fj{*yRx7*yREyS-#Q03>875kv2 zfS4z(JtwQR2<>#$2Rq|A$g@p7($?+=^RQY*p#Xe{uVS7}K`iDj&bnd`L?q zL6y9>CC9HwP$h4Z$?+=^R55}S1XrH%i+gg?LV{5$&4oS5Y{8Ee;RT278)h%CbFSt$ zwAZ~(9uYpYVV~&lo{*keeoIxPC*7I}XY66=LV^|&e_oIYuW6!0MYjL5mdoU5A+fk! zCfw;zCC(o4NK}JTAGDBYUOy9FmR3U3B?K)b*56YReq{E)k`f65<0EQU#ROHEc_vzW zo)Y8sujkqoEhMJ&9U1<9gA$r5DP3Af^g5{`eB%ivUTZuiN>wpI)$hBH41c>%iO0Xa z+@*>Z5M z5Sz>nO}0MX+VG9b2MMZvZ!;pSJyeNDuRYVHiWU-czN-lD@2kYx;d{9^dRjJ2EhOgMKRj%`&3^fu|Ldm^nvcKrG>=$VUu4os9|!@j(j-@%Pbtnkv(-TuUTDmH7T?p%R)Z&4*e@NEsg3v{_ME2|)`9 zDd{gdD>3*k-%3bOC2ir3>y%)sXdxjjW}An%Mo=X!^piJ~7;|G`YgY>iY5A}1*gT)} zOK!1m!cv3$Evn?+yuY~;%m*zb9uDaxix|+c}kpoNfJQ|33>V~yhDke zZ3>?_`dd`V)2_wiN;ICizw4=KAt6uEOI9nfXlf%@x+JKQr}mXUDZv_~g@lYBT6bxY zFJ1HGbUsK>C1Z&X+bPj-=(|z7lDn1`5;DSRGDwN9GlioiwUCgJ(@W!&C>|{-L6wZu zHa)5Yb508h88g22nG!Q^t#Lytbth zO}_M_a1vC>=={ZwO6>5%SXYCzkdXI;FZ(Mo;kze%&hcAR$y-Lv`AUr2e~cq&At7%v z-G?i|`k;k`yi=V&eQN|&@+R+^l-G0khi`kXDGo`(LzGrYa4%FOo$H> zRLQ$&w|T{c+#j@%koVn&FC`JQkdSxk%?pzVT1brldsRX{BvrJKXwbAO{IFrmgtkiy zi9ypx{0{_GchnylUfOwUKB)R_P30B{T1ZTMp)$Pl;$k0CgS3$7F<|8XKu~qo+atpc znPMMOy7WQSUN={6fuM!NoU={jZc>sDT1f1&uZa|Gm7r>Bv&yjdjA9>BR&77}vLZ=Ik@dcKtllYG!ZLVCNc6I4lmoE%A|g@p9MTPLXMdqb6r z;`*nc+=H}`ko!ZUxIyse=FQIw_ou0I5>&PRYD@855>zePtrGEFpRU4GQT1DyS+VZo zyVJ^T?6o)_R88q$nGoMCCaCIWc0%y+-F-$s;>JF-kf<7OzGk@iF7rWxs%x^93GrRI zqexKI$b47x@!dxI)N^kWw2usx8EKNl-OuT@~WH|Ng

(ko7(vw2M$zj@I@qRR_ai0|Hh_$w|S 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�H;7tL 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%0AmoLwkE=(!HcT{+serv03wizUkuVc2hx_Rh5|pG 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

3vuv{p4;X+5eZanr+tudNkaU%E|>K^ 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�Z(WJCA6duzx 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

X!~& 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

Y1f$><7eedn5h_zym|*cxoh?tWQZSl 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 P{Nj|& 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

eUhUhbZ*@s&?Y3QQ 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

HA=H^m`9ZSG{U?`k?KN{`W#+_Q(^W6t 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ϭ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 Date: Fri, 19 Jan 2018 11:09:35 -0500 Subject: [PATCH 366/551] Removed desktop.ini files Removed desktop.ini files --- resources/definitions/desktop.ini | 5 ----- resources/extruders/desktop.ini | 5 ----- resources/meshes/desktop.ini | 5 ----- resources/quality/gmax15plus/desktop.ini | 5 ----- resources/variants/desktop.ini | 5 ----- 5 files changed, 25 deletions(-) delete mode 100644 resources/definitions/desktop.ini delete mode 100644 resources/extruders/desktop.ini delete mode 100644 resources/meshes/desktop.ini delete mode 100644 resources/quality/gmax15plus/desktop.ini delete mode 100644 resources/variants/desktop.ini diff --git a/resources/definitions/desktop.ini b/resources/definitions/desktop.ini deleted file mode 100644 index 309dea2301..0000000000 --- a/resources/definitions/desktop.ini +++ /dev/null @@ -1,5 +0,0 @@ -[.ShellClassInfo] -InfoTip=This folder is shared online. -IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe -IconIndex=16 - \ No newline at end of file diff --git a/resources/extruders/desktop.ini b/resources/extruders/desktop.ini deleted file mode 100644 index 309dea2301..0000000000 --- a/resources/extruders/desktop.ini +++ /dev/null @@ -1,5 +0,0 @@ -[.ShellClassInfo] -InfoTip=This folder is shared online. -IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe -IconIndex=16 - \ No newline at end of file diff --git a/resources/meshes/desktop.ini b/resources/meshes/desktop.ini deleted file mode 100644 index 309dea2301..0000000000 --- a/resources/meshes/desktop.ini +++ /dev/null @@ -1,5 +0,0 @@ -[.ShellClassInfo] -InfoTip=This folder is shared online. -IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe -IconIndex=16 - \ No newline at end of file diff --git a/resources/quality/gmax15plus/desktop.ini b/resources/quality/gmax15plus/desktop.ini deleted file mode 100644 index 309dea2301..0000000000 --- a/resources/quality/gmax15plus/desktop.ini +++ /dev/null @@ -1,5 +0,0 @@ -[.ShellClassInfo] -InfoTip=This folder is shared online. -IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe -IconIndex=16 - \ No newline at end of file diff --git a/resources/variants/desktop.ini b/resources/variants/desktop.ini deleted file mode 100644 index 309dea2301..0000000000 --- a/resources/variants/desktop.ini +++ /dev/null @@ -1,5 +0,0 @@ -[.ShellClassInfo] -InfoTip=This folder is shared online. -IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe -IconIndex=16 - \ No newline at end of file From 3f4e381620d9fcddf9c5eff18c4628d3e7e009e5 Mon Sep 17 00:00:00 2001 From: gordo3di Date: Fri, 19 Jan 2018 11:13:11 -0500 Subject: [PATCH 367/551] Removed desktop.ini file Removed desktop.ini file --- resources/quality/desktop.ini | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 resources/quality/desktop.ini diff --git a/resources/quality/desktop.ini b/resources/quality/desktop.ini deleted file mode 100644 index 309dea2301..0000000000 --- a/resources/quality/desktop.ini +++ /dev/null @@ -1,5 +0,0 @@ -[.ShellClassInfo] -InfoTip=This folder is shared online. -IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe -IconIndex=16 - \ No newline at end of file From 9397d9d4e09919486cb500fd27e24cfa58bff6d8 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Sun, 21 Jan 2018 16:04:52 +0100 Subject: [PATCH 368/551] Move translation guide to Wiki More consistency with other detailed documentation, keep README file clean. --- README.md | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/README.md b/README.md index 6ea839a300..366739e4be 100644 --- a/README.md +++ b/README.md @@ -41,25 +41,7 @@ Please check out [Wiki page](https://github.com/Ultimaker/Cura/wiki/Cura-Setting 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. +Please check out [Wiki page](https://github.com/Ultimaker/Cura/wiki/Translating-Cura) about how to translate Cura into other languages. License ---------------- From 03280505484ef1965458c8a52f36d4e52e0325eb Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sun, 21 Jan 2018 17:16:18 +0100 Subject: [PATCH 369/551] Change layer thickness colormap to parula-like (https://es.mathworks.com/help/matlab/ref/parula.html) --- plugins/SimulationView/SimulationView.qml | 12 ++++++------ plugins/SimulationView/layers3d.shader | 10 +++++++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index 11b985f77c..db92fac798 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -485,7 +485,7 @@ Item } } - // Gradient colors for layer thickness + // Gradient colors for layer thickness (similar to parula colormap) Rectangle { // In QML 5.9 can be changed by LinearGradient // Invert values because then the bar is rotated 90 degrees id: thicknessGradient @@ -499,23 +499,23 @@ Item gradient: Gradient { GradientStop { position: 0.000 - color: Qt.rgba(1, 0, 0, 1) + color: Qt.rgba(1, 1, 0, 1) } GradientStop { position: 0.25 - color: Qt.rgba(0.5, 0.5, 0, 1) + color: Qt.rgba(1, 0.75, 0.25, 1) } GradientStop { position: 0.5 - color: Qt.rgba(0, 1, 0, 1) + color: Qt.rgba(0, 0.75, 0.5, 1) } GradientStop { position: 0.75 - color: Qt.rgba(0, 0.5, 0.5, 1) + color: Qt.rgba(0, 0.375, 0.75, 1) } GradientStop { position: 1.0 - color: Qt.rgba(0, 0, 1, 1) + color: Qt.rgba(0, 0, 0.5, 1) } } } diff --git a/plugins/SimulationView/layers3d.shader b/plugins/SimulationView/layers3d.shader index 95dc604389..03e279e9eb 100644 --- a/plugins/SimulationView/layers3d.shader +++ b/plugins/SimulationView/layers3d.shader @@ -54,9 +54,13 @@ vertex41core = vec4 layerThicknessGradientColor(float abs_value, float min_value, float max_value) { float value = (abs_value - min_value)/(max_value - min_value); - float red = max(2*value-1, 0); - float green = 1-abs(1-2*value); - float blue = max(1-2*value, 0); + float red = min(max(4*value-2, 0), 1); + float green = min(1.5*value, 0.75); + if (value > 0.75) + { + green = value; + } + float blue = 0.75-abs(0.25-value); return vec4(red, green, blue, 1.0); } From fe6019988c0693230047125a39168188378045d0 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 22 Jan 2018 10:53:52 +0100 Subject: [PATCH 370/551] CURA-4839 Create variable before asignment --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 7c9d31c47a..3eca1326d0 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -704,6 +704,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # load extruder stack files has_extruder_stack_files = len(extruder_stack_files) > 0 + empty_quality_container = self._container_registry.findInstanceContainers(id = "empty_quality")[0] + empty_quality_changes_container = self._container_registry.findInstanceContainers(id = "empty_quality_changes")[0] try: for extruder_stack_file in extruder_stack_files: container_id = self._stripFileToId(extruder_stack_file) @@ -779,7 +781,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._container_registry.removeContainer(container.getId()) return - # Check quality profiles to make sure that if one stack has the "not supported" quality profile, # all others should have the same. # @@ -811,17 +812,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader): quality_has_been_changed = False if has_not_supported: - empty_quality_container = self._container_registry.findInstanceContainers(id = "empty_quality")[0] for stack in [global_stack] + extruder_stacks_in_use: stack.replaceContainer(_ContainerIndexes.Quality, empty_quality_container) - empty_quality_changes_container = self._container_registry.findInstanceContainers(id = "empty_quality_changes")[0] - for stack in [global_stack] + extruder_stacks_in_use: stack.replaceContainer(_ContainerIndexes.QualityChanges, empty_quality_changes_container) quality_has_been_changed = True else: - empty_quality_changes_container = self._container_registry.findInstanceContainers(id="empty_quality_changes")[0] - # The machine in the project has non-empty quality and there are usable qualities for this machine. # We need to check if the current quality_type is still usable for this machine, if not, then the quality # will be reset to the "preferred quality" if present, otherwise "normal". From ba29d64592253f093e99195a68e3c5c1ce1dd018 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 22 Jan 2018 11:07:38 +0100 Subject: [PATCH 371/551] CURA-4821 Fix one at a time slicing for builtiplexer --- cura/OneAtATimeIterator.py | 3 ++- plugins/CuraEngineBackend/StartSliceJob.py | 13 +++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/cura/OneAtATimeIterator.py b/cura/OneAtATimeIterator.py index 5653c8f1fb..84d65bae8e 100644 --- a/cura/OneAtATimeIterator.py +++ b/cura/OneAtATimeIterator.py @@ -18,12 +18,13 @@ class OneAtATimeIterator(Iterator.Iterator): def _fillStack(self): node_list = [] for node in self._scene_node.getChildren(): - if not isinstance(node, SceneNode): + if not issubclass(type(node), SceneNode): continue if node.callDecoration("getConvexHull"): node_list.append(node) + if len(node_list) < 2: self._node_stack = node_list[:] return diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index b0e19e7f39..9e3621c782 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -15,7 +15,7 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Settings.Validator import ValidatorState from UM.Settings.SettingRelation import RelationType -from cura.Scene.CuraSceneNode import CuraSceneNode as SceneNode +from cura.Scene.CuraSceneNode import CuraSceneNode from cura.OneAtATimeIterator import OneAtATimeIterator from cura.Settings.ExtruderManager import ExtruderManager @@ -131,7 +131,7 @@ class StartSliceJob(Job): # Don't slice if there is a per object setting with an error value. for node in DepthFirstIterator(self._scene.getRoot()): - if type(node) is not SceneNode or not node.isSelectable(): + if type(node) is not CuraSceneNode or not node.isSelectable(): continue if self._checkStackForErrors(node.callDecoration("getStack")): @@ -155,10 +155,15 @@ class StartSliceJob(Job): if getattr(node, "_outside_buildarea", False): continue + # Filter on current build plate + build_plate_number = node.callDecoration("getBuildPlateNumber") + if build_plate_number is not None and build_plate_number != self._build_plate_number: + continue + children = node.getAllChildren() children.append(node) for child_node in children: - if type(child_node) is SceneNode and child_node.getMeshData() and child_node.getMeshData().getVertices() is not None: + if type(child_node) is CuraSceneNode and child_node.getMeshData() and child_node.getMeshData().getVertices() is not None: temp_list.append(child_node) if temp_list: @@ -170,7 +175,7 @@ class StartSliceJob(Job): temp_list = [] has_printing_mesh = False for node in DepthFirstIterator(self._scene.getRoot()): - if node.callDecoration("isSliceable") and type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: + if node.callDecoration("isSliceable") and type(node) is CuraSceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: per_object_stack = node.callDecoration("getStack") is_non_printing_mesh = False if per_object_stack: From f589ce9570b3772217a3d655b32c13ace26532ca Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 22 Jan 2018 11:25:23 +0100 Subject: [PATCH 372/551] Copy first extruder values when they are available when upgrading - CURA-4835 --- cura/Settings/ExtruderStack.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index dd03ce7b3b..51b27fea57 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -55,15 +55,20 @@ class ExtruderStack(CuraContainerStack): # carried to the first extruder. # For material diameter, it was supposed to be applied to all extruders, so its value should be copied to all # extruders. - # - keys_to_copy = ["material_diameter"] # material diameter will be copied to all extruders - if self.getMetaDataEntry("position") == "0": - keys_to_copy.append("machine_nozzle_size") + + keys_to_copy = ["material_diameter", "machine_nozzle_size"] # these will be copied over to all extruders for key in keys_to_copy: + # Only copy the value when this extruder doesn't have the value. if self.definitionChanges.hasProperty(key, "value"): + # If the first extruder has a value for this setting, we must copy it to the other extruders via the global stack. + # Note: this assumes the extruders are loaded in the same order as they are positioned on the machine. + if self.getMetaDataEntry("position") == "0": + setting_value = self.definitionChanges.getProperty(key, "value") + stack.definitionChanges.setProperty(key, "value", setting_value) continue + setting_value = stack.definitionChanges.getProperty(key, "value") if setting_value is None: continue From ed939d31fa3ade51fe5c4ec1f247a1c78ee5a914 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 22 Jan 2018 12:20:08 +0100 Subject: [PATCH 373/551] Add hardware_type = nozzle for nozzle variants CURA-4461 --- resources/qml/Preferences/ProfilesPage.qml | 4 ++-- resources/variants/cartesio_0.25.inst.cfg | 1 + resources/variants/cartesio_0.4.inst.cfg | 1 + resources/variants/cartesio_0.8.inst.cfg | 1 + resources/variants/fabtotum_hyb35.inst.cfg | 1 + resources/variants/fabtotum_lite04.inst.cfg | 1 + resources/variants/fabtotum_lite06.inst.cfg | 1 + resources/variants/fabtotum_pro02.inst.cfg | 1 + resources/variants/fabtotum_pro04.inst.cfg | 1 + resources/variants/fabtotum_pro06.inst.cfg | 1 + resources/variants/fabtotum_pro08.inst.cfg | 1 + resources/variants/imade3d_jellybox_0.4.inst.cfg | 1 + resources/variants/imade3d_jellybox_0.4_2-fans.inst.cfg | 1 + resources/variants/ultimaker2_0.25.inst.cfg | 1 + resources/variants/ultimaker2_0.4.inst.cfg | 1 + resources/variants/ultimaker2_0.6.inst.cfg | 1 + resources/variants/ultimaker2_0.8.inst.cfg | 1 + resources/variants/ultimaker2_extended_0.25.inst.cfg | 1 + resources/variants/ultimaker2_extended_0.4.inst.cfg | 1 + resources/variants/ultimaker2_extended_0.6.inst.cfg | 1 + resources/variants/ultimaker2_extended_0.8.inst.cfg | 1 + resources/variants/ultimaker2_extended_plus_0.25.inst.cfg | 1 + resources/variants/ultimaker2_extended_plus_0.4.inst.cfg | 1 + resources/variants/ultimaker2_extended_plus_0.6.inst.cfg | 1 + resources/variants/ultimaker2_extended_plus_0.8.inst.cfg | 1 + resources/variants/ultimaker2_plus_0.25.inst.cfg | 1 + resources/variants/ultimaker2_plus_0.4.inst.cfg | 1 + resources/variants/ultimaker2_plus_0.6.inst.cfg | 1 + resources/variants/ultimaker2_plus_0.8.inst.cfg | 1 + resources/variants/ultimaker3_aa0.25.inst.cfg | 1 + 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.25.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 + 39 files changed, 40 insertions(+), 2 deletions(-) diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index 5e040cdba2..e3ba9b23a4 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -213,8 +213,8 @@ UM.ManagementPage ProfileTab { title: catalog.i18nc("@title:tab", "Global Settings"); - quality: Cura.MachineManager.activeMachine.qualityChanges.id - material: Cura.MachineManager.activeMachine.material.id + quality: base.currentItem != null ? base.currentItem.id : ""; + material: Cura.MachineManager.allActiveMaterialIds[Cura.MachineManager.activeMachineId] } Repeater diff --git a/resources/variants/cartesio_0.25.inst.cfg b/resources/variants/cartesio_0.25.inst.cfg index 0e082e5afa..0cc01093f2 100644 --- a/resources/variants/cartesio_0.25.inst.cfg +++ b/resources/variants/cartesio_0.25.inst.cfg @@ -7,6 +7,7 @@ definition = cartesio author = Cartesio type = variant setting_version = 4 +hardware_type = nozzle [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 27d07c0328..9920e699f5 100644 --- a/resources/variants/cartesio_0.4.inst.cfg +++ b/resources/variants/cartesio_0.4.inst.cfg @@ -7,6 +7,7 @@ definition = cartesio author = Cartesio type = variant setting_version = 4 +hardware_type = nozzle [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 e96c78d922..8031a9fa31 100644 --- a/resources/variants/cartesio_0.8.inst.cfg +++ b/resources/variants/cartesio_0.8.inst.cfg @@ -7,6 +7,7 @@ definition = cartesio author = Cartesio type = variant setting_version = 4 +hardware_type = nozzle [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/fabtotum_hyb35.inst.cfg b/resources/variants/fabtotum_hyb35.inst.cfg index 01e94728da..e8fa13cc0d 100644 --- a/resources/variants/fabtotum_hyb35.inst.cfg +++ b/resources/variants/fabtotum_hyb35.inst.cfg @@ -7,6 +7,7 @@ definition = fabtotum author = FABtotum type = variant setting_version = 4 +hardware_type = nozzle [values] machine_nozzle_size = 0.35 diff --git a/resources/variants/fabtotum_lite04.inst.cfg b/resources/variants/fabtotum_lite04.inst.cfg index ee270a9ead..7264abbdda 100644 --- a/resources/variants/fabtotum_lite04.inst.cfg +++ b/resources/variants/fabtotum_lite04.inst.cfg @@ -7,6 +7,7 @@ definition = fabtotum author = FABtotum type = variant setting_version = 4 +hardware_type = nozzle [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/fabtotum_lite06.inst.cfg b/resources/variants/fabtotum_lite06.inst.cfg index 49722a50d1..0ad33ca332 100644 --- a/resources/variants/fabtotum_lite06.inst.cfg +++ b/resources/variants/fabtotum_lite06.inst.cfg @@ -7,6 +7,7 @@ definition = fabtotum author = FABtotum type = variant setting_version = 4 +hardware_type = nozzle [values] machine_nozzle_size = 0.6 diff --git a/resources/variants/fabtotum_pro02.inst.cfg b/resources/variants/fabtotum_pro02.inst.cfg index 376588fe71..d83618b712 100644 --- a/resources/variants/fabtotum_pro02.inst.cfg +++ b/resources/variants/fabtotum_pro02.inst.cfg @@ -7,6 +7,7 @@ definition = fabtotum author = FABtotum type = variant setting_version = 4 +hardware_type = nozzle [values] machine_nozzle_size = 0.2 diff --git a/resources/variants/fabtotum_pro04.inst.cfg b/resources/variants/fabtotum_pro04.inst.cfg index 54294c572c..4f2a622887 100644 --- a/resources/variants/fabtotum_pro04.inst.cfg +++ b/resources/variants/fabtotum_pro04.inst.cfg @@ -7,6 +7,7 @@ definition = fabtotum author = FABtotum type = variant setting_version = 4 +hardware_type = nozzle [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/fabtotum_pro06.inst.cfg b/resources/variants/fabtotum_pro06.inst.cfg index f1055b6ade..aa44e762ba 100644 --- a/resources/variants/fabtotum_pro06.inst.cfg +++ b/resources/variants/fabtotum_pro06.inst.cfg @@ -7,6 +7,7 @@ definition = fabtotum author = FABtotum type = variant setting_version = 4 +hardware_type = nozzle [values] machine_nozzle_size = 0.6 diff --git a/resources/variants/fabtotum_pro08.inst.cfg b/resources/variants/fabtotum_pro08.inst.cfg index ef7eb172be..597d23275e 100644 --- a/resources/variants/fabtotum_pro08.inst.cfg +++ b/resources/variants/fabtotum_pro08.inst.cfg @@ -7,6 +7,7 @@ definition = fabtotum author = FABtotum type = variant setting_version = 4 +hardware_type = nozzle [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 ce9e82e59a..c37a2ecabf 100644 --- a/resources/variants/imade3d_jellybox_0.4.inst.cfg +++ b/resources/variants/imade3d_jellybox_0.4.inst.cfg @@ -7,6 +7,7 @@ definition = imade3d_jellybox author = IMADE3D type = variant setting_version = 4 +hardware_type = nozzle [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 60f9793b2a..c3e63aab34 100644 --- a/resources/variants/imade3d_jellybox_0.4_2-fans.inst.cfg +++ b/resources/variants/imade3d_jellybox_0.4_2-fans.inst.cfg @@ -7,6 +7,7 @@ definition = imade3d_jellybox author = IMADE3D type = variant setting_version = 4 +hardware_type = nozzle [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 04084867dd..aee83e2483 100644 --- a/resources/variants/ultimaker2_0.25.inst.cfg +++ b/resources/variants/ultimaker2_0.25.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2 author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 f21d85e258..fe128137d9 100644 --- a/resources/variants/ultimaker2_0.4.inst.cfg +++ b/resources/variants/ultimaker2_0.4.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2 author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 04128cc297..7fea2fbb22 100644 --- a/resources/variants/ultimaker2_0.6.inst.cfg +++ b/resources/variants/ultimaker2_0.6.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2 author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 400069d60b..5f1176b7ec 100644 --- a/resources/variants/ultimaker2_0.8.inst.cfg +++ b/resources/variants/ultimaker2_0.8.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2 author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 bdff9a5795..e705327cf8 100644 --- a/resources/variants/ultimaker2_extended_0.25.inst.cfg +++ b/resources/variants/ultimaker2_extended_0.25.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2_extended author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 2af9a75024..d486ed4f4e 100644 --- a/resources/variants/ultimaker2_extended_0.4.inst.cfg +++ b/resources/variants/ultimaker2_extended_0.4.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2_extended author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 e0753f1c28..f9dd4d4e69 100644 --- a/resources/variants/ultimaker2_extended_0.6.inst.cfg +++ b/resources/variants/ultimaker2_extended_0.6.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2_extended author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 43c033b799..ee56b6d194 100644 --- a/resources/variants/ultimaker2_extended_0.8.inst.cfg +++ b/resources/variants/ultimaker2_extended_0.8.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2_extended author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 7f1bff4b0c..f23406fec3 100644 --- a/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2_extended_plus author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 f6747d059d..c0b1c6ab79 100644 --- a/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2_extended_plus author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 706e4b8aa6..6ef64bed5f 100644 --- a/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2_extended_plus author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 287c3155b8..2f890d0827 100644 --- a/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2_extended_plus author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 1d4617c86b..1c4688568d 100644 --- a/resources/variants/ultimaker2_plus_0.25.inst.cfg +++ b/resources/variants/ultimaker2_plus_0.25.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2_plus author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [values] coasting_min_volume = 0.17 diff --git a/resources/variants/ultimaker2_plus_0.4.inst.cfg b/resources/variants/ultimaker2_plus_0.4.inst.cfg index 75a665ad95..00a4ef47dd 100644 --- a/resources/variants/ultimaker2_plus_0.4.inst.cfg +++ b/resources/variants/ultimaker2_plus_0.4.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2_plus author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 60bbbaa049..4dceab70d0 100644 --- a/resources/variants/ultimaker2_plus_0.6.inst.cfg +++ b/resources/variants/ultimaker2_plus_0.6.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2_plus author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 339b320af3..e1bbddb823 100644 --- a/resources/variants/ultimaker2_plus_0.8.inst.cfg +++ b/resources/variants/ultimaker2_plus_0.8.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker2_plus author = Ultimaker type = variant setting_version = 4 +hardware_type = nozzle [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/ultimaker3_aa0.25.inst.cfg b/resources/variants/ultimaker3_aa0.25.inst.cfg index e6f852c02c..2d2d893202 100644 --- a/resources/variants/ultimaker3_aa0.25.inst.cfg +++ b/resources/variants/ultimaker3_aa0.25.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker3 author = ultimaker type = variant setting_version = 4 +hardware_type = nozzle [values] brim_width = 7 diff --git a/resources/variants/ultimaker3_aa0.8.inst.cfg b/resources/variants/ultimaker3_aa0.8.inst.cfg index de7dfcc364..402190c357 100644 --- a/resources/variants/ultimaker3_aa0.8.inst.cfg +++ b/resources/variants/ultimaker3_aa0.8.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker3 author = ultimaker type = variant setting_version = 4 +hardware_type = nozzle [values] acceleration_enabled = True diff --git a/resources/variants/ultimaker3_aa04.inst.cfg b/resources/variants/ultimaker3_aa04.inst.cfg index 289ae185b0..0163024fa4 100644 --- a/resources/variants/ultimaker3_aa04.inst.cfg +++ b/resources/variants/ultimaker3_aa04.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker3 author = ultimaker type = variant setting_version = 4 +hardware_type = nozzle [values] brim_width = 7 diff --git a/resources/variants/ultimaker3_bb0.8.inst.cfg b/resources/variants/ultimaker3_bb0.8.inst.cfg index 2cb3103dcf..017da649a0 100644 --- a/resources/variants/ultimaker3_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_bb0.8.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker3 author = ultimaker type = variant setting_version = 4 +hardware_type = nozzle [values] acceleration_enabled = True diff --git a/resources/variants/ultimaker3_bb04.inst.cfg b/resources/variants/ultimaker3_bb04.inst.cfg index 5dc0b2832a..93b2025031 100644 --- a/resources/variants/ultimaker3_bb04.inst.cfg +++ b/resources/variants/ultimaker3_bb04.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker3 author = ultimaker type = variant setting_version = 4 +hardware_type = nozzle [values] acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) diff --git a/resources/variants/ultimaker3_extended_aa0.25.inst.cfg b/resources/variants/ultimaker3_extended_aa0.25.inst.cfg index 631768346e..04d7a7990a 100644 --- a/resources/variants/ultimaker3_extended_aa0.25.inst.cfg +++ b/resources/variants/ultimaker3_extended_aa0.25.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker3_extended author = ultimaker type = variant setting_version = 4 +hardware_type = nozzle [values] brim_width = 7 diff --git a/resources/variants/ultimaker3_extended_aa0.8.inst.cfg b/resources/variants/ultimaker3_extended_aa0.8.inst.cfg index b2ad86ff01..3e1b3ed3de 100644 --- a/resources/variants/ultimaker3_extended_aa0.8.inst.cfg +++ b/resources/variants/ultimaker3_extended_aa0.8.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker3_extended author = ultimaker type = variant setting_version = 4 +hardware_type = nozzle [values] acceleration_enabled = True diff --git a/resources/variants/ultimaker3_extended_aa04.inst.cfg b/resources/variants/ultimaker3_extended_aa04.inst.cfg index fdea4de08c..94bee65b5d 100644 --- a/resources/variants/ultimaker3_extended_aa04.inst.cfg +++ b/resources/variants/ultimaker3_extended_aa04.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker3_extended author = ultimaker type = variant setting_version = 4 +hardware_type = nozzle [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 6ab16c4f10..e1086535ec 100644 --- a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker3_extended author = ultimaker type = variant setting_version = 4 +hardware_type = nozzle [values] acceleration_enabled = True diff --git a/resources/variants/ultimaker3_extended_bb04.inst.cfg b/resources/variants/ultimaker3_extended_bb04.inst.cfg index ee2f138754..a995acf77c 100644 --- a/resources/variants/ultimaker3_extended_bb04.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb04.inst.cfg @@ -7,6 +7,7 @@ definition = ultimaker3_extended author = ultimaker type = variant setting_version = 4 +hardware_type = nozzle [values] acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) From 71cea55bdaecfadf0507b5f40300bcb3eafaa958 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 22 Jan 2018 12:48:29 +0100 Subject: [PATCH 374/551] Move untested settings to experimental category These settings are just some of the settings that were not tested by our materials and processing team. --- resources/definitions/fdmprinter.def.json | 425 +++++++++++----------- 1 file changed, 213 insertions(+), 212 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index e016fcfb5f..37b8b878af 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -653,20 +653,6 @@ "settable_per_mesh": false, "settable_per_extruder": false }, - "slicing_tolerance": - { - "label": "Slicing Tolerance", - "description": "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process.", - "type": "enum", - "options": - { - "middle": "Middle", - "exclusive": "Exclusive", - "inclusive": "Inclusive" - }, - "default_value": "middle", - "settable_per_mesh": true - }, "line_width": { "label": "Line Width", @@ -726,21 +712,6 @@ } } }, - "roofing_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", - "minimum_value_warning": "0.1 + 0.4 * machine_nozzle_size", - "maximum_value_warning": "2 * machine_nozzle_size", - "default_value": 0.4, - "type": "float", - "value": "skin_line_width", - "limit_to_extruder": "roofing_extruder_nr", - "settable_per_mesh": true, - "enabled": "roofing_layer_count > 0 and top_layers > 0" - }, "skin_line_width": { "label": "Top/Bottom Line Width", @@ -999,34 +970,6 @@ "settable_per_mesh": true, "enabled": "top_layers > 0" }, - "roofing_pattern": - { - "label": "Top Surface Skin Pattern", - "description": "The pattern of the top most layers.", - "type": "enum", - "options": - { - "lines": "Lines", - "concentric": "Concentric", - "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" - }, - "roofing_angles": - { - "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", - "enabled": "roofing_pattern != 'concentric' and roofing_layer_count > 0 and top_layers > 0", - "limit_to_extruder": "roofing_extruder_nr", - "settable_per_mesh": true - }, "top_bottom_extruder_nr": { "label": "Top/Bottom Extruder", @@ -1861,14 +1804,6 @@ "settable_per_mesh": true } } - }, - "infill_enable_travel_optimization": - { - "label": "Enable Travel Optimization", - "description": "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased.", - "type": "bool", - "default_value": false, - "settable_per_mesh": true } } }, @@ -1880,16 +1815,6 @@ "type": "category", "children": { - "material_flow_dependent_temperature": - { - "label": "Auto Temperature", - "description": "Change the temperature for each layer automatically with the average flow speed of that layer.", - "type": "bool", - "default_value": false, - "enabled": "machine_nozzle_temp_enabled and False", - "settable_per_mesh": false, - "settable_per_extruder": true - }, "default_material_print_temperature": { "label": "Default Printing Temperature", @@ -1964,17 +1889,6 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "material_flow_temp_graph": - { - "label": "Flow Temperature Graph", - "description": "Data linking material flow (in mm3 per second) to temperature (degrees Celsius).", - "unit": "[[mm³,°C]]", - "type": "str", - "default_value": "[[3.5,200],[7.0,240]]", - "enabled": "False and machine_nozzle_temp_enabled and material_flow_dependent_temperature", - "settable_per_mesh": false, - "settable_per_extruder": true - }, "material_extrusion_cool_down_speed": { "label": "Extrusion Cool Down Speed Modifier", @@ -2083,7 +1997,8 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "retract_at_layer_change":{ + "retract_at_layer_change": + { "label": "Retract at Layer Change", "description": "Retract the filament when the nozzle is moving to the next layer.", "type": "bool", @@ -3491,15 +3406,6 @@ "settable_per_mesh": true, "settable_per_extruder": false }, - "support_tree_enable": - { - "label": "Tree Support", - "description": "Generate a tree-like support with branches that support your print. This may reduce material usage and print time.", - "type": "bool", - "default_value": false, - "settable_per_mesh": true, - "settable_per_extruder": false - }, "support_extruder_nr": { "label": "Support Extruder", @@ -3818,110 +3724,6 @@ "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false }, - "support_tree_angle": - { - "label": "Tree Support Branch Angle", - "description": "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach.", - "unit": "°", - "type": "float", - "minimum_value": "0", - "maximum_value": "90", - "maximum_value_warning": "60", - "default_value": 40, - "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_tree_enable", - "settable_per_mesh": false, - "settable_per_extruder": true - }, - "support_tree_branch_distance": - { - "label": "Tree Support Branch Distance", - "description": "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove.", - "unit": "mm", - "type": "float", - "minimum_value": "0.001", - "default_value": 4, - "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_tree_enable", - "settable_per_mesh": true - }, - "support_tree_branch_diameter": - { - "label": "Tree Support Branch Diameter", - "description": "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this.", - "unit": "mm", - "type": "float", - "minimum_value": "0.001", - "minimum_value_warning": "support_line_width * 2", - "default_value": 2, - "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_tree_enable", - "settable_per_mesh": false, - "settable_per_extruder": true - }, - "support_tree_branch_diameter_angle": - { - "label": "Tree Support Branch Diameter Angle", - "description": "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support.", - "unit": "°", - "type": "float", - "minimum_value": "0", - "maximum_value": "89.9999", - "maximum_value_warning": "15", - "default_value": 5, - "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_tree_enable", - "settable_per_mesh": false, - "settable_per_extruder": true - }, - "support_tree_collision_resolution": - { - "label": "Tree Support Collision Resolution", - "description": "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically.", - "unit": "mm", - "type": "float", - "minimum_value": "0.001", - "minimum_value_warning": "support_line_width / 4", - "maximum_value_warning": "support_line_width * 2", - "default_value": 0.4, - "value": "support_line_width / 2", - "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_tree_enable and support_tree_branch_diameter_angle > 0", - "settable_per_mesh": false, - "settable_per_extruder": true - }, - "support_tree_wall_thickness": - { - "label": "Tree Support Wall Thickness", - "description": "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily.", - "unit": "mm", - "type": "float", - "minimum_value": "0", - "minimum_value_warning": "wall_line_width", - "default_value": 0.8, - "value": "support_line_width", - "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_tree_enable", - "settable_per_mesh": false, - "settable_per_extruder": true, - "children": - { - "support_tree_wall_count": - { - "label": "Tree Support Wall Line Count", - "description": "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily.", - "type": "int", - "minimum_value": "0", - "minimum_value_warning": "1", - "default_value": 1, - "value": "round(support_tree_wall_thickness / support_line_width)", - "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_tree_enable", - "settable_per_mesh": false, - "settable_per_extruder": true - } - } - }, "gradual_support_infill_steps": { "label": "Gradual Support Infill Steps", @@ -5106,18 +4908,6 @@ "default_value": false, "settable_per_mesh": true }, - "meshfix_maximum_resolution": - { - "label": "Maximum Resolution", - "description": "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway.", - "type": "float", - "unit": "mm", - "default_value": 0.01, - "minimum_value": "0.001", - "minimum_value_warning": "0.005", - "maximum_value_warning": "0.1", - "settable_per_mesh": true - }, "multiple_mesh_overlap": { "label": "Merged Meshes Overlap", @@ -5346,6 +5136,217 @@ "description": "experimental!", "children": { + "support_tree_enable": + { + "label": "Tree Support", + "description": "Generate a tree-like support with branches that support your print. This may reduce material usage and print time.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true, + "settable_per_extruder": false + }, + "support_tree_angle": + { + "label": "Tree Support Branch Angle", + "description": "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach.", + "unit": "°", + "type": "float", + "minimum_value": "0", + "maximum_value": "90", + "maximum_value_warning": "60", + "default_value": 40, + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_tree_branch_distance": + { + "label": "Tree Support Branch Distance", + "description": "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove.", + "unit": "mm", + "type": "float", + "minimum_value": "0.001", + "default_value": 4, + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable", + "settable_per_mesh": true + }, + "support_tree_branch_diameter": + { + "label": "Tree Support Branch Diameter", + "description": "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this.", + "unit": "mm", + "type": "float", + "minimum_value": "0.001", + "minimum_value_warning": "support_line_width * 2", + "default_value": 2, + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_tree_branch_diameter_angle": + { + "label": "Tree Support Branch Diameter Angle", + "description": "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support.", + "unit": "°", + "type": "float", + "minimum_value": "0", + "maximum_value": "89.9999", + "maximum_value_warning": "15", + "default_value": 5, + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_tree_collision_resolution": + { + "label": "Tree Support Collision Resolution", + "description": "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically.", + "unit": "mm", + "type": "float", + "minimum_value": "0.001", + "minimum_value_warning": "support_line_width / 4", + "maximum_value_warning": "support_line_width * 2", + "default_value": 0.4, + "value": "support_line_width / 2", + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable and support_tree_branch_diameter_angle > 0", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_tree_wall_thickness": + { + "label": "Tree Support Wall Thickness", + "description": "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "minimum_value_warning": "wall_line_width", + "default_value": 0.8, + "value": "support_line_width", + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable", + "settable_per_mesh": false, + "settable_per_extruder": true, + "children": + { + "support_tree_wall_count": + { + "label": "Tree Support Wall Line Count", + "description": "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily.", + "type": "int", + "minimum_value": "0", + "minimum_value_warning": "1", + "default_value": 1, + "value": "round(support_tree_wall_thickness / support_line_width)", + "limit_to_extruder": "support_infill_extruder_nr", + "enabled": "support_tree_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + }, + "slicing_tolerance": + { + "label": "Slicing Tolerance", + "description": "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process.", + "type": "enum", + "options": + { + "middle": "Middle", + "exclusive": "Exclusive", + "inclusive": "Inclusive" + }, + "default_value": "middle", + "settable_per_mesh": true + }, + "roofing_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", + "minimum_value_warning": "0.1 + 0.4 * machine_nozzle_size", + "maximum_value_warning": "2 * machine_nozzle_size", + "default_value": 0.4, + "type": "float", + "value": "skin_line_width", + "limit_to_extruder": "roofing_extruder_nr", + "settable_per_mesh": true, + "enabled": "roofing_layer_count > 0 and top_layers > 0" + }, + "roofing_pattern": + { + "label": "Top Surface Skin Pattern", + "description": "The pattern of the top most layers.", + "type": "enum", + "options": + { + "lines": "Lines", + "concentric": "Concentric", + "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" + }, + "roofing_angles": + { + "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", + "enabled": "roofing_pattern != 'concentric' and roofing_layer_count > 0 and top_layers > 0", + "limit_to_extruder": "roofing_extruder_nr", + "settable_per_mesh": true + }, + "infill_enable_travel_optimization": + { + "label": "Enable Travel Optimization", + "description": "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true + }, + "material_flow_dependent_temperature": + { + "label": "Auto Temperature", + "description": "Change the temperature for each layer automatically with the average flow speed of that layer.", + "type": "bool", + "default_value": false, + "enabled": "machine_nozzle_temp_enabled and False", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_flow_temp_graph": + { + "label": "Flow Temperature Graph", + "description": "Data linking material flow (in mm3 per second) to temperature (degrees Celsius).", + "unit": "[[mm³,°C]]", + "type": "str", + "default_value": "[[3.5,200],[7.0,240]]", + "enabled": "False and machine_nozzle_temp_enabled and material_flow_dependent_temperature", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "meshfix_maximum_resolution": + { + "label": "Maximum Resolution", + "description": "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway.", + "type": "float", + "unit": "mm", + "default_value": 0.01, + "minimum_value": "0.001", + "minimum_value_warning": "0.005", + "maximum_value_warning": "0.1", + "settable_per_mesh": true + }, "support_skip_some_zags": { "label": "Break Up Support In Chunks", From 3f81347ef8584dec1ee25d983a0d10c5e438b715 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 22 Jan 2018 12:51:26 +0100 Subject: [PATCH 375/551] Add warning that tree support increases slicing time It's much slower than the normal support generation. --- 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 37b8b878af..0451bd2539 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5139,7 +5139,7 @@ "support_tree_enable": { "label": "Tree Support", - "description": "Generate a tree-like support with branches that support your print. This may reduce material usage and print time.", + "description": "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time.", "type": "bool", "default_value": false, "settable_per_mesh": true, From 8d8fa0269a130a2d291d1ac0055815ab28a5c773 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 22 Jan 2018 12:57:50 +0100 Subject: [PATCH 376/551] CURA-4821 loading gcode will now delete all existing models from all build plates and delete existing layer data to be processed --- cura/CuraApplication.py | 9 ++++++--- plugins/CuraEngineBackend/CuraEngineBackend.py | 7 +++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 342f6cb91d..7b6e970a68 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1040,8 +1040,9 @@ class CuraApplication(QtApplication): Selection.add(node) ## Delete all nodes containing mesh data in the scene. + # \param only_selectable. Set this to False to delete objects from all build plates @pyqtSlot() - def deleteAll(self): + def deleteAll(self, only_selectable = True): Logger.log("i", "Clearing scene") if not self.getController().getToolsEnabled(): return @@ -1052,7 +1053,9 @@ class CuraApplication(QtApplication): continue if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. - if not node.isSelectable(): + if only_selectable and not node.isSelectable(): + continue + if not node.callDecoration("isSliceable"): continue # Only remove nodes that are selectable. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) @@ -1431,7 +1434,7 @@ class CuraApplication(QtApplication): self._currently_loading_files.append(f) if extension in self._non_sliceable_extensions: - self.deleteAll() + self.deleteAll(only_selectable = False) job = ReadMeshJob(f) job.finished.connect(self._readMeshFinished) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 47f7a07b94..ea7440843e 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -426,11 +426,10 @@ class CuraEngineBackend(QObject, Backend): if not isinstance(source, SceneNode): return - # This case checks if the source node is a node that contains a GCode. In this case the - # cached layer data is removed so the previous data is not rendered - CURA-4821 + # This case checks if the source node is a node that contains GCode. In this case the + # current layer data is removed so the previous data is not rendered - CURA-4821 if source.callDecoration("isBlockSlicing") and source.callDecoration("getLayerData"): - if self._stored_optimized_layer_data: - del self._stored_optimized_layer_data[source.callDecoration("getBuildPlateNumber")] + self._stored_optimized_layer_data = {} build_plate_changed = set() source_build_plate_number = source.callDecoration("getBuildPlateNumber") From 628314af9e9667561ec46c6d2f9be657bd2f2198 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 22 Jan 2018 13:00:22 +0100 Subject: [PATCH 377/551] Basic style ready for PR - Temporarily removed remove/disable button as it's non-functional for now --- plugins/PluginBrowser/PluginBrowser.py | 10 ++-- plugins/PluginBrowser/PluginBrowser.qml | 61 ++++++++++++------------- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 35b88b3465..c766a35dbe 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -229,9 +229,11 @@ class PluginBrowser(QObject, Extension): 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") - self._plugins_model.addRoleName(Qt.UserRole + 6, "file_location") - self._plugins_model.addRoleName(Qt.UserRole + 7, "can_upgrade") + self._plugins_model.addRoleName(Qt.UserRole + 5, "author_email") + self._plugins_model.addRoleName(Qt.UserRole + 6, "already_installed") + self._plugins_model.addRoleName(Qt.UserRole + 7, "file_location") + self._plugins_model.addRoleName(Qt.UserRole + 8, "enabled") + self._plugins_model.addRoleName(Qt.UserRole + 9, "can_upgrade") else: self._plugins_model.clear() items = [] @@ -241,8 +243,10 @@ class PluginBrowser(QObject, Extension): "version": metadata["version"], "short_description": metadata["short_description"], "author": metadata["author"], + "author_email": "author@gmail.com", "already_installed": self._checkAlreadyInstalled(metadata["id"]), "file_location": metadata["file_location"], + "enabled": True, "can_upgrade": self._checkCanUpgrade(metadata["id"], metadata["version"]) }) self._plugins_model.setItems(items) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 7c58f96b03..5c148b07d1 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -2,35 +2,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 +import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4 +// TODO: Switch to QtQuick.Controls 2.x and remove QtQuick.Controls.Styles + UM.Dialog { id: base title: catalog.i18nc("@title:tab", "Plugins"); width: 800 * screenScaleFactor - height: 450 * screenScaleFactor + height: 600 * screenScaleFactor minimumWidth: 350 * screenScaleFactor minimumHeight: 350 * screenScaleFactor - Item - { + + Item { anchors.fill: parent - Item - { + + Item { id: topBar height: childrenRect.height; width: parent.width - Label - { + + Label { id: introText text: catalog.i18nc("@label", "Here you can find a list of Third Party plugins.") width: parent.width height: 30 } - Button - { + Button { id: refresh text: catalog.i18nc("@action:button", "Refresh") onClicked: manager.requestPluginList() @@ -38,40 +39,37 @@ UM.Dialog { enabled: !manager.isDownloading } } - ScrollView - { + + // Scroll view breaks in QtQuick.Controls 2.x + ScrollView { width: parent.width anchors.top: topBar.bottom anchors.bottom: bottomBar.top anchors.bottomMargin: UM.Theme.getSize("default_margin").height frameVisible: true + ListView { id: pluginList model: manager.pluginsModel anchors.fill: parent - property var activePlugin delegate: pluginDelegate } } - Item - { + + Item { id: bottomBar width: parent.width height: closeButton.height anchors.bottom: parent.bottom anchors.left: parent.left - - Button - { + Button { id: closeButton text: catalog.i18nc("@action:button", "Close") iconName: "dialog-close" - onClicked: - { - if (manager.isDownloading) - { + onClicked: { + if ( manager.isDownloading ) { manager.cancelDownload() } base.close(); @@ -87,7 +85,7 @@ UM.Dialog { Rectangle { width: pluginList.width; - height: 96 + height: 102 color: index % 2 ? UM.Theme.getColor("secondary") : "white" // Plugin info @@ -108,10 +106,10 @@ UM.Dialog { wrapMode: Text.WordWrap verticalAlignment: Text.AlignVCenter font { - pixelSize: 15 + pixelSize: 13 bold: true } - color: model.enabled ? UM.Theme.getColor("text") : "grey" + color: model.enabled ? UM.Theme.getColor("text") : UM.Theme.getColor("secondary") } Label { @@ -145,7 +143,7 @@ UM.Dialog { } Label { - text: "author@ultimaker.com" + text: model.author_email width: parent.width height: 72 wrapMode: Text.WordWrap @@ -156,7 +154,7 @@ UM.Dialog { // Plugin actions Row { id: pluginActions - width: 180 + UM.Theme.getSize("default_margin").width + width: 72 + UM.Theme.getSize("default_margin").width height: parent.height anchors { top: parent.top @@ -167,6 +165,7 @@ UM.Dialog { layoutDirection: Qt.RightToLeft spacing: UM.Theme.getSize("default_margin").width + /* Rectangle { id: removeControls visible: model.already_installed @@ -279,13 +278,11 @@ UM.Dialog { } } } - - - + */ Button { id: updateButton - // visible: model.already_installed && model.can_upgrade - visible: model.already_installed + visible: model.already_installed && model.can_upgrade + // visible: model.already_installed text: { // If currently downloading: if ( manager.isDownloading && pluginList.activePlugin == model ) { From 5c8a47275ec37081e512d832c2655dff09482ca1 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 22 Jan 2018 13:08:30 +0100 Subject: [PATCH 378/551] CURA-4845 Revert changes when accessing the quality changes at the time of creating the global ProfileTab in the preferences. --- resources/qml/Preferences/ProfilesPage.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index 5e040cdba2..e3ba9b23a4 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -213,8 +213,8 @@ UM.ManagementPage ProfileTab { title: catalog.i18nc("@title:tab", "Global Settings"); - quality: Cura.MachineManager.activeMachine.qualityChanges.id - material: Cura.MachineManager.activeMachine.material.id + quality: base.currentItem != null ? base.currentItem.id : ""; + material: Cura.MachineManager.allActiveMaterialIds[Cura.MachineManager.activeMachineId] } Repeater From 20da35ec5cd3fde90a2fcd569f05267db91ee97e Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 22 Jan 2018 13:12:22 +0100 Subject: [PATCH 379/551] Check when the containers are empty instead of None. Contributes to CURA-4845 --- 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 3eca1326d0..638971d109 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -928,9 +928,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # sanity checks # NOTE: The following cases SHOULD NOT happen!!!! - if not old_container: + if old_container.getId() in ("empty_quality_changes", "empty_definition_changes", "empty"): Logger.log("e", "We try to get [%s] from the global stack [%s] but we got None instead!", changes_container_type, global_stack.getId()) + continue # Replace the quality/definition changes container if it's in the GlobalStack # NOTE: we can get an empty container here, but the IDs will not match, @@ -954,9 +955,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # sanity checks # NOTE: The following cases SHOULD NOT happen!!!! - if not changes_container: + if changes_container.getId() in ("empty_quality_changes", "empty_definition_changes", "empty"): Logger.log("e", "We try to get [%s] from the extruder stack [%s] but we got None instead!", changes_container_type, each_extruder_stack.getId()) + continue # NOTE: we can get an empty container here, but the IDs will not match, # so this comparison is fine. From e2bc14cc589c96161d75d3a851e1502a9d81a905 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sun, 21 Jan 2018 17:16:18 +0100 Subject: [PATCH 380/551] Change layer thickness colormap to parula-like (https://es.mathworks.com/help/matlab/ref/parula.html) --- plugins/SimulationView/SimulationView.qml | 12 ++++++------ plugins/SimulationView/layers3d.shader | 10 +++++++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index 11b985f77c..db92fac798 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -485,7 +485,7 @@ Item } } - // Gradient colors for layer thickness + // Gradient colors for layer thickness (similar to parula colormap) Rectangle { // In QML 5.9 can be changed by LinearGradient // Invert values because then the bar is rotated 90 degrees id: thicknessGradient @@ -499,23 +499,23 @@ Item gradient: Gradient { GradientStop { position: 0.000 - color: Qt.rgba(1, 0, 0, 1) + color: Qt.rgba(1, 1, 0, 1) } GradientStop { position: 0.25 - color: Qt.rgba(0.5, 0.5, 0, 1) + color: Qt.rgba(1, 0.75, 0.25, 1) } GradientStop { position: 0.5 - color: Qt.rgba(0, 1, 0, 1) + color: Qt.rgba(0, 0.75, 0.5, 1) } GradientStop { position: 0.75 - color: Qt.rgba(0, 0.5, 0.5, 1) + color: Qt.rgba(0, 0.375, 0.75, 1) } GradientStop { position: 1.0 - color: Qt.rgba(0, 0, 1, 1) + color: Qt.rgba(0, 0, 0.5, 1) } } } diff --git a/plugins/SimulationView/layers3d.shader b/plugins/SimulationView/layers3d.shader index 95dc604389..03e279e9eb 100644 --- a/plugins/SimulationView/layers3d.shader +++ b/plugins/SimulationView/layers3d.shader @@ -54,9 +54,13 @@ vertex41core = vec4 layerThicknessGradientColor(float abs_value, float min_value, float max_value) { float value = (abs_value - min_value)/(max_value - min_value); - float red = max(2*value-1, 0); - float green = 1-abs(1-2*value); - float blue = max(1-2*value, 0); + float red = min(max(4*value-2, 0), 1); + float green = min(1.5*value, 0.75); + if (value > 0.75) + { + green = value; + } + float blue = 0.75-abs(0.25-value); return vec4(red, green, blue, 1.0); } From 20ab6265c8d4cbc83230b6f57f4595a423355bcf Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 22 Jan 2018 13:58:35 +0100 Subject: [PATCH 381/551] CURA-4821 Delete also the GCode SceneNode when clearing the buildplate --- cura/CuraApplication.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7b6e970a68..26f9516a89 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1055,7 +1055,7 @@ class CuraApplication(QtApplication): continue # Node that doesnt have a mesh and is not a group. if only_selectable and not node.isSelectable(): continue - if not node.callDecoration("isSliceable"): + if not node.callDecoration("isSliceable") and not node.callDecoration("getLayerData"): continue # Only remove nodes that are selectable. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) @@ -1071,10 +1071,6 @@ class CuraApplication(QtApplication): # Reset the print information: self.getController().getScene().sceneChanged.emit(node) - # self._print_information.setToZeroPrintInformation(self.getBuildPlateModel().activeBuildPlate) - - # stay on the same build plate - #self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate ## Reset all translation on nodes with mesh data. @pyqtSlot() From f27dc4473e96d759fc11c54458f4e037aa99deb0 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 22 Jan 2018 14:25:34 +0100 Subject: [PATCH 382/551] Possible to remove plugins Note that this required adding an `uninstallPlugin()` method to the `PluginRegistry` class of Uranium. --- plugins/PluginBrowser/PluginBrowser.py | 44 ++++++++++++++++++++----- plugins/PluginBrowser/PluginBrowser.qml | 14 ++++---- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index c766a35dbe..d9464dd67b 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -17,6 +17,7 @@ import os import tempfile import platform import zipfile +import shutil i18n_catalog = i18nCatalog("cura") @@ -179,10 +180,12 @@ class PluginBrowser(QObject, Extension): @pyqtSlot(str) def installPlugin(self, file_path): + # Ensure that it starts with a /, as otherwise it doesn't work on windows. if not file_path.startswith("/"): - location = "/" + file_path # Ensure that it starts with a /, as otherwise it doesn't work on windows. + location = "/" + file_path else: location = file_path + result = PluginRegistry.getInstance().installPlugin("file://" + location) self._newly_installed_plugin_ids.append(result["id"]) @@ -190,6 +193,14 @@ class PluginBrowser(QObject, Extension): Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Plugin browser"), result["message"]) + @pyqtSlot(str) + def removePlugin(self, plugin_id): + result = PluginRegistry.getInstance().uninstallPlugin(plugin_id) + + self.pluginsMetadataChanged.emit() + + Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Plugin browser"), result["message"]) + @pyqtProperty(int, notify = onDownloadProgressChanged) def downloadProgress(self): return self._download_progress @@ -226,26 +237,29 @@ class PluginBrowser(QObject, Extension): 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, "author_email") - self._plugins_model.addRoleName(Qt.UserRole + 6, "already_installed") - self._plugins_model.addRoleName(Qt.UserRole + 7, "file_location") - self._plugins_model.addRoleName(Qt.UserRole + 8, "enabled") - self._plugins_model.addRoleName(Qt.UserRole + 9, "can_upgrade") + self._plugins_model.addRoleName(Qt.UserRole + 2, "id") + self._plugins_model.addRoleName(Qt.UserRole + 3, "version") + self._plugins_model.addRoleName(Qt.UserRole + 4, "short_description") + self._plugins_model.addRoleName(Qt.UserRole + 5, "author") + self._plugins_model.addRoleName(Qt.UserRole + 6, "author_email") + self._plugins_model.addRoleName(Qt.UserRole + 7, "already_installed") + self._plugins_model.addRoleName(Qt.UserRole + 8, "file_location") + self._plugins_model.addRoleName(Qt.UserRole + 9, "enabled") + self._plugins_model.addRoleName(Qt.UserRole + 10, "can_upgrade") else: self._plugins_model.clear() items = [] for metadata in self._plugins_metadata: items.append({ "name": metadata["label"], + "id": metadata["id"], "version": metadata["version"], "short_description": metadata["short_description"], "author": metadata["author"], "author_email": "author@gmail.com", "already_installed": self._checkAlreadyInstalled(metadata["id"]), "file_location": metadata["file_location"], + # "enabled": self._checkEnabled(metadata["id"]), "enabled": True, "can_upgrade": self._checkCanUpgrade(metadata["id"], metadata["version"]) }) @@ -274,6 +288,18 @@ class PluginBrowser(QObject, Extension): return True # We already installed this plugin, but the registry just doesn't know it yet. return False + def _checkEnabled(self, id): + 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 _onRequestFinished(self, reply): reply_url = reply.url().toString() if reply.error() == QNetworkReply.TimeoutError: diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 5c148b07d1..728f3139f7 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -154,7 +154,7 @@ UM.Dialog { // Plugin actions Row { id: pluginActions - width: 72 + UM.Theme.getSize("default_margin").width + width: 180 + UM.Theme.getSize("default_margin").width height: parent.height anchors { top: parent.top @@ -165,7 +165,6 @@ UM.Dialog { layoutDirection: Qt.RightToLeft spacing: UM.Theme.getSize("default_margin").width - /* Rectangle { id: removeControls visible: model.already_installed @@ -182,12 +181,14 @@ UM.Dialog { return true; } } + onClicked: { + manager.removePlugin(model.id); + } style: ButtonStyle { background: Rectangle { color: white implicitWidth: 108 implicitHeight: 30 - // radius: 4 border { width: 1 color: "grey" @@ -224,7 +225,6 @@ UM.Dialog { color: "transparent" implicitWidth: 30 implicitHeight: 30 - // radius: 4 } label: Text { verticalAlignment: Text.AlignVCenter @@ -246,10 +246,9 @@ UM.Dialog { else { removeDropDown.open = false } - } - } + Rectangle { id: divider width: 1 @@ -257,6 +256,7 @@ UM.Dialog { anchors.right: removeDropDown.left color: "grey" } + Column { id: options anchors { @@ -278,7 +278,7 @@ UM.Dialog { } } } - */ + Button { id: updateButton visible: model.already_installed && model.can_upgrade From 619a8ccce5db5d72e0e87c95aa2c3613bebb8f78 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 22 Jan 2018 15:02:55 +0100 Subject: [PATCH 383/551] CURA-4839 Fix single extrusing for overrite the extruder stack. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 31 ++++++++------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 638971d109..2c92b4cb6d 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -754,25 +754,18 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # If not extruder stacks were saved in the project file (pre 3.1) create one manually # We re-use the container registry's addExtruderStackForSingleExtrusionMachine method for this if not extruder_stacks: - if self._resolve_strategies["machine"] == "new": - stack = self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder") + stack = self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder") + if global_stack.quality.getId() in ("empty", "empty_quality"): + stack.quality = empty_quality_container + if self._resolve_strategies["machine"] == "override": + # in case the extruder is newly created (for a single-extrusion machine), we need to override + # the existing extruder stack. + existing_extruder_stack = global_stack.extruders[stack.getMetaDataEntry("position")] + for idx in range(len(_ContainerIndexes.IndexTypeMap)): + existing_extruder_stack.replaceContainer(idx, stack._containers[idx], postpone_emit = True) + extruder_stacks.append(existing_extruder_stack) else: - stack = global_stack.extruders.get("0") - if not stack: - # this should not happen - Logger.log("e", "Cannot find any extruder in an existing global stack [%s].", global_stack.getId()) - if stack: - if global_stack.quality.getId() in ("empty", "empty_quality"): - stack.quality = empty_quality_container - if self._resolve_strategies["machine"] == "override": - # in case the extruder is newly created (for a single-extrusion machine), we need to override - # the existing extruder stack. - existing_extruder_stack = global_stack.extruders[stack.getMetaDataEntry("position")] - for idx in range(len(_ContainerIndexes.IndexTypeMap)): - existing_extruder_stack.replaceContainer(idx, stack._containers[idx], postpone_emit = True) - extruder_stacks.append(existing_extruder_stack) - else: - extruder_stacks.append(stack) + extruder_stacks.append(stack) except: Logger.logException("w", "We failed to serialize the stack. Trying to clean up.") @@ -870,7 +863,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # We will first find the correct quality profile for the extruder, then apply the same # quality profile for the global stack. # - if len(extruder_stacks) == 1: + if has_extruder_stack_files and len(extruder_stacks) == 1: extruder_stack = extruder_stacks[0] search_criteria = {"type": "quality", "quality_type": global_stack.quality.getMetaDataEntry("quality_type")} From 172b4e57a4eca8d353cb3a675637cfdd2d0d0ce3 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Mon, 22 Jan 2018 15:08:54 +0100 Subject: [PATCH 384/551] Fix problem with very slow gcode sending CURA-4850 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 7cf855ee85..a7b7edc636 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -100,7 +100,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if batched_lines_count >= max_chars_per_line: file_data_bytes_list.append(self._compressDataAndNotifyQt("".join(batched_lines))) batched_lines = [] - batched_lines_count + batched_lines_count = 0 # Don't miss the last batch (If any) if len(batched_lines) != 0: From 50ccf101d83fab1a3530c0393fcbf6bd0980d3c8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 22 Jan 2018 15:37:51 +0100 Subject: [PATCH 385/551] Don't write Octoprint keys to workspace projects They should not be shared since they are private keys, so let's protect the user from accidentally sharing it via a project file. --- plugins/3MFWriter/ThreeMFWorkspaceWriter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py index f07a37a25f..825259ad58 100644 --- a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py +++ b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py @@ -97,7 +97,7 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): file_in_archive.compress_type = zipfile.ZIP_DEFLATED # Do not include the network authentication keys - ignore_keys = {"network_authentication_id", "network_authentication_key"} + ignore_keys = {"network_authentication_id", "network_authentication_key", "octoprint_api_key"} serialized_data = container.serialize(ignored_metadata_keys = ignore_keys) archive.writestr(file_in_archive, serialized_data) From dcfab2f923f4617717de82a37daff6c6002e60fe Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 22 Jan 2018 15:47:37 +0100 Subject: [PATCH 386/551] Failed state in printjobs is now handled correctly --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index b5cbc33d51..8f9a4d1d8f 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -287,7 +287,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._updatePrintJob(print_job, print_job_data) if print_job.state != "queued": # Print job should be assigned to a printer. - printer = self._getPrinterByKey(print_job_data["printer_uuid"]) + if print_job.state == "failed": + # Print job was failed, so don't attach it to a printer. + printer = None + else: + printer = self._getPrinterByKey(print_job_data["printer_uuid"]) else: # The job can "reserve" a printer if some changes are required. printer = self._getPrinterByKey(print_job_data["assigned_to"]) From e17fbb0db20e3a8a0b2e55f92b495856f87b0c62 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 22 Jan 2018 16:05:43 +0100 Subject: [PATCH 387/551] Remove copying 1st extruder value to all extruders as that breaks re-loading from files --- cura/Settings/ExtruderStack.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index 51b27fea57..d6a72b72e4 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -62,11 +62,6 @@ class ExtruderStack(CuraContainerStack): # Only copy the value when this extruder doesn't have the value. if self.definitionChanges.hasProperty(key, "value"): - # If the first extruder has a value for this setting, we must copy it to the other extruders via the global stack. - # Note: this assumes the extruders are loaded in the same order as they are positioned on the machine. - if self.getMetaDataEntry("position") == "0": - setting_value = self.definitionChanges.getProperty(key, "value") - stack.definitionChanges.setProperty(key, "value", setting_value) continue setting_value = stack.definitionChanges.getProperty(key, "value") From d8ae78d80c6cb389a3b2dd3b51c34a77dbe2539f Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 22 Jan 2018 16:12:11 +0100 Subject: [PATCH 388/551] CURA-4821 Select the groups to be deleted also when clearing the scene --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 26f9516a89..bfcbe529f7 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1055,7 +1055,7 @@ class CuraApplication(QtApplication): continue # Node that doesnt have a mesh and is not a group. if only_selectable and not node.isSelectable(): continue - if not node.callDecoration("isSliceable") and not node.callDecoration("getLayerData"): + if not node.callDecoration("isSliceable") and not node.callDecoration("getLayerData") and not node.callDecoration("isGroup"): continue # Only remove nodes that are selectable. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) From 204af1b6edbe488e93cc97977d088f60f73550fe Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 22 Jan 2018 16:17:37 +0100 Subject: [PATCH 389/551] CURA-4785 fix slow cura for Custom FDM printer: now it's not checking for errors in unused extruders --- cura/Settings/MachineManager.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 23799e34b1..8089cde876 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -395,7 +395,13 @@ class MachineManager(QObject): if self._global_container_stack.hasErrors(): return True - for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()): + + # Not a very pretty solution, but the extruder manager doesn't really know how many extruders there are + machine_extruder_count = self._global_container_stack.getProperty("machine_extruder_count", "value") + extruder_stacks = ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()) + if len(extruder_stacks) > machine_extruder_count: + extruder_stacks = extruder_stacks[:machine_extruder_count] # we only have to check the used extruders + for stack in extruder_stacks: if stack.hasErrors(): return True From 129f9cc16c33fcc3c4449f795c9a72bb389f1faf Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 22 Jan 2018 17:18:09 +0100 Subject: [PATCH 390/551] Fixes for custom FMD printer material diameter upgrade and storage - CURA-4835 --- cura/Settings/ExtruderManager.py | 84 +++++++++++++++++++ cura/Settings/ExtruderStack.py | 12 +++ .../MachineSettingsAction.py | 77 +---------------- 3 files changed, 97 insertions(+), 76 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 6d52ce87fd..6b52c629d0 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -502,6 +502,90 @@ class ExtruderManager(QObject): def getInstanceExtruderValues(self, key): return ExtruderManager.getExtruderValues(key) + ## Updates the material container to a material that matches the material diameter set for the printer + def updateMaterialForDiameter(self, extruder_position: int): + + global_stack = Application.getInstance().getGlobalContainerStack() + if not global_stack: + return + + if not global_stack.getMetaDataEntry("has_materials", False): + return + + extruder_stack = global_stack.extruders[str(extruder_position)] + + material_diameter = extruder_stack.material.getProperty("material_diameter", "value") + if not material_diameter: + # in case of "empty" material + material_diameter = 0 + + material_approximate_diameter = str(round(material_diameter)) + machine_diameter = extruder_stack.definitionChanges.getProperty("material_diameter", "value") + if not machine_diameter: + if extruder_stack.definition.hasProperty("material_diameter", "value"): + machine_diameter = extruder_stack.definition.getProperty("material_diameter", "value") + else: + machine_diameter = global_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 global_stack.getMetaDataEntry("has_machine_materials", False): + materials_definition = global_stack.definition.getId() + has_material_variants = global_stack.getMetaDataEntry("has_variants", False) + else: + materials_definition = "fdmprinter" + has_material_variants = False + + old_material = extruder_stack.material + search_criteria = { + "type": "material", + "approximate_diameter": machine_approximate_diameter, + "material": old_material.getMetaDataEntry("material", "value"), + "brand": old_material.getMetaDataEntry("brand", "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"] = extruder_stack.variant.getId() + + container_registry = Application.getInstance().getContainerRegistry() + empty_material = container_registry.findInstanceContainers(id = "empty_material")[0] + + if old_material == empty_material: + search_criteria.pop("material", None) + search_criteria.pop("supplier", None) + search_criteria.pop("brand", None) + search_criteria.pop("definition", None) + search_criteria["id"] = extruder_stack.getMetaDataEntry("preferred_material") + + materials = 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.pop("brand", None) + search_criteria["color_name"] = "Generic" + materials = 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"] = extruder_stack.getMetaDataEntry("preferred_material") + materials = container_registry.findInstanceContainers(**search_criteria) + if not materials: + # Preferred material with new diameter is not found, search for any material + search_criteria.pop("id", None) + materials = container_registry.findInstanceContainers(**search_criteria) + if not materials: + # Just use empty material as a final fallback + materials = [empty_material] + + Logger.log("i", "Selecting new material: %s", materials[0].getId()) + + extruder_stack.material = materials[0] + ## Get the value for a setting from a specific extruder. # # This is exposed to SettingFunction to use in value functions. diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index d6a72b72e4..204b0e2dae 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -3,6 +3,7 @@ from typing import Any, TYPE_CHECKING, Optional +from UM.Application import Application from UM.Decorators import override from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase from UM.Settings.ContainerStack import ContainerStack @@ -60,6 +61,12 @@ class ExtruderStack(CuraContainerStack): for key in keys_to_copy: + # Since material_diameter is not on the extruder definition, we need to add it here + # WARNING: this might be very dangerous and should be refactored ASAP! + definition = stack.getSettingDefinition(key) + if definition: + self.definition.addDefinition(definition) + # Only copy the value when this extruder doesn't have the value. if self.definitionChanges.hasProperty(key, "value"): continue @@ -75,6 +82,11 @@ class ExtruderStack(CuraContainerStack): self.definitionChanges.addInstance(new_instance) self.definitionChanges.setDirty(True) + # Make sure the material diameter is up to date for the extruder stack. + if key == "material_diameter": + position = self.getMetaDataEntry("position", "0") + Application.getInstance().getExtruderManager().updateMaterialForDiameter(position) + # NOTE: We cannot remove the setting from the global stack's definition changes container because for # material diameter, it needs to be applied to all extruders, but here we don't know how many extruders # a machine actually has and how many extruders has already been loaded for that machine, so we have to diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index ae1c1663dd..baa0639d3f 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -158,79 +158,4 @@ class MachineSettingsAction(MachineAction): @pyqtSlot(int) def updateMaterialForDiameter(self, extruder_position: int): # 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 - - extruder_stack = self._global_container_stack.extruders[str(extruder_position)] - - material_diameter = extruder_stack.material.getProperty("material_diameter", "value") - if not material_diameter: - # in case of "empty" material - material_diameter = 0 - - material_approximate_diameter = str(round(material_diameter)) - machine_diameter = extruder_stack.definitionChanges.getProperty("material_diameter", "value") - if not machine_diameter: - if extruder_stack.definition.hasProperty("material_diameter", "value"): - machine_diameter = extruder_stack.definition.getProperty("material_diameter", "value") - else: - 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 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 - - old_material = extruder_stack.material - search_criteria = { - "type": "material", - "approximate_diameter": machine_approximate_diameter, - "material": old_material.getMetaDataEntry("material", "value"), - "brand": old_material.getMetaDataEntry("brand", "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"] = extruder_stack.variant.getId() - - if old_material == self._empty_container: - search_criteria.pop("material", None) - search_criteria.pop("supplier", None) - search_criteria.pop("brand", None) - search_criteria.pop("definition", None) - search_criteria["id"] = extruder_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.pop("brand", 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"] = extruder_stack.getMetaDataEntry("preferred_material") - materials = self._container_registry.findInstanceContainers(**search_criteria) - if not materials: - # Preferred 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 = [self._empty_container] - - Logger.log("i", "Selecting new material: %s", materials[0].getId()) - - extruder_stack.material = materials[0] + Application.getInstance().getExtruderManager().updateMaterialForDiameter(extruder_position) From 3fb9877a30abb395ae9f854df6e71ff6d237ad83 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 22 Jan 2018 14:59:04 +0100 Subject: [PATCH 391/551] Add call_on_qt_thread to fix project loading crashing on rendering CURA-4839 See comments... --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 2c92b4cb6d..059a1c5d1f 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -31,10 +31,42 @@ import zipfile import io import configparser import os +import threading i18n_catalog = i18nCatalog("cura") +# +# HACK: +# +# In project loading, when override the existing machine is selected, the stacks and containers that are correctly +# active in the system will be overridden at runtime. Because the project loading is done in a different thread than +# the Qt thread, something else can kick in the middle of the process. One of them is the rendering. It will access +# the current stacks and container, which have not completely been updated yet, so Cura will crash in this case. +# +# This "@call_on_qt_thread" decorator makes sure that a function will always be called on the Qt thread (blocking). +# It is applied to the read() function of project loading so it can be guaranteed that only after the project loading +# process is completely done, everything else that needs to occupy the QT thread will be executed. +# +class InterCallObject: + def __init__(self): + self.finish_event = threading.Event() + self.result = None + + +def call_on_qt_thread(func): + def _call_on_qt_thread_wrapper(*args, **kwargs): + def _handle_call(ico, *args, **kwargs): + ico.result = func(*args, **kwargs) + ico.finish_event.set() + inter_call_object = InterCallObject() + new_args = tuple([inter_call_object] + list(args)[:]) + CuraApplication.getInstance().callLater(_handle_call, *new_args, **kwargs) + inter_call_object.finish_event.wait() + return inter_call_object.result + return _call_on_qt_thread_wrapper + + ## Base implementation for reading 3MF workspace files. class ThreeMFWorkspaceReader(WorkspaceReader): def __init__(self): @@ -401,6 +433,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # containing global.cfg / extruder.cfg # # \param file_name + @call_on_qt_thread def read(self, file_name): archive = zipfile.ZipFile(file_name, "r") From dc119d74bdea44fa8bc572a3da7003adc7c57b87 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 23 Jan 2018 09:21:38 +0100 Subject: [PATCH 392/551] CURA-4785 added logging for measuring time for validation check --- cura/Settings/MachineManager.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 8089cde876..1fcb42e824 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1,6 +1,7 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import time #Type hinting. from typing import Union, List, Dict @@ -390,6 +391,7 @@ class MachineManager(QObject): Logger.log("w", "Failed creating a new machine!") def _checkStacksHaveErrors(self) -> bool: + time_start = time.time() if self._global_container_stack is None: #No active machine. return False @@ -405,6 +407,7 @@ class MachineManager(QObject): if stack.hasErrors(): return True + Logger.log("d", "Checking stacks for errors took %.2f s" % (time.time() - time_start)) return False ## Remove all instances from the top instanceContainer (effectively removing all user-changed settings) From 92e99012d3050f22f34f09d349937aa0eb1c6ff2 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 23 Jan 2018 09:33:52 +0100 Subject: [PATCH 393/551] CURA-4785 now actually checking for extruder position, improved logs --- cura/Settings/MachineManager.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 1fcb42e824..e84f8d2237 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -396,18 +396,23 @@ class MachineManager(QObject): return False if self._global_container_stack.hasErrors(): + Logger.log("d", "Checking global stack for errors took %0.2f s and we found and error" % (time.time() - time_start)) return True # Not a very pretty solution, but the extruder manager doesn't really know how many extruders there are machine_extruder_count = self._global_container_stack.getProperty("machine_extruder_count", "value") extruder_stacks = ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()) - if len(extruder_stacks) > machine_extruder_count: - extruder_stacks = extruder_stacks[:machine_extruder_count] # we only have to check the used extruders + count = 1 # we start with the global stack for stack in extruder_stacks: + md = stack.getMetaData() + if "position" in md and int(md["position"]) >= machine_extruder_count: + continue + count += 1 if stack.hasErrors(): + Logger.log("d", "Checking %s stacks for errors took %.2f s and we found an error in stack [%s]" % (count, time.time() - time_start, str(stack))) return True - Logger.log("d", "Checking stacks for errors took %.2f s" % (time.time() - time_start)) + Logger.log("d", "Checking %s stacks for errors took %.2f s" % (count, time.time() - time_start)) return False ## Remove all instances from the top instanceContainer (effectively removing all user-changed settings) From 6c9d7b5a2ef29f0d022d09d66c216e85e38053c9 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 23 Jan 2018 09:49:26 +0100 Subject: [PATCH 394/551] Fixes for resetting print time information when removing all or last model, reduce signals being used for print time resetting - CURA-4852 --- cura/CuraActions.py | 4 ++++ cura/CuraApplication.py | 6 +++--- cura/PrintInformation.py | 31 +++++++++++++++++++++++-------- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index f5aace805b..f517ec4217 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -94,6 +94,10 @@ class CuraActions(QObject): removed_group_nodes.append(group_node) op.addOperation(SetParentOperation(remaining_nodes_in_group[0], group_node.getParent())) op.addOperation(RemoveSceneNodeOperation(group_node)) + + # Reset the print information + Application.getInstance().getController().getScene().sceneChanged.emit(node) + op.push() ## Set the extruder that should be used to print the selection. diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index bfcbe529f7..8df9f01e91 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1066,12 +1066,12 @@ class CuraApplication(QtApplication): for node in nodes: op.addOperation(RemoveSceneNodeOperation(node)) + # Reset the print information + self.getController().getScene().sceneChanged.emit(node) + op.push() Selection.clear() - # Reset the print information: - self.getController().getScene().sceneChanged.emit(node) - ## Reset all translation on nodes with mesh data. @pyqtSlot() def resetAllTranslation(self): diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 5d5d59ed3b..c03cafe667 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -8,7 +8,9 @@ from UM.Application import Application from UM.Logger import Logger from UM.Qt.Duration import Duration from UM.Preferences import Preferences +from UM.Scene.SceneNode import SceneNode from UM.Settings.ContainerRegistry import ContainerRegistry +from cura.Scene.CuraSceneNode import CuraSceneNode from cura.Settings.ExtruderManager import ExtruderManager from typing import Dict @@ -65,7 +67,7 @@ class PrintInformation(QObject): self._backend = Application.getInstance().getBackend() if self._backend: self._backend.printDurationMessage.connect(self._onPrintDurationMessage) - Application.getInstance().getController().getScene().sceneChanged.connect(self.setToZeroPrintInformation) + Application.getInstance().getController().getScene().sceneChanged.connect(self._onSceneChanged) self._base_name = "" self._abbr_machine = "" @@ -395,12 +397,25 @@ class PrintInformation(QObject): return result # Simulate message with zero time duration - def setToZeroPrintInformation(self, build_plate_number): - temp_message = {} - if build_plate_number not in self._print_time_message_values: - self._print_time_message_values[build_plate_number] = {} - for key in self._print_time_message_values[build_plate_number].keys(): - temp_message[key] = 0 + def setToZeroPrintInformation(self, build_plate): + # Construct the 0-time message + temp_message = {} + if build_plate not in self._print_time_message_values: + self._print_time_message_values[build_plate] = {} + for key in self._print_time_message_values[build_plate].keys(): + temp_message[key] = 0 temp_material_amounts = [0] - self._onPrintDurationMessage(build_plate_number, temp_message, temp_material_amounts) + + self._onPrintDurationMessage(build_plate, temp_message, temp_material_amounts) + + ## Listen to scene changes to check if we need to reset the print information + def _onSceneChanged(self, scene_node): + + # Ignore any changes that are not related to sliceable objects + if not isinstance(scene_node, SceneNode)\ + or not scene_node.callDecoration("isSliceable")\ + or not scene_node.callDecoration("getBuildPlateNumber") == self._active_build_plate: + return + + self.setToZeroPrintInformation(self._active_build_plate) From c0bce6ffd49338f53f7edf82d2541982b882543a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 23 Jan 2018 10:25:39 +0100 Subject: [PATCH 395/551] Move Jenkins timeout into parallel_nodes block --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 20c7303719..83104aea18 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,5 +1,5 @@ -timeout(time: 2, unit: "HOURS") { - parallel_nodes(['linux && cura', 'windows && cura']) { +parallel_nodes(['linux && cura', 'windows && cura']) { + timeout(time: 2, unit: "HOURS") { // Prepare building stage('Prepare') { // Ensure we start with a clean build directory. From 1c605a5108771add6f3fd180f5073f5c33391eab Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 23 Jan 2018 10:58:43 +0100 Subject: [PATCH 396/551] Fix different strategies for machine and quality in project loading CURA-4839 --- cura/Settings/CuraContainerRegistry.py | 38 +++++++++++++-------- cura/Settings/ExtruderManager.py | 1 - cura/Settings/ExtruderStack.py | 1 - plugins/3MFReader/ThreeMFWorkspaceReader.py | 20 +++++++++-- 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 7231fa1f72..5d81188750 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -449,7 +449,13 @@ class CuraContainerRegistry(ContainerRegistry): if not extruder_stacks: self.addExtruderStackForSingleExtrusionMachine(container, "fdmextruder") - def addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id): + # + # new_global_quality_changes is optional. It is only used in project loading for a scenario like this: + # - override the current machine + # - create new for custom quality profile + # new_global_quality_changes is the new global quality changes container in this scenario. + # + def addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id, new_global_quality_changes = None): new_extruder_id = extruder_id extruder_definitions = self.findDefinitionContainers(id = new_extruder_id) @@ -545,8 +551,12 @@ class CuraContainerRegistry(ContainerRegistry): quality_id = "empty_quality" extruder_stack.setQualityById(quality_id) - if machine.qualityChanges.getId() not in ("empty", "empty_quality_changes"): - extruder_quality_changes_container = self.findInstanceContainers(name = machine.qualityChanges.getName(), extruder = extruder_id) + machine_quality_changes = machine.qualityChanges + if new_global_quality_changes is not None: + machine_quality_changes = new_global_quality_changes + + if machine_quality_changes.getId() not in ("empty", "empty_quality_changes"): + extruder_quality_changes_container = self.findInstanceContainers(name = machine_quality_changes.getName(), extruder = extruder_id) if extruder_quality_changes_container: extruder_quality_changes_container = extruder_quality_changes_container[0] @@ -556,34 +566,34 @@ class CuraContainerRegistry(ContainerRegistry): # Some extruder quality_changes containers can be created at runtime as files in the qualities # folder. Those files won't be loaded in the registry immediately. So we also need to search # the folder to see if the quality_changes exists. - extruder_quality_changes_container = self._findQualityChangesContainerInCuraFolder(machine.qualityChanges.getName()) + extruder_quality_changes_container = self._findQualityChangesContainerInCuraFolder(machine_quality_changes.getName()) if extruder_quality_changes_container: quality_changes_id = extruder_quality_changes_container.getId() extruder_stack.setQualityChangesById(quality_changes_id) else: # if we still cannot find a quality changes container for the extruder, create a new one - container_name = machine.qualityChanges.getName() + container_name = machine_quality_changes.getName() container_id = self.uniqueName(extruder_stack.getId() + "_qc_" + container_name) extruder_quality_changes_container = InstanceContainer(container_id) extruder_quality_changes_container.setName(container_name) extruder_quality_changes_container.addMetaDataEntry("type", "quality_changes") extruder_quality_changes_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) extruder_quality_changes_container.addMetaDataEntry("extruder", extruder_stack.definition.getId()) - extruder_quality_changes_container.addMetaDataEntry("quality_type", machine.qualityChanges.getMetaDataEntry("quality_type")) - extruder_quality_changes_container.setDefinition(machine.qualityChanges.getDefinition().getId()) + extruder_quality_changes_container.addMetaDataEntry("quality_type", machine_quality_changes.getMetaDataEntry("quality_type")) + extruder_quality_changes_container.setDefinition(machine_quality_changes.getDefinition().getId()) self.addContainer(extruder_quality_changes_container) extruder_stack.qualityChanges = extruder_quality_changes_container if not extruder_quality_changes_container: Logger.log("w", "Could not find quality_changes named [%s] for extruder [%s]", - machine.qualityChanges.getName(), extruder_stack.getId()) + machine_quality_changes.getName(), extruder_stack.getId()) else: # move all per-extruder settings to the extruder's quality changes - for qc_setting_key in machine.qualityChanges.getAllKeys(): + for qc_setting_key in machine_quality_changes.getAllKeys(): settable_per_extruder = machine.getProperty(qc_setting_key, "settable_per_extruder") if settable_per_extruder: - setting_value = machine.qualityChanges.getProperty(qc_setting_key, "value") + setting_value = machine_quality_changes.getProperty(qc_setting_key, "value") setting_definition = machine.getSettingDefinition(qc_setting_key) new_instance = SettingInstance(setting_definition, definition_changes) @@ -592,7 +602,7 @@ class CuraContainerRegistry(ContainerRegistry): extruder_quality_changes_container.addInstance(new_instance) extruder_quality_changes_container.setDirty(True) - machine.qualityChanges.removeInstance(qc_setting_key, postpone_emit=True) + machine_quality_changes.removeInstance(qc_setting_key, postpone_emit=True) else: extruder_stack.setQualityChangesById("empty_quality_changes") @@ -600,8 +610,8 @@ class CuraContainerRegistry(ContainerRegistry): # Also need to fix the other qualities that are suitable for this machine. Those quality changes may still have # per-extruder settings in the container for the machine instead of the extruder. - if machine.qualityChanges.getId() not in ("empty", "empty_quality_changes"): - quality_changes_machine_definition_id = machine.qualityChanges.getDefinition().getId() + if machine_quality_changes.getId() not in ("empty", "empty_quality_changes"): + quality_changes_machine_definition_id = machine_quality_changes.getDefinition().getId() else: whole_machine_definition = machine.definition machine_entry = machine.definition.getMetaDataEntry("machine") @@ -621,7 +631,7 @@ class CuraContainerRegistry(ContainerRegistry): qc_groups[qc_name] = [] qc_groups[qc_name].append(qc) # try to find from the quality changes cura directory too - quality_changes_container = self._findQualityChangesContainerInCuraFolder(machine.qualityChanges.getName()) + quality_changes_container = self._findQualityChangesContainerInCuraFolder(machine_quality_changes.getName()) if quality_changes_container: qc_groups[qc_name].append(quality_changes_container) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 6b52c629d0..f9f0fbb401 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -504,7 +504,6 @@ class ExtruderManager(QObject): ## Updates the material container to a material that matches the material diameter set for the printer def updateMaterialForDiameter(self, extruder_position: int): - global_stack = Application.getInstance().getGlobalContainerStack() if not global_stack: return diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index 204b0e2dae..0854964898 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -60,7 +60,6 @@ class ExtruderStack(CuraContainerStack): keys_to_copy = ["material_diameter", "machine_nozzle_size"] # these will be copied over to all extruders for key in keys_to_copy: - # Since material_diameter is not on the extruder definition, we need to add it here # WARNING: this might be very dangerous and should be refactored ASAP! definition = stack.getSettingDefinition(key) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 059a1c5d1f..3267bf486f 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -558,6 +558,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): instance_container_files = [name for name in cura_file_names if name.endswith(self._instance_container_suffix)] user_instance_containers = [] quality_and_definition_changes_instance_containers = [] + quality_changes_instance_containers = [] for instance_container_file in instance_container_files: container_id = self._stripFileToId(instance_container_file) serialized = archive.open(instance_container_file).read().decode("utf-8") @@ -663,6 +664,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # The ID already exists, but nothing in the values changed, so do nothing. pass quality_and_definition_changes_instance_containers.append(instance_container) + if container_type == "quality_changes": + quality_changes_instance_containers.append(instance_container) if container_type == "definition_changes": definition_changes_extruder_count = instance_container.getProperty("machine_extruder_count", "value") @@ -787,7 +790,19 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # If not extruder stacks were saved in the project file (pre 3.1) create one manually # We re-use the container registry's addExtruderStackForSingleExtrusionMachine method for this if not extruder_stacks: - stack = self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder") + # If we choose to override a machine but to create a new custom quality profile, the custom quality + # profile is not immediately applied to the global_stack, so this fix for single extrusion machines + # will use the current custom quality profile on the existing machine. The extra optional argument + # in that function is used in thia case to specify a new global stack quality_changes container so + # the fix can correctly create and copy over the custom quality settings to the newly created extruder. + new_global_quality_changes = None + if self._resolve_strategies["quality_changes"] == "new" and len(quality_changes_instance_containers) > 0: + new_global_quality_changes = quality_changes_instance_containers[0] + stack = self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder", + new_global_quality_changes) + if new_global_quality_changes is not None: + quality_changes_instance_containers.append(stack.qualityChanges) + quality_and_definition_changes_instance_containers.append(stack.qualityChanges) if global_stack.quality.getId() in ("empty", "empty_quality"): stack.quality = empty_quality_container if self._resolve_strategies["machine"] == "override": @@ -1028,8 +1043,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): stack.setNextStack(global_stack) stack.containersChanged.emit(stack.getTop()) else: - if quality_has_been_changed: - CuraApplication.getInstance().getMachineManager().activeQualityChanged.emit() + CuraApplication.getInstance().getMachineManager().activeQualityChanged.emit() # Actually change the active machine. Application.getInstance().setGlobalContainerStack(global_stack) From 8fe6e82459e305b4aba7fb8c9f791ddf74bef521 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 23 Jan 2018 11:14:57 +0100 Subject: [PATCH 397/551] Added Setting visibility preset CURA-3710 --- resources/visibility_presets/advanced.cfg | 32 +++++++++++ resources/visibility_presets/basic.cfg | 66 +++++++++++++++++++++++ resources/visibility_presets/expert.cfg | 66 +++++++++++++++++++++++ 3 files changed, 164 insertions(+) create mode 100644 resources/visibility_presets/advanced.cfg create mode 100644 resources/visibility_presets/basic.cfg create mode 100644 resources/visibility_presets/expert.cfg diff --git a/resources/visibility_presets/advanced.cfg b/resources/visibility_presets/advanced.cfg new file mode 100644 index 0000000000..335ae67afe --- /dev/null +++ b/resources/visibility_presets/advanced.cfg @@ -0,0 +1,32 @@ +[general] +name = Advanced +weight = 2 + +[machine_settings] + +[resolution] +layer_height + +[shell] + +[infill] + +[material] + +[speed] + +[travel] + +[cooling] + +[support] + +[platform_adhesion] + +[dual] + +[meshfix] + +[blackmagic] + +[experimental] \ No newline at end of file diff --git a/resources/visibility_presets/basic.cfg b/resources/visibility_presets/basic.cfg new file mode 100644 index 0000000000..062feb9189 --- /dev/null +++ b/resources/visibility_presets/basic.cfg @@ -0,0 +1,66 @@ +[general] +name = Basic +weight = 1 + +[machine_settings] + +[resolution] +layer_height + +[shell] +wall_thickness +top_bottom_thickness +z_seam_x +z_seam_y + +[infill] +infill_sparse_density +gradual_infill_steps + +[material] +material_print_temperature +material_bed_temperature +material_diameter +material_flow +retraction_enable + +[speed] +speed_print +speed_travel +acceleration_print +acceleration_travel +jerk_print +jerk_travel + +[travel] + +[cooling] +cool_fan_enabled + +[support] +support_enable +support_extruder_nr +support_type + +[platform_adhesion] +adhesion_type +adhesion_extruder_nr +brim_width +raft_airgap +layer_0_z_overlap +raft_surface_layers + +[dual] +prime_tower_enable +prime_tower_size +prime_tower_position_x +prime_tower_position_y + +[meshfix] + +[blackmagic] +print_sequence +infill_mesh +cutting_mesh + +[experimental] \ No newline at end of file diff --git a/resources/visibility_presets/expert.cfg b/resources/visibility_presets/expert.cfg new file mode 100644 index 0000000000..130c75c6b9 --- /dev/null +++ b/resources/visibility_presets/expert.cfg @@ -0,0 +1,66 @@ +[general] +name = Expert +weight = 3 + +[machine_settings] + +[resolution] +layer_height + +[shell] +wall_thickness +top_bottom_thickness +z_seam_x +z_seam_y + +[infill] +infill_sparse_density +gradual_infill_steps + +[material] +material_print_temperature +material_bed_temperature +material_diameter +material_flow +retraction_enable + +[speed] +speed_print +speed_travel +acceleration_print +acceleration_travel +jerk_print +jerk_travel + +[travel] + +[cooling] +cool_fan_enabled + +[support] +support_enable +support_extruder_nr +support_type + +[platform_adhesion] +adhesion_type +adhesion_extruder_nr +brim_width +raft_airgap +layer_0_z_overlap +raft_surface_layers + +[dual] +prime_tower_enable +prime_tower_size +prime_tower_position_x +prime_tower_position_y + +[meshfix] + +[blackmagic] +print_sequence +infill_mesh +cutting_mesh + +[experimental] \ No newline at end of file From 5c8d46b5c2ff27ff32bfc8e27451d3f8764accf8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 22 Jan 2018 17:21:03 +0100 Subject: [PATCH 398/551] Simplify check for _outside_buildarea There is a getter function that has a default if the attribute doesn't exist. Contributes to issue CURA-4797. --- cura/PlatformPhysics.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 69890178e4..cf4dd83fef 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import QTimer @@ -57,7 +57,7 @@ class PlatformPhysics: nodes = list(BreadthFirstIterator(root)) # Only check nodes inside build area. - nodes = [node for node in nodes if (hasattr(node, "_outside_buildarea") and not node._outside_buildarea)] + nodes = [node for node in nodes if getattr(node, "_outside_buildarea", False)] random.shuffle(nodes) for node in nodes: From cf556ccf8ff7116af0014ffc91c019b26cf4f364 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 23 Jan 2018 11:20:06 +0100 Subject: [PATCH 399/551] Remove unused import Contributes to issue CURA-4797. --- cura/Scene/CuraSceneNode.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py index 9df2931f0b..597dfedf7a 100644 --- a/cura/Scene/CuraSceneNode.py +++ b/cura/Scene/CuraSceneNode.py @@ -1,5 +1,7 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + from UM.Application import Application -from UM.Logger import Logger from UM.Scene.SceneNode import SceneNode from copy import deepcopy From 27e441ecd9642530b5b8f8fe949cff152d54dcba Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 23 Jan 2018 11:21:32 +0100 Subject: [PATCH 400/551] Do boundary checks on nodes for which the boundary check is unknown Just before deciding whether to drop down the node on the build plate. Contributes to issue CURA-4797. --- cura/BuildVolume.py | 84 ++++++++++++++++++++--------------------- cura/PlatformPhysics.py | 11 ++++-- 2 files changed, 48 insertions(+), 47 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 2567641cc9..f7e748ba4e 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1,8 +1,7 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from cura.Settings.ExtruderManager import ExtruderManager -from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog from UM.Scene.Platform import Platform from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator @@ -194,52 +193,51 @@ class BuildVolume(SceneNode): return True - ## For every sliceable node, update node._outside_buildarea + ## For every sliceable node, update node._outside_buildarea. + def updateAllBoundaryChecks(self): + self.updateNodeBoundaryCheck(Application.getInstance().getController().getScene().getRoot()) + + ## For a single node, update _outside_buildarea. # - def updateNodeBoundaryCheck(self): - root = Application.getInstance().getController().getScene().getRoot() - nodes = list(BreadthFirstIterator(root)) - group_nodes = [] + # If the node is a group node, the child nodes will also get updated. + # \param node The node to update the boundary checks of. + def updateNodeBoundaryCheck(self, node: SceneNode): + if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"): + for child in node.getChildren(): #Still update the children! For instance, the root is not sliceable. + self.updateNodeBoundaryCheck(child) + return #Don't compute for non-sliceable nodes. - build_volume_bounding_box = self.getBoundingBox() - if build_volume_bounding_box: - # It's over 9000! - build_volume_bounding_box = build_volume_bounding_box.set(bottom=-9001) - else: - # No bounding box. This is triggered when running Cura from command line with a model for the first time - # In that situation there is a model, but no machine (and therefore no build volume. + #Mark the node as outside the build volume if the bounding box test fails. + build_volume = self.getBoundingBox() + if build_volume is None: + #No bounding box. This is triggered when running Cura from command line with a model for the first time. + #In that situation there is a model, but no machine (and therefore no build volume). return + build_volume = build_volume.set(bottom = -999999) #Allow models to clip the build plate. This should allow printing but remove the bottom side of the model underneath the build plate. + bounding_box = node.getBoundingBox() + if build_volume.intersectsBox(bounding_box) != AxisAlignedBox.IntersectionResult.FullIntersection: + node._outside_buildarea = True + else: - for node in nodes: - # Need to check group nodes later - if node.callDecoration("isGroup"): - group_nodes.append(node) # Keep list of affected group_nodes - - if node.callDecoration("isSliceable") or node.callDecoration("isGroup"): - node._outside_buildarea = False - bbox = node.getBoundingBox() - - # Mark the node as outside the build volume if the bounding box test fails. - if build_volume_bounding_box.intersectsBox(bbox) != AxisAlignedBox.IntersectionResult.FullIntersection: + #Check for collisions between disallowed areas and the object. + convex_hull = node.callDecoration("getConvexHull") + if not convex_hull or not convex_hull.isValid(): + return + for area in self.getDisallowedAreas(): + overlap = convex_hull.intersectsPolygon(area) + if overlap is not None: node._outside_buildarea = True - continue + break + else: + node._outside_buildarea = False - convex_hull = node.callDecoration("getConvexHull") - if convex_hull: - if not convex_hull.isValid(): - return - # Check for collisions between disallowed areas and the object - for area in self.getDisallowedAreas(): - overlap = convex_hull.intersectsPolygon(area) - if overlap is None: - continue - node._outside_buildarea = True - continue - - # Group nodes should override the _outside_buildarea property of their children. - for group_node in group_nodes: - for child_node in group_node.getAllChildren(): - child_node._outside_buildarea = group_node._outside_buildarea + #Group nodes should override the _outside_buildarea property of their children. + if node.callDecoration("isGroup"): + for child in node.getAllChildren(): + child._outside_buildarea = node._outside_buildarea + else: + for child in node.getChildren(): + self.updateNodeBoundaryCheck(child) ## Recalculates the build volume & disallowed areas. def rebuild(self): @@ -424,7 +422,7 @@ class BuildVolume(SceneNode): Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds - self.updateNodeBoundaryCheck() + self.updateAllBoundaryChecks() def getBoundingBox(self) -> AxisAlignedBox: return self._volume_aabb diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index cf4dd83fef..05385d7c71 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -56,14 +56,17 @@ class PlatformPhysics: # By shuffling the order of the nodes, this might happen a few times, but at some point it will resolve. nodes = list(BreadthFirstIterator(root)) - # Only check nodes inside build area. - nodes = [node for node in nodes if getattr(node, "_outside_buildarea", False)] - random.shuffle(nodes) for node in nodes: if node is root or not isinstance(node, SceneNode) or node.getBoundingBox() is None: continue + #Only check nodes inside the build area. + if not hasattr(node, "_outside_buildarea"): + self._build_volume.updateNodeBoundaryCheck(node) + if getattr(node, "_outside_buildarea", True): + continue + bbox = node.getBoundingBox() # Move it downwards if bottom is above platform @@ -155,7 +158,7 @@ class PlatformPhysics: # After moving, we have to evaluate the boundary checks for nodes build_volume = Application.getInstance().getBuildVolume() - build_volume.updateNodeBoundaryCheck() + build_volume.updateAllBoundaryChecks() def _onToolOperationStarted(self, tool): self._enabled = False From 54dc63a596d99cd9dd292a69856a6f11bdd3612a Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 23 Jan 2018 11:24:27 +0100 Subject: [PATCH 401/551] Add missing changes CURA-3710 --- cura/CuraApplication.py | 151 ++++++++++++------ plugins/3MFReader/ThreeMFWorkspaceReader.py | 1 + .../qml/Preferences/SettingVisibilityPage.qml | 108 ++++++++++++- 3 files changed, 206 insertions(+), 54 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 9261f0df1a..0df64dbacb 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -87,6 +87,7 @@ from PyQt5.QtGui import QColor, QIcon from PyQt5.QtWidgets import QMessageBox from PyQt5.QtQml import qmlRegisterUncreatableType, qmlRegisterSingletonType, qmlRegisterType +from configparser import ConfigParser import sys import os.path import numpy @@ -348,57 +349,19 @@ class CuraApplication(QtApplication): preferences.setDefault("local_file/last_used_type", "text/x-gcode") - preferences.setDefault("general/visible_settings", """ - machine_settings - resolution - layer_height - shell - wall_thickness - top_bottom_thickness - z_seam_x - z_seam_y - infill - infill_sparse_density - gradual_infill_steps - material - material_print_temperature - material_bed_temperature - material_diameter - material_flow - retraction_enable - speed - speed_print - speed_travel - acceleration_print - acceleration_travel - jerk_print - jerk_travel - travel - cooling - cool_fan_enabled - support - support_enable - support_extruder_nr - support_type - platform_adhesion - adhesion_type - adhesion_extruder_nr - brim_width - raft_airgap - layer_0_z_overlap - raft_surface_layers - dual - prime_tower_enable - prime_tower_size - prime_tower_position_x - prime_tower_position_y - meshfix - blackmagic - print_sequence - infill_mesh - cutting_mesh - experimental - """.replace("\n", ";").replace(" ", "")) + setting_visibily_preset_names = self.getVisibilitySettingsPresetTypes() + preferences.setDefault("general/visible_settings_preset", setting_visibily_preset_names) + + visible_settings_preset_choice = Preferences.getInstance().getValue("general/visible_settings_preset_choice") + + default_visibility_preset = "Basic" + if visible_settings_preset_choice == "" or visible_settings_preset_choice is None: + if not visible_settings_preset_choice in setting_visibily_preset_names: + visible_settings_preset_choice = default_visibility_preset + + visible_settings = self.getVisibilitySettingPreset(settings_preset_name = visible_settings_preset_choice) + preferences.setDefault("general/visible_settings", visible_settings) + preferences.setDefault("general/visible_settings_preset_choice", visible_settings_preset_choice) self.applicationShuttingDown.connect(self.saveSettings) self.engineCreatedSignal.connect(self._onEngineCreated) @@ -410,6 +373,92 @@ class CuraApplication(QtApplication): self.getCuraSceneController().setActiveBuildPlate(0) # Initialize + @pyqtSlot(str, result=str) + def getVisibilitySettingPreset(self, settings_preset_name): + + result = self._load_visibilyty_setting_preset(settings_preset_name) + + formatted_preset_settings = self.format_visibility_setting_preset(result) + + return formatted_preset_settings + + def format_visibility_setting_preset(self, settings_data): + + result_string = "" + + for key in settings_data: + result_string += key + ";" + + for value in settings_data[key]: + result_string += value + ";" + + return result_string + + + def _load_visibilyty_setting_preset(self, visibility_preset_name): + preset_dir = Resources.getPath(Resources.VisibilitySettingsPreset) + + result = {} + right_preset_found = False + + for item in os.listdir(preset_dir): + file_path = os.path.join(preset_dir, item) + if not os.path.isfile(file_path): + continue + + parser = ConfigParser(allow_no_value=True) # accept options without any value, + + try: + parser.read([file_path]) + + if not parser.has_option("general", "name"): + continue + + if parser["general"]["name"] == visibility_preset_name: + right_preset_found = True + for section in parser.sections(): + if section == 'general': + continue + else: + section_settings = [] + for option in parser[section]._options(): + section_settings.append(option) + + result[section] = section_settings + + if right_preset_found: + break + + except Exception as e: + Logger.log("e", "Failed to load setting visibility preset %s: %s", file_path, str(e)) + + return result + + def getVisibilitySettingsPresetTypes(self): + preset_dir = Resources.getPath(Resources.VisibilitySettingsPreset) + result = {} + + for item in os.listdir(preset_dir): + file_path = os.path.join(preset_dir, item) + if not os.path.isfile(file_path): + continue + + parser = ConfigParser(allow_no_value=True) # accept options without any value, + + try: + parser.read([file_path]) + + if not parser.has_option("general", "name") and not parser.has_option("general", "weight"): + continue + + result[parser["general"]["weight"]] = parser["general"]["name"] + + except Exception as e: + Logger.log("e", "Failed to load setting preset %s: %s", file_path, str(e)) + + return result + + def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 913cea4f26..1c6cef2b7e 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -420,6 +420,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): Logger.log("w", "Workspace did not contain visible settings. Leaving visibility unchanged") else: global_preferences.setValue("general/visible_settings", visible_settings) + global_preferences.setValue("general/visible_settings_preset_choice", "Custom") categories_expanded = temp_preferences.getValue("cura/categories_expanded") if categories_expanded is None: diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index 5198ab1030..e1707fa196 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -24,6 +24,11 @@ UM.PreferencesPage function reset() { UM.Preferences.resetPreference("general/visible_settings") + + // After calling this function update Setting visibility preset combobox. + // Reset should set "Basic" setting preset + visibilityPreset.setBasicPreset() + } resetEnabled: true; @@ -72,6 +77,9 @@ UM.PreferencesPage { definitionsModel.setAllVisible(false) } + + // After change set "Custom" option + visibilityPreset.currentIndex = visibilityPreset.model.count - 1 } } } @@ -85,7 +93,8 @@ UM.PreferencesPage top: parent.top left: toggleVisibleSettings.right leftMargin: UM.Theme.getSize("default_margin").width - right: parent.right + right: visibilityPreset.left + rightMargin: UM.Theme.getSize("default_margin").width } placeholderText: catalog.i18nc("@label:textbox", "Filter...") @@ -93,6 +102,88 @@ UM.PreferencesPage onTextChanged: definitionsModel.filter = {"i18n_label": "*" + text} } + ComboBox + { + property int customOptionValue: 100 + + function setBasicPreset() + { + var index = 0 + for(var i = 0; i < presetNamesList.count; ++i) + { + if(model.get(i).text == "Basic") + { + index = i; + break; + } + } + + visibilityPreset.currentIndex = index + } + + id: visibilityPreset + width: 150 + anchors + { + top: parent.top + right: parent.right + } + + model: ListModel + { + id: presetNamesList + Component.onCompleted: + { + // returned value is Dictionary (Ex: {1:"Basic"}, The number 1 is the weight and sort by weight) + var itemsDict = UM.Preferences.getValue("general/visible_settings_preset") + var sorted = []; + for(var key in itemsDict) { + sorted[sorted.length] = key; + } + + sorted.sort(); + for(var i = 0; i < sorted.length; i++) { + presetNamesList.append({text: itemsDict[sorted[i]], value: i}); + } + + // By agreement lets "Custom" option will have value 100 + presetNamesList.append({text: "Custom", value: visibilityPreset.customOptionValue}); + } + } + + currentIndex: + { + // Load previously selected preset. + var text = UM.Preferences.getValue("general/visible_settings_preset_choice"); + + + + var index = 0; + for(var i = 0; i < presetNamesList.count; ++i) + { + if(model.get(i).text == text) + { + index = i; + break; + } + } + return index; + } + + onActivated: + { + // TODO What to do if user is selected "Custom from Combobox" ? + if (model.get(index).text == "Custom") + return + + console.log("SETTING VALUE : " + model.get(index).text) + + var newVisibleSettings = CuraApplication.getVisibilitySettingPreset(model.get(index).text) + UM.Preferences.setValue("general/visible_settings", newVisibleSettings) + UM.Preferences.setValue("general/visible_settings_preset_choice", model.get(index).text) + } + } + ScrollView { id: scrollView @@ -162,7 +253,18 @@ UM.PreferencesPage { id: settingVisibilityItem; - UM.SettingVisibilityItem { } + UM.SettingVisibilityItem { + + // after changing any visibility of settings, set the preset to the "Custom" option + visibilityChangeCallback : function() + { + // If already "Custom" then don't do nothing + if (visibilityPreset.currentIndex != visibilityPreset.model.count - 1) + { + visibilityPreset.currentIndex = visibilityPreset.model.count - 1 + } + } + } } } -} +} \ No newline at end of file From a31d65786b0c8a0a62c1a3637db914d88bbcc6b4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 23 Jan 2018 11:24:43 +0100 Subject: [PATCH 402/551] Rename Enable Travel Optimization to Infill Travel Optimization Because it's now no longer in the Infill category this is unclear. --- 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 0451bd2539..60ede2c3b0 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5308,7 +5308,7 @@ }, "infill_enable_travel_optimization": { - "label": "Enable Travel Optimization", + "label": "Infill Travel Optimization", "description": "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased.", "type": "bool", "default_value": false, From 1efc92ddbe5136c2f3d39ffd766c664e9ffaf0f1 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 23 Jan 2018 11:46:59 +0100 Subject: [PATCH 403/551] CURA-4853 evaluate layer view compatibility mode in init, therefore not binding some signals and fixing the bug --- plugins/SimulationView/SimulationView.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index dfecda06bb..253ece315e 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -98,11 +98,14 @@ class SimulationView(View): self._solid_layers = int(Preferences.getInstance().getValue("view/top_layer_count")) self._only_show_top_layers = bool(Preferences.getInstance().getValue("view/only_show_top_layers")) - self._compatibility_mode = True # for safety + self._compatibility_mode = self._evaluateCompatibilityMode() self._wireprint_warning_message = Message(catalog.i18nc("@info:status", "Cura does not accurately display layers when Wire Printing is enabled"), title = catalog.i18nc("@info:title", "Simulation View")) + def _evaluateCompatibilityMode(self): + return OpenGLContext.isLegacyOpenGL() or bool(Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) + def _resetSettings(self): self._layer_view_type = 0 # 0 is material color, 1 is color by linetype, 2 is speed, 3 is layer thickness self._extruder_count = 0 @@ -127,7 +130,7 @@ class SimulationView(View): # Currently the RenderPass constructor requires a size > 0 # This should be fixed in RenderPass's constructor. self._layer_pass = SimulationPass(1, 1) - self._compatibility_mode = OpenGLContext.isLegacyOpenGL() or bool(Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) + self._compatibility_mode = self._evaluateCompatibilityMode() self._layer_pass.setSimulationView(self) return self._layer_pass @@ -534,8 +537,7 @@ class SimulationView(View): def _updateWithPreferences(self): self._solid_layers = int(Preferences.getInstance().getValue("view/top_layer_count")) self._only_show_top_layers = bool(Preferences.getInstance().getValue("view/only_show_top_layers")) - self._compatibility_mode = OpenGLContext.isLegacyOpenGL() or bool( - Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) + self._compatibility_mode = self._evaluateCompatibilityMode() self.setSimulationViewType(int(float(Preferences.getInstance().getValue("layerview/layer_view_type")))); From 7a84712fc9b6957e242168a5e75ad51c87c15f69 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 23 Jan 2018 12:13:26 +0100 Subject: [PATCH 404/551] CURA-4854 Revert some changes in 619a8cc that make that issue not working --- 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 3267bf486f..f1a4caea12 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -911,7 +911,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # We will first find the correct quality profile for the extruder, then apply the same # quality profile for the global stack. # - if has_extruder_stack_files and len(extruder_stacks) == 1: + if len(extruder_stacks) == 1: extruder_stack = extruder_stacks[0] search_criteria = {"type": "quality", "quality_type": global_stack.quality.getMetaDataEntry("quality_type")} From 3ec4cc6a0ba466df7d454084b51a0becbc3d7d32 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 23 Jan 2018 12:38:51 +0100 Subject: [PATCH 405/551] Revert "Rename Enable Travel Optimization to Infill Travel Optimization" This reverts commit a31d65786b0c8a0a62c1a3637db914d88bbcc6b4. --- 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 60ede2c3b0..0451bd2539 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5308,7 +5308,7 @@ }, "infill_enable_travel_optimization": { - "label": "Infill Travel Optimization", + "label": "Enable Travel Optimization", "description": "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased.", "type": "bool", "default_value": false, From d3e85e63709d43e8c989c396c8b8d42bc1cc3284 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 23 Jan 2018 12:38:59 +0100 Subject: [PATCH 406/551] Revert "Do boundary checks on nodes for which the boundary check is unknown" This reverts commit 27e441ecd9642530b5b8f8fe949cff152d54dcba. --- cura/BuildVolume.py | 84 +++++++++++++++++++++-------------------- cura/PlatformPhysics.py | 11 ++---- 2 files changed, 47 insertions(+), 48 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index f7e748ba4e..2567641cc9 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1,7 +1,8 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from cura.Settings.ExtruderManager import ExtruderManager +from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog from UM.Scene.Platform import Platform from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator @@ -193,51 +194,52 @@ class BuildVolume(SceneNode): return True - ## For every sliceable node, update node._outside_buildarea. - def updateAllBoundaryChecks(self): - self.updateNodeBoundaryCheck(Application.getInstance().getController().getScene().getRoot()) - - ## For a single node, update _outside_buildarea. + ## For every sliceable node, update node._outside_buildarea # - # If the node is a group node, the child nodes will also get updated. - # \param node The node to update the boundary checks of. - def updateNodeBoundaryCheck(self, node: SceneNode): - if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"): - for child in node.getChildren(): #Still update the children! For instance, the root is not sliceable. - self.updateNodeBoundaryCheck(child) - return #Don't compute for non-sliceable nodes. + def updateNodeBoundaryCheck(self): + root = Application.getInstance().getController().getScene().getRoot() + nodes = list(BreadthFirstIterator(root)) + group_nodes = [] - #Mark the node as outside the build volume if the bounding box test fails. - build_volume = self.getBoundingBox() - if build_volume is None: - #No bounding box. This is triggered when running Cura from command line with a model for the first time. - #In that situation there is a model, but no machine (and therefore no build volume). + build_volume_bounding_box = self.getBoundingBox() + if build_volume_bounding_box: + # It's over 9000! + build_volume_bounding_box = build_volume_bounding_box.set(bottom=-9001) + else: + # No bounding box. This is triggered when running Cura from command line with a model for the first time + # In that situation there is a model, but no machine (and therefore no build volume. return - build_volume = build_volume.set(bottom = -999999) #Allow models to clip the build plate. This should allow printing but remove the bottom side of the model underneath the build plate. - bounding_box = node.getBoundingBox() - if build_volume.intersectsBox(bounding_box) != AxisAlignedBox.IntersectionResult.FullIntersection: - node._outside_buildarea = True - else: - #Check for collisions between disallowed areas and the object. - convex_hull = node.callDecoration("getConvexHull") - if not convex_hull or not convex_hull.isValid(): - return - for area in self.getDisallowedAreas(): - overlap = convex_hull.intersectsPolygon(area) - if overlap is not None: - node._outside_buildarea = True - break - else: + for node in nodes: + # Need to check group nodes later + if node.callDecoration("isGroup"): + group_nodes.append(node) # Keep list of affected group_nodes + + if node.callDecoration("isSliceable") or node.callDecoration("isGroup"): node._outside_buildarea = False + bbox = node.getBoundingBox() - #Group nodes should override the _outside_buildarea property of their children. - if node.callDecoration("isGroup"): - for child in node.getAllChildren(): - child._outside_buildarea = node._outside_buildarea - else: - for child in node.getChildren(): - self.updateNodeBoundaryCheck(child) + # Mark the node as outside the build volume if the bounding box test fails. + if build_volume_bounding_box.intersectsBox(bbox) != AxisAlignedBox.IntersectionResult.FullIntersection: + node._outside_buildarea = True + continue + + convex_hull = node.callDecoration("getConvexHull") + if convex_hull: + if not convex_hull.isValid(): + return + # Check for collisions between disallowed areas and the object + for area in self.getDisallowedAreas(): + overlap = convex_hull.intersectsPolygon(area) + if overlap is None: + continue + node._outside_buildarea = True + continue + + # Group nodes should override the _outside_buildarea property of their children. + for group_node in group_nodes: + for child_node in group_node.getAllChildren(): + child_node._outside_buildarea = group_node._outside_buildarea ## Recalculates the build volume & disallowed areas. def rebuild(self): @@ -422,7 +424,7 @@ class BuildVolume(SceneNode): Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds - self.updateAllBoundaryChecks() + self.updateNodeBoundaryCheck() def getBoundingBox(self) -> AxisAlignedBox: return self._volume_aabb diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 05385d7c71..cf4dd83fef 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -56,17 +56,14 @@ class PlatformPhysics: # By shuffling the order of the nodes, this might happen a few times, but at some point it will resolve. nodes = list(BreadthFirstIterator(root)) + # Only check nodes inside build area. + nodes = [node for node in nodes if getattr(node, "_outside_buildarea", False)] + random.shuffle(nodes) for node in nodes: if node is root or not isinstance(node, SceneNode) or node.getBoundingBox() is None: continue - #Only check nodes inside the build area. - if not hasattr(node, "_outside_buildarea"): - self._build_volume.updateNodeBoundaryCheck(node) - if getattr(node, "_outside_buildarea", True): - continue - bbox = node.getBoundingBox() # Move it downwards if bottom is above platform @@ -158,7 +155,7 @@ class PlatformPhysics: # After moving, we have to evaluate the boundary checks for nodes build_volume = Application.getInstance().getBuildVolume() - build_volume.updateAllBoundaryChecks() + build_volume.updateNodeBoundaryCheck() def _onToolOperationStarted(self, tool): self._enabled = False From f45de9654b04544c3cb34dda37ea4a578de2772d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 23 Jan 2018 12:39:07 +0100 Subject: [PATCH 407/551] Revert "Remove unused import" This reverts commit cf556ccf8ff7116af0014ffc91c019b26cf4f364. --- cura/Scene/CuraSceneNode.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py index 597dfedf7a..9df2931f0b 100644 --- a/cura/Scene/CuraSceneNode.py +++ b/cura/Scene/CuraSceneNode.py @@ -1,7 +1,5 @@ -# Copyright (c) 2018 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - from UM.Application import Application +from UM.Logger import Logger from UM.Scene.SceneNode import SceneNode from copy import deepcopy From 710e3c162990e3c02958dfdb04ece18170bbcc89 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 23 Jan 2018 12:39:15 +0100 Subject: [PATCH 408/551] Revert "Simplify check for _outside_buildarea" This reverts commit 5c8d46b5c2ff27ff32bfc8e27451d3f8764accf8. --- cura/PlatformPhysics.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index cf4dd83fef..69890178e4 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import QTimer @@ -57,7 +57,7 @@ class PlatformPhysics: nodes = list(BreadthFirstIterator(root)) # Only check nodes inside build area. - nodes = [node for node in nodes if getattr(node, "_outside_buildarea", False)] + nodes = [node for node in nodes if (hasattr(node, "_outside_buildarea") and not node._outside_buildarea)] random.shuffle(nodes) for node in nodes: From 07e687519968378ebc443421a6b55f476ce72a58 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 23 Jan 2018 14:24:00 +0100 Subject: [PATCH 409/551] CURA-4848 added logging for when the crash occurs --- cura/Settings/GlobalStack.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index dae1c103b4..cc3a29aa8b 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -31,6 +31,7 @@ class GlobalStack(CuraContainerStack): # and if so, to bypass the resolve to prevent an infinite recursion that would occur # if the resolve function tried to access the same property it is a resolve for. self._resolving_settings = set() + self._resolving_settings2 = [] # For debugging CURA-4848, if it happens ## Get the list of extruders of this stack. # @@ -91,9 +92,17 @@ class GlobalStack(CuraContainerStack): # Handle the "resolve" property. if self._shouldResolve(key, property_name, context): + self._resolving_settings2.append(key) self._resolving_settings.add(key) resolve = super().getProperty(key, "resolve", context) + if key not in self._resolving_settings: + Logger.log("e", "Key [%s] should really have been in set(%s) and [%s]. Now I'm gonna crash", key, str(self._resolving_settings), str(self._resolving_settings2)) + Logger.log("d", "------ context ------") + for stack in context.stack_of_containers: + Logger.log("d", "Context: %s", stack.getId()) + Logger.log("d", "------ context end ------") self._resolving_settings.remove(key) + self._resolving_settings2.pop() if resolve is not None: return resolve From cde3799702a7176f4f631e9dec18a5ef9f46edef Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 23 Jan 2018 14:46:44 +0100 Subject: [PATCH 410/551] CURA-4848 removing the debugging list because it's not a threading issue --- cura/Settings/GlobalStack.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index cc3a29aa8b..7873f12355 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -31,7 +31,6 @@ class GlobalStack(CuraContainerStack): # and if so, to bypass the resolve to prevent an infinite recursion that would occur # if the resolve function tried to access the same property it is a resolve for. self._resolving_settings = set() - self._resolving_settings2 = [] # For debugging CURA-4848, if it happens ## Get the list of extruders of this stack. # @@ -92,17 +91,16 @@ class GlobalStack(CuraContainerStack): # Handle the "resolve" property. if self._shouldResolve(key, property_name, context): - self._resolving_settings2.append(key) self._resolving_settings.add(key) resolve = super().getProperty(key, "resolve", context) if key not in self._resolving_settings: - Logger.log("e", "Key [%s] should really have been in set(%s) and [%s]. Now I'm gonna crash", key, str(self._resolving_settings), str(self._resolving_settings2)) + # For debugging CURA-4848, if it happens + Logger.log("e", "Key [%s] should really have been in set(%s). Now I'm gonna crash", key, str(self._resolving_settings)) Logger.log("d", "------ context ------") for stack in context.stack_of_containers: Logger.log("d", "Context: %s", stack.getId()) Logger.log("d", "------ context end ------") self._resolving_settings.remove(key) - self._resolving_settings2.pop() if resolve is not None: return resolve From f88df7e5cd9d4238db31900160e12c5e04c79c69 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 23 Jan 2018 15:45:12 +0100 Subject: [PATCH 411/551] Remove overzealous log entry This was in the happy path and gets executed for every material profile in every material file, which is hundreds of times. Better not. Found during development of CURA-4797. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 8767377db0..18b043806c 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -541,7 +541,6 @@ class XmlMaterialProfile(InstanceContainer): Logger.log("w", "No definition found for machine ID %s", machine_id) continue - Logger.log("d", "Found definition for machine ID %s", machine_id) definition = definitions[0] machine_manufacturer = identifier.get("manufacturer", definition.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. From def86defe65ecc0b7de710a60715e04fd7700961 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 23 Jan 2018 16:17:38 +0100 Subject: [PATCH 412/551] CURA-4848 Global stack now does its infinite resolve prevention on per thread basis --- cura/Settings/GlobalStack.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 7873f12355..6d18bf615b 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -1,6 +1,8 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from collections import defaultdict +import threading from typing import Any, Dict, Optional from PyQt5.QtCore import pyqtProperty @@ -30,7 +32,8 @@ class GlobalStack(CuraContainerStack): # This property is used to track which settings we are calculating the "resolve" for # and if so, to bypass the resolve to prevent an infinite recursion that would occur # if the resolve function tried to access the same property it is a resolve for. - self._resolving_settings = set() + # Per thread we have our own resolving_settings, or strange things sometimes occur. + self._resolving_settings = defaultdict(set) # keys are thread names ## Get the list of extruders of this stack. # @@ -91,16 +94,10 @@ class GlobalStack(CuraContainerStack): # Handle the "resolve" property. if self._shouldResolve(key, property_name, context): - self._resolving_settings.add(key) + current_thread = threading.current_thread() + self._resolving_settings[current_thread.name].add(key) resolve = super().getProperty(key, "resolve", context) - if key not in self._resolving_settings: - # For debugging CURA-4848, if it happens - Logger.log("e", "Key [%s] should really have been in set(%s). Now I'm gonna crash", key, str(self._resolving_settings)) - Logger.log("d", "------ context ------") - for stack in context.stack_of_containers: - Logger.log("d", "Context: %s", stack.getId()) - Logger.log("d", "------ context end ------") - self._resolving_settings.remove(key) + self._resolving_settings[current_thread.name].remove(key) if resolve is not None: return resolve @@ -152,7 +149,8 @@ class GlobalStack(CuraContainerStack): # Do not try to resolve anything but the "value" property return False - if key in self._resolving_settings: + current_thread = threading.current_thread() + if key in self._resolving_settings[current_thread.name]: # To prevent infinite recursion, if getProperty is called with the same key as # we are already trying to resolve, we should not try to resolve again. Since # this can happen multiple times when trying to resolve a value, we need to From dcb1ac5deb1a58ae68a135c092e258439872469e Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Tue, 23 Jan 2018 16:20:19 +0100 Subject: [PATCH 413/551] Plugin browswer updates - Partial refactor - Preparation for merge with plugins in preferences --- plugins/PluginBrowser/PluginBrowser.py | 120 +++++++++++++++++----- plugins/PluginBrowser/PluginBrowser.qml | 130 ++++++++++++++++++++---- 2 files changed, 205 insertions(+), 45 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index d9464dd67b..e1862dc06e 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -1,17 +1,20 @@ # Copyright (c) 2017 Ultimaker B.V. # PluginBrowser is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal, pyqtSlot +from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply + +from UM.Application import Application +from UM.Qt.ListModel import ListModel +from UM.Logger import Logger +from UM.PluginRegistry import PluginRegistry +from UM.Qt.Bindings.PluginsModel import PluginsModel 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 UM.Application import Application + from UM.Version import Version from UM.Message import Message -from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply -from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal, pyqtSlot - import json import os import tempfile @@ -21,6 +24,39 @@ import shutil i18n_catalog = i18nCatalog("cura") +# Architecture thoughts: +# ------------------------------------------------------------------------------ +# The plugin manager has 2 parts: the browser and the installer. +# +# UNINSTALLING: +# ------------------------------------------------------------------------------ +# Uninstalling is done via the PluginRegistry's uninstallPlugin() method, +# supplied with a plugin_id. Uninstalling is currently done instantly so there's +# no need to use an list of "newly uninstalled plugins" but this will be needed +# in the future with more complex plugins, as well as when merging the built-in +# plugins into the plugin browser. +# +# STATUS: +# ------------------------------------------------------------------------------ +# 'status' is used to keep track of installations and uninstallations. It is +# intended to replace "newly installed" and "newly uninstalled" lists. These +# lists introduce a lot of complexity if a plugin finds itself on both lists. +# +# 'status' can have several values: +# - "uninstalled" +# - "will_install" +# - "installed" +# - "will_uninstall" +# +# This is more civilized than checking if a plugin's metadata exists. It also +# means uninstalling doesn't require erasing the metadata. +# +# ACTIVE: +# ------------------------------------------------------------------------------ +# Although 'active' could have been lumped with 'status', it is essentially a +# sub-status within 'installed' and 'will_uninstall'. Rather than create more +# statuses such as 'active_installed' and 'active_will_uninstall', the 'active' +# property is just a boolean used in conjunction with 'status'. class PluginBrowser(QObject, Extension): def __init__(self, parent=None): @@ -35,11 +71,13 @@ class PluginBrowser(QObject, Extension): self._download_plugin_reply = None self._network_manager = None + self._plugin_registry = Application.getInstance().getPluginRegistry() self._plugins_metadata = [] self._plugins_model = None self._dialog = None + self._restartDialog = None self._download_progress = 0 self._is_downloading = False @@ -53,16 +91,27 @@ class PluginBrowser(QObject, Extension): ) ] - # 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. + # 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. + + # NOTE: This will be depreciated in favor of the 'status' system. self._newly_installed_plugin_ids = [] + self._newly_uninstalled_plugin_ids = [] + + self._plugin_statuses = {} # type: Dict[str, str] # variables for the license agreement dialog self._license_dialog_plugin_name = "" self._license_dialog_license_content = "" self._license_dialog_plugin_file_location = "" + self._restart_dialog_message = "" showLicenseDialog = pyqtSignal() + showRestartDialog = pyqtSignal() + pluginsMetadataChanged = pyqtSignal() + onDownloadProgressChanged = pyqtSignal() + onIsDownloadingChanged = pyqtSignal() @pyqtSlot(result = str) def getLicenseDialogPluginName(self): @@ -76,15 +125,19 @@ class PluginBrowser(QObject, Extension): def getLicenseDialogLicenseContent(self): return self._license_dialog_license_content + @pyqtSlot(result = str) + def getRestartDialogMessage(self): + return self._restart_dialog_message + def openLicenseDialog(self, plugin_name, license_content, plugin_file_location): self._license_dialog_plugin_name = plugin_name self._license_dialog_license_content = license_content self._license_dialog_plugin_file_location = plugin_file_location self.showLicenseDialog.emit() - pluginsMetadataChanged = pyqtSignal() - onDownloadProgressChanged = pyqtSignal() - onIsDownloadingChanged = pyqtSignal() + def openRestartDialog(self, message): + self._restart_dialog_message = message + self.showRestartDialog.emit() @pyqtProperty(bool, notify = onIsDownloadingChanged) def isDownloading(self): @@ -191,12 +244,14 @@ class PluginBrowser(QObject, Extension): self._newly_installed_plugin_ids.append(result["id"]) self.pluginsMetadataChanged.emit() - Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Plugin browser"), result["message"]) + self.openRestartDialog(result["message"]) + # Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Plugin browser"), result["message"]) @pyqtSlot(str) def removePlugin(self, plugin_id): result = PluginRegistry.getInstance().uninstallPlugin(plugin_id) + self._newly_uninstalled_plugin_ids.append(result["id"]) self.pluginsMetadataChanged.emit() Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Plugin browser"), result["message"]) @@ -233,19 +288,12 @@ class PluginBrowser(QObject, Extension): self.setIsDownloading(False) @pyqtProperty(QObject, notify=pluginsMetadataChanged) + def pluginsModel(self): + self._plugins_model = PluginsModel() + """ 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, "id") - self._plugins_model.addRoleName(Qt.UserRole + 3, "version") - self._plugins_model.addRoleName(Qt.UserRole + 4, "short_description") - self._plugins_model.addRoleName(Qt.UserRole + 5, "author") - self._plugins_model.addRoleName(Qt.UserRole + 6, "author_email") - self._plugins_model.addRoleName(Qt.UserRole + 7, "already_installed") - self._plugins_model.addRoleName(Qt.UserRole + 8, "file_location") - self._plugins_model.addRoleName(Qt.UserRole + 9, "enabled") - self._plugins_model.addRoleName(Qt.UserRole + 10, "can_upgrade") + self._plugins_model = PluginsModel() else: self._plugins_model.clear() items = [] @@ -257,16 +305,19 @@ class PluginBrowser(QObject, Extension): "short_description": metadata["short_description"], "author": metadata["author"], "author_email": "author@gmail.com", + "status": self._checkInstallStatus(metadata["id"]), "already_installed": self._checkAlreadyInstalled(metadata["id"]), "file_location": metadata["file_location"], - # "enabled": self._checkEnabled(metadata["id"]), + # "active": self._checkActive(metadata["id"]), "enabled": True, "can_upgrade": self._checkCanUpgrade(metadata["id"], metadata["version"]) }) self._plugins_model.setItems(items) + """ return self._plugins_model def _checkCanUpgrade(self, id, version): + plugin_registry = Application.getInstance().getPluginRegistry() plugin_registry = PluginRegistry.getInstance() metadata = plugin_registry.getMetaData(id) if metadata != {}: @@ -281,13 +332,26 @@ class PluginBrowser(QObject, Extension): def _checkAlreadyInstalled(self, id): plugin_registry = PluginRegistry.getInstance() metadata = plugin_registry.getMetaData(id) - if metadata != {}: + # We already installed this plugin, but the registry just doesn't know it yet. + if id in self._newly_installed_plugin_ids: + return True + # We already uninstalled this plugin, but the registry just doesn't know it yet: + elif id in self._newly_uninstalled_plugin_ids: + return False + elif 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 _checkInstallStatus(self, plugin_id): + plugin_registry = PluginRegistry.getInstance() + + # If plugin is registered, it's installed: + if plugin_id in plugin_registry._plugins: + return "installed" + else: + return "uninstalled" + def _checkEnabled(self, id): plugin_registry = PluginRegistry.getInstance() metadata = plugin_registry.getMetaData(id) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 728f3139f7..1a606e114b 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -1,4 +1,6 @@ -import UM 1.1 as UM +// Copyright (c) 2017 Ultimaker B.V. +// PluginBrowser is released under the terms of the LGPLv3 or higher. + import QtQuick 2.2 import QtQuick.Dialogs 1.1 import QtQuick.Window 2.2 @@ -7,18 +9,34 @@ import QtQuick.Controls.Styles 1.4 // TODO: Switch to QtQuick.Controls 2.x and remove QtQuick.Controls.Styles +import UM 1.1 as UM + UM.Dialog { id: base title: catalog.i18nc("@title:tab", "Plugins"); width: 800 * screenScaleFactor - height: 600 * screenScaleFactor + height: 640 * screenScaleFactor minimumWidth: 350 * screenScaleFactor minimumHeight: 350 * screenScaleFactor - Item { - anchors.fill: parent + Column { + // anchors.fill: parent + height: parent.height + width: parent.width + spacing: UM.Theme.getSize("default_margin").height + Rectangle { + id: topBar + width: parent.width + color: "red" + height: 30 + Text { + text: "Search" + } + } + + /* Item { id: topBar height: childrenRect.height; @@ -39,15 +57,24 @@ UM.Dialog { enabled: !manager.isDownloading } } + */ // Scroll view breaks in QtQuick.Controls 2.x + Label { + text: "Installed Plugins" + } ScrollView { + id: installedPluginList width: parent.width + height: 280 + /* anchors.top: topBar.bottom - anchors.bottom: bottomBar.top + anchors.bottom: availiblePluginList.top anchors.bottomMargin: UM.Theme.getSize("default_margin").height + */ frameVisible: true + ListView { id: pluginList model: manager.pluginsModel @@ -56,13 +83,45 @@ UM.Dialog { delegate: pluginDelegate } } + Label { + text: "Availible plugins..." + } + /* + Rectangle { + width: parent.width + color: "red" + height: 200 + Text { + text: "Plugins not installed yet" + } + } + */ - Item { + // Scroll view breaks in QtQuick.Controls 2.x + ScrollView { + id: availiblePluginList + width: parent.width + /* + anchors.top: installedPluginList.bottom + anchors.bottom: bottomBar.top + anchors.bottomMargin: UM.Theme.getSize("default_margin").height + */ + frameVisible: true + height: 180 + + Rectangle { + width: parent.width + color: "red" + height: 1000 + } + } + + Rectangle { id: bottomBar width: parent.width - height: closeButton.height - anchors.bottom: parent.bottom - anchors.left: parent.left + height: childrenRect.height; + // anchors.bottom: parent.bottom + // anchors.left: parent.left Button { id: closeButton @@ -79,7 +138,7 @@ UM.Dialog { } } - Item { + Rectangle { Component { id: pluginDelegate @@ -109,7 +168,8 @@ UM.Dialog { pixelSize: 13 bold: true } - color: model.enabled ? UM.Theme.getColor("text") : UM.Theme.getColor("secondary") + // color: model.enabled ? UM.Theme.getColor("text") : UM.Theme.getColor("secondary") + color: UM.Theme.getColor("text") } Label { @@ -367,11 +427,9 @@ UM.Dialog { } UM.I18nCatalog { id: catalog; name: "cura" } - Connections - { + Connections { target: manager - onShowLicenseDialog: - { + onShowLicenseDialog: { licenseDialog.pluginName = manager.getLicenseDialogPluginName(); licenseDialog.licenseContent = manager.getLicenseDialogLicenseContent(); licenseDialog.pluginFileLocation = manager.getLicenseDialogPluginFileLocation(); @@ -379,8 +437,7 @@ UM.Dialog { } } - UM.Dialog - { + UM.Dialog { id: licenseDialog title: catalog.i18nc("@title:window", "Plugin License Agreement") @@ -444,5 +501,44 @@ UM.Dialog { } ] } + + Connections { + target: manager + onShowRestartDialog: { + restartDialog.message = manager.getRestartDialogMessage(); + restartDialog.show(); + } + } + + UM.Dialog { + id: restartDialog + // title: catalog.i18nc("@title:tab", "Plugins"); + width: 360 * screenScaleFactor + height: 180 * screenScaleFactor + minimumWidth: 360 * screenScaleFactor + minimumHeight: 180 * screenScaleFactor + property var message; + + Text { + id: message + text: restartDialog.message != null ? restartDialog.message : "" + } + Button { + id: laterButton + text: "Later" + onClicked: restartDialog.close(); + anchors.left: parent.left + anchors.bottom: parent.bottom + } + + Button { + id: restartButton + text: "Restart now" + onClicked: restartDialog.close(); + anchors.right: parent.right + anchors.bottom: parent.bottom + } + } + } } From a6f5f8ea6860433a427f4e4dfd8e8b25335f8e9a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 23 Jan 2018 20:37:24 +0100 Subject: [PATCH 414/551] Revert "Revert "Rename Enable Travel Optimization to Infill Travel Optimization"" This reverts commit 3ec4cc6a0ba466df7d454084b51a0becbc3d7d32. --- 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 0451bd2539..60ede2c3b0 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5308,7 +5308,7 @@ }, "infill_enable_travel_optimization": { - "label": "Enable Travel Optimization", + "label": "Infill Travel Optimization", "description": "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased.", "type": "bool", "default_value": false, From 9488c39f6854f880340b7cfa4cdb2875c63604e9 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 24 Jan 2018 11:07:13 +0100 Subject: [PATCH 415/551] Update plugin browser version as we have breaking changes in Cura 3.2 --- plugins/PluginBrowser/PluginBrowser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 35b88b3465..5c5c5ba4ea 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -25,7 +25,7 @@ class PluginBrowser(QObject, Extension): def __init__(self, parent=None): super().__init__(parent) - self._api_version = 2 + self._api_version = 3 self._api_url = "http://software.ultimaker.com/cura/v%s/" % self._api_version self._plugin_list_request = None From c47199104467ea4acc17c04f9d4abff4363f1ad6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 24 Jan 2018 13:30:08 +0100 Subject: [PATCH 416/551] Update plugin browser version to 4 as network rewrite has another set of breaking changes --- plugins/PluginBrowser/PluginBrowser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 5c5c5ba4ea..13fa553779 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -25,7 +25,7 @@ class PluginBrowser(QObject, Extension): def __init__(self, parent=None): super().__init__(parent) - self._api_version = 3 + self._api_version = 4 self._api_url = "http://software.ultimaker.com/cura/v%s/" % self._api_version self._plugin_list_request = None From 5b90bb3c5aea34303b638deff664007c32a82d6a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 24 Jan 2018 11:03:12 +0100 Subject: [PATCH 417/551] =?UTF-8?q?Update=20Portuguese=20translations=20by?= =?UTF-8?q?=20Ut=C3=B3pica3D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These people did a pass on the Portuguese translations and made a lot of improvements. Contributes to issue CURA-4692. --- resources/i18n/pt_PT/cura.po | 1304 ++++---- resources/i18n/pt_PT/fdmextruder.def.json.po | 102 +- resources/i18n/pt_PT/fdmprinter.def.json.po | 2946 +++++++----------- 3 files changed, 1864 insertions(+), 2488 deletions(-) diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po index 6fbc8664a9..7f22bcacd8 100644 --- a/resources/i18n/pt_PT/cura.po +++ b/resources/i18n/pt_PT/cura.po @@ -2,31 +2,31 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# -#, fuzzy +# msgid "" msgstr "" "Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-12-07 13:41+0100\n" -"Last-Translator: Bothof \n" +"PO-Revision-Date: 2018-01-23 19:41+0000\n" +"Last-Translator: Paulo Miranda \n" "Language-Team: Bothof\n" "Language: pt_PT\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.5\n" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" -msgstr "Definições da máquina" +msgstr "Definições da Máquina" #: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:12 msgctxt "@item:inlistbox" msgid "X-Ray view" -msgstr "Visualização de raio X" +msgstr "Vista Raio-X" #: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:13 msgctxt "@item:inlistbox" @@ -41,12 +41,12 @@ msgstr "Ficheiro GCode" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:65 msgctxt "@action:button" msgid "Print with Doodle3D WiFi-Box" -msgstr "Imprimir com Wi-Fi box Doodle3D" +msgstr "Imprimir com a Doodle3D WiFi-Box" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:66 msgctxt "@properties:tooltip" msgid "Print with Doodle3D WiFi-Box" -msgstr "Imprimir com Wi-Fi box Doodle3D" +msgstr "Imprimir com a Doodle3D WiFi-Box" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:86 msgctxt "@info:status" @@ -78,12 +78,12 @@ msgstr "A enviar dados para o Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:161 msgctxt "@info:status" msgid "Unable to send data to Doodle3D Connect. Is another job still active?" -msgstr "Não é possível enviar dados para o Doodle3D Connect. Existe outra tarefa ativa?" +msgstr "Não é possível enviar dados para o Doodle3D Connect. Será que há outro trabalho ainda ativo?" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:175 msgctxt "@info:status" msgid "Storing data on Doodle3D Connect" -msgstr "A armazenar dados no Doodle3D Connect" +msgstr "A guardar dados no Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:213 msgctxt "@info:status" @@ -98,70 +98,78 @@ msgstr "Abrir Connect..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" -msgstr "Abrir a interface Web do Doodle3D Connect" +msgstr "Abrir a interface web do Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" -msgstr "Mostrar registo de alterações" +msgstr "Mostrar Lista das Alterações de cada Versão" +# rever! +# flatten -ver contexto! +# nivelar? #: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:20 msgctxt "@item:inmenu" msgid "Flatten active settings" -msgstr "Definições ativas de aplanamento" +msgstr "Nivelar Definições Ativas" #: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:32 msgctxt "@info:status" msgid "Profile has been flattened & activated." -msgstr "O perfil foi aplanado e ativado." +msgstr "O perfil foi nivelado & ativado." #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 msgctxt "@item:inmenu" msgid "USB printing" -msgstr "Impressão através de USB" +msgstr "Impressão USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" -msgstr "Imprimir através de USB" +msgstr "Imprimir por USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@info:tooltip" msgid "Print via USB" -msgstr "Imprimir através de USB" +msgstr "Imprimir por USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 msgctxt "@info:status" msgid "Connected via USB" -msgstr "Ligado através de USB" +msgstr "Ligado via USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." -msgstr "Não é possível iniciar uma nova tarefa porque a impressora está ocupada ou não está ligada." +msgstr "Não é possível iniciar um novo trabalho de impressão porque a impressora está ocupada ou não está ligada." #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "Impressora indisponível" +msgstr "Impressora Indisponível" +# rever! +# flavor +# variante? +# ou só "utilza o UltiGCode" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" -msgid "" -"This printer does not support USB printing because it uses UltiGCode flavor." -msgstr "Esta impressora não suporta impressão através de USB porque utiliza o padrão UltiGCode." +msgid "This printer does not support USB printing because it uses UltiGCode flavor." +msgstr "Esta impressora não suporta impressão por USB porque utiliza a variante UltiGCode." #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" -msgstr "Impressão através de USB" +msgstr "Impressão por USB" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" -msgid "" -"Unable to start a new job because the printer does not support usb printing." -msgstr "Não é possível iniciar uma nova tarefa porque a impressora não suporta impressão através de USB." +msgid "Unable to start a new job because the printer does not support usb printing." +msgstr "Não é possível iniciar um novo trabalho porque a impressora não suporta impressão por USB." +# rever! +# contexto! +# Atenção? #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 @@ -187,29 +195,32 @@ msgstr "Não foi possível encontrar o firmware necessário para a impressora em #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 msgctxt "@info:title" msgid "Printer Firmware" -msgstr "Firmware da impressora" +msgstr "Firmware da Impressora" +# rever! +# unidade amovível +# disco amovível #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" -msgstr "Guardar em unidade amovível" +msgstr "Guardar no Disco Externo" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 #, python-brace-format msgctxt "@item:inlistbox" msgid "Save to Removable Drive {0}" -msgstr "Guardar em unidade amovível {0}" +msgstr "Guardar no Disco Externo {0}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 #, python-brace-format msgctxt "@info:progress Don't translate the XML tags !" msgid "Saving to Removable Drive {0}" -msgstr "A guardar em unidade amovível {0}" +msgstr "A Guardar no Disco Externo {0}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 msgctxt "@info:title" msgid "Saving" -msgstr "A guardar" +msgstr "A Guardar" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:102 @@ -222,14 +233,14 @@ msgstr "Não foi possível guardar em {0}: {1}{file_name} para o grupo {cluster_name}" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 msgctxt "@action" msgid "Connect via Network" -msgstr "Ligar através de rede" +msgstr "Ligar Através da Rede" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format -msgctxt "" -"@info Don't translate {machine_name}, since it gets replaced by a printer " -"name!" -msgid "" -"New features are available for your {machine_name}! It is recommended to " -"update the firmware on your printer." -msgstr "Estão disponíveis novas funcionalidades para a sua {machine_name}! É recomendado atualizar o firmware na sua impressora." +msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "Estão disponíveis novas funcionalidades para a impressora {machine_name}! É recomendado atualizar o firmware da impressora." #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" -msgstr "Novo firmware %s disponível" +msgstr "Novo firmware para %s está disponível" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" @@ -643,23 +656,26 @@ msgctxt "@info" msgid "Could not access update information." msgstr "Não foi possível aceder às informações de atualização." +# rever! +# versão PT do solidworks? #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 msgctxt "@info:status" -msgid "" -"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!" -msgstr "Foram apresentados erros ao abrir o seu ficheiro SolidWorks! Verifique se é possível abrir o ficheiro no SolidWorks sem quaisquer problemas!" +msgid "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!" +msgstr "Foram encontrados erros ao abrir o seu ficheiro SolidWorks! Verifique se é possível abrir o ficheiro, sem quaisquer problemas, no SolidWorks!" +# rever! +# versão PT do solidworks? #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 msgctxt "@item:inlistbox" msgid "SolidWorks part file" -msgstr "Ficheiro de peça SolidWorks" +msgstr "Ficheiro SolidWorks Peça" +# rever! +# versão PT do solidworks? #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" -msgstr "Ficheiro de montagem SolidWorks" +msgstr "Ficheiro SolidWorks de montagem" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 msgid "Configure" @@ -674,17 +690,19 @@ msgstr "Erro ao iniciar %s!" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "Visualização de simulação" +msgstr "Ver Camadas" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "O Cura não apresenta as camadas de forma precisa quando a Impressão de fios está ativada" +msgstr "Quando a opção \"Wire Printing\" está activa, o Cura não permite visualizar as camadas de uma forma precisa" +# rever! +# ver contexto #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "Visualização de simulação" +msgstr "Visualização por Camadas" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -692,16 +710,19 @@ msgstr "Modificar G-Code" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "" -"Cura collects anonymised slicing statistics. You can disable this in the " -"preferences." -msgstr "O Cura recolhe estatísticas de segmentação anónimas. É possível desativar esta opção nas preferências." +msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +msgstr "O Cura recolhe, de forma anónima, estatística das opções de seccionamento usadas. Se desejar pode desactivar esta opção nas preferências." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" msgid "Collecting Data" -msgstr "A recolher dados" +msgstr "A Recolher Dados" +# rever! +# contexto! +# pode ser _fechar_ +# dispensar +# ignorar #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Dismiss" @@ -745,10 +766,8 @@ msgstr "Imagem GIF" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 msgctxt "@info:status" -msgid "" -"Unable to slice with the current material as it is incompatible with the " -"selected machine or configuration." -msgstr "Não é possível segmentar com o material atual, uma vez que é incompatível com a máquina ou configuração selecionada." +msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." +msgstr "Não é possível seccionar com o material atual, uma vez que é incompatível com a impressora ou configuração selecionada." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 @@ -757,42 +776,41 @@ msgstr "Não é possível segmentar com o material atual, uma vez que é incompa #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" -msgstr "Não é possível segmentar" +msgstr "Não é possível Seccionar" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 #, python-brace-format msgctxt "@info:status" -msgid "" -"Unable to slice with the current settings. The following settings have " -"errors: {0}" -msgstr "Não é possível segmentar com as definições atuais. As seguintes definições apresentam erros: {0}" +msgid "Unable to slice with the current settings. The following settings have errors: {0}" +msgstr "Não é possível seccionar com as definições atuais. As seguintes definições apresentam erros: {0}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 #, python-brace-format msgctxt "@info:status" -msgid "" -"Unable to slice due to some per-model settings. The following settings have " -"errors on one or more models: {error_labels}" -msgstr "Não é possível segmentar devido a algumas definições por modelo. As seguintes definições apresentam erros num ou mais modelos: {error_labels}" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "Não é possível seccionar devido a algumas definições por modelo. As seguintes definições apresentam erros num ou mais modelos: {error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" -msgid "" -"Unable to slice because the prime tower or prime position(s) are invalid." -msgstr "Não é possível segmentar porque a torre ou a(s) posição(ões) de preparação é(são) inválidas." +msgid "Unable to slice because the prime tower or prime position(s) are invalid." +msgstr "Não é possível seccionar porque a torre de preparação ou a(s) posição(ões) de preparação é(são) inválidas." +# rever! +# models fit the +# dentro do? +# contido pelo +# se adapta? +# cabem no...? #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" -msgid "" -"Nothing to slice because none of the models fit the build volume. Please " -"scale or rotate models to fit." -msgstr "Sem conteúdo para segmentar porque nenhum dos modelos se adapta ao volume de construção. Dimensione ou rode os modelos para os adaptar." +msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." +msgstr "Sem conteúdo para seccionar porque nenhum dos modelos está dentro do volume de construção. Por favor redimensione, mova ou rode os modelos para os adaptar ao volume de construção." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" -msgstr "A processar camadas" +msgstr "A Processar Camadas" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" @@ -802,22 +820,20 @@ msgstr "Informações" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:14 msgctxt "@label" msgid "Per Model Settings" -msgstr "Definições por modelo" +msgstr "Definições Por-Modelo" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:15 msgctxt "@info:tooltip" msgid "Configure Per Model Settings" -msgstr "Configurar definições por modelo" +msgstr "Configurar definições individuais Por-Modelo" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" msgstr "Instalar" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 -msgid "" -"Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It " -"is not set to a directory." -msgstr "Falha ao copiar os ficheiros de plug-in Siemens NX. Verifique o seu UGII_USER_DIR. Não está atribuído a um diretório." +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "Falha ao copiar os ficheiros do plug-in Siemens NX. Verifique o seu UGII_USER_DIR. Não está atribuído a um diretório." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 @@ -826,14 +842,11 @@ msgid "Successfully installed Siemens NX Cura plugin." msgstr "Plug-in Siemens NX Cura instalado com sucesso." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 -msgid "" -"Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "Falha ao copiar os ficheiros de plug-in Siemens NX. Verifique o seu UGII_USER_DIR." +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "Falha ao copiar os ficheiros do plug-in Siemens NX. Verifique o seu UGII_USER_DIR." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 -msgid "" -"Failed to install Siemens NX plugin. Could not set environment variable " -"UGII_USER_DIR for Siemens NX." +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Falha ao instalar o plug-in Siemens NX. Não foi possível definir a variável do ambiente UGII_USER_DIR para o Siemens NX." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 @@ -858,18 +871,18 @@ msgstr "Ficheiro 3MF" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" -msgstr "Bocal" +msgstr "Nozzle" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" -msgstr "Falha ao obter ID de plug-in de {0}" +msgstr "Falha ao obter ID do plug-in de {0}" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" -msgstr "Aviso" +msgstr "Atenção" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" @@ -879,7 +892,7 @@ msgstr "Browser de plug-ins" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" msgid "Solid view" -msgstr "Visualização sólida" +msgstr "Vista Sólidos" #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:18 msgctxt "@item:inlistbox" @@ -899,10 +912,8 @@ msgstr "Detalhes do G-code" #: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 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 "Certifique-se de que o g-code é apropriado para a sua impressora e respetiva configuração antes de enviar o ficheiro. A representação do g-code poderá ser imprecisa." +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 "Certifique-se de que o g-code é apropriado para a sua impressora e a respetiva configuração antes de enviar o ficheiro. A visualização do g-code poderá não ser correcta." #: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14 @@ -918,7 +929,7 @@ msgstr "Ficheiro 3MF" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:38 msgctxt "@item:inlistbox" msgid "Cura Project 3MF file" -msgstr "Ficheiro 3MF de projeto Cura" +msgstr "Ficheiro 3MF de Projeto Cura" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:20 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 @@ -934,22 +945,22 @@ msgstr "Atualizar firmware" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14 msgctxt "@action" msgid "Checkup" -msgstr "Exame" +msgstr "Checkup" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:15 msgctxt "@action" msgid "Level build plate" -msgstr "Nivelar placa de construção" +msgstr "Nivelar base de construção" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" -msgstr "Parede externa" +msgstr "Parede Exterior" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" -msgstr "Paredes internas" +msgstr "Paredes Interiores" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" @@ -959,22 +970,22 @@ msgstr "Revestimento" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" -msgstr "Preenchimento" +msgstr "Enchimento" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" -msgstr "Preenchimento de suporte" +msgstr "Enchimento dos Suportes" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" -msgstr "Interface de suporte" +msgstr "Interface dos Suportes" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" -msgstr "Suporte" +msgstr "Suportes" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" @@ -1005,12 +1016,12 @@ msgstr "Desconhecido" #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" -msgstr "Ficheiro pré-segmentado {0}" +msgstr "Ficheiro pré-seccionado {0}" #: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" -msgstr "Nenhum material carregado" +msgstr "Nenhum material inserido" #: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" @@ -1020,37 +1031,36 @@ msgstr "Material desconhecido" #: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 msgctxt "@info:status" msgid "Finding new location for objects" -msgstr "A procurar nova localização para objetos" +msgstr "A procurar nova posição para os objetos" #: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 msgctxt "@info:title" msgid "Finding Location" -msgstr "A procurar localização" +msgstr "A Procurar Posição" #: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 #: /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 "Não é possível encontrar uma localização no volume de construção para todos os objetos" +msgstr "Não é possível posicionar todos os objetos dentro do volume de construção" +# rever! #: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 msgctxt "@info:title" msgid "Can't Find Location" -msgstr "Não é possível encontrar localização" +msgstr "Não é Possível Posicionar" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" -msgstr "O ficheiro já existe" +msgstr "O Ficheiro Já Existe" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" -msgid "" -"The file {0} already exists. Are you sure you want to " -"overwrite it?" +msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "O ficheiro {0} já existe. Tem a certeza de que deseja substituí-lo?" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 @@ -1061,24 +1071,25 @@ msgstr "Personalizado" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 msgctxt "@label" msgid "Custom Material" -msgstr "Material personalizado" +msgstr "Material Personalizado" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" msgstr "Global" +# rever! +# Não substituído? +# Sem alterar? #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "Não substituído" +msgstr "Manter" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" -msgid "" -"The selected material is incompatible with the selected machine or " -"configuration." -msgstr "O material selecionado é incompatível com a máquina ou configuração selecionada." +msgid "The selected material is incompatible with the selected machine or configuration." +msgstr "O material selecionado é incompatível com a máquina ou a configuração selecionada." #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 @@ -1088,35 +1099,30 @@ msgstr "Material incompatível" #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:status Has a cancel button next to it." -msgid "" -"The selected material diameter causes the material to become incompatible " -"with the current printer." +msgid "The selected material diameter causes the material to become incompatible with the current printer." msgstr "O diâmetro do material selecionado faz com que o material se torne incompatível com a impressora atual." #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 msgctxt "@action:button" msgid "Undo" -msgstr "Anular" +msgstr "Desfazer" #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 msgctxt "@action" msgid "Undo changing the material diameter." -msgstr "Anular alteração do diâmetro do material." +msgstr "Desfazer a alteração do diâmetro do material." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" -msgid "" -"Failed to export profile to {0}: {1}" +msgid "Failed to export profile to {0}: {1}" msgstr "Falha ao exportar perfil para {0}: {1}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" -msgid "" -"Failed to export profile to {0}: Writer plugin reported " -"failure." -msgstr "Falha ao exportar perfil para {0}: O plug-in de gravador comunicou uma falha." +msgid "Failed to export profile to {0}: Writer plugin reported failure." +msgstr "Falha ao exportar perfil para {0}: O plug-in de gravação comunicou uma falha." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format @@ -1135,9 +1141,7 @@ msgstr "Exportação bem-sucedida" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" -msgid "" -"Failed to import profile from {0}: {1}" +msgid "Failed to import profile from {0}: {1}" msgstr "Falha ao importar perfil de {0}: {1}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 @@ -1151,7 +1155,7 @@ msgstr "Perfil {0} importado com êxito" #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." -msgstr "O perfil {0} tem um tipo de ficheiro desconhecido ou está corrompido." +msgstr "O perfil {0} é de um formato de ficheiro desconhecido ou está corrompido." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" @@ -1161,7 +1165,7 @@ msgstr "Perfil personalizado" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." -msgstr "O perfil tem um tipo de qualidade em falta." +msgstr "O perfil não inclui qualquer tipo de qualidade." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format @@ -1171,9 +1175,7 @@ msgstr "Não foi possível encontrar um tipo de qualidade {0} para a configuraç #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." +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 "A altura do volume de construção foi reduzida devido ao valor da definição \"Sequência de impressão\" para impedir que o pórtico colida com os modelos impressos." #: /home/ruben/Projects/Cura/cura/BuildVolume.py:102 @@ -1184,28 +1186,29 @@ msgstr "Volume de construção" #: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 msgctxt "@info:status" msgid "Multiplying and placing objects" -msgstr "Multiplicar e dispor objetos" +msgstr "Multiplicar e posicionar objetos" #: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 #: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 msgctxt "@info:title" msgid "Placing Object" -msgstr "A dispor objeto" +msgstr "A Posicionar Objeto" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" -msgstr "Relatório de falhas" +msgstr "Relatório de Falhas" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 msgctxt "@label crash message" msgid "" -"

A fatal exception has occurred. Please send us this Crash Report to " -"fix the problem

\n" -"

Please use the \"Send report\" button to post a bug report " -"automatically to our servers

\n" +"

A fatal exception has occurred. Please send us this Crash Report to fix the problem

\n" +"

Please use the \"Send report\" button to post a bug report automatically to our servers

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

Ocorreu uma exceção fatal. Por favor envie-nos este Relatório de Falhas para podermos resolver o problema

\n" +"

Utilize o botão \"Enviar relatório\" para publicar um relatório de erros automaticamente nos nossos servidores

\n" " " -msgstr "

Ocorreu uma exceção fatal. Envie-nos este relatório de falhas para resolver o problema

\n

Utilize o botão \"Enviar relatório\" para publicar um relatório de erros automaticamente nos nossos servidores

\n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" @@ -1270,10 +1273,12 @@ msgctxt "@title:groupbox" msgid "Exception traceback" msgstr "Determinação da origem da exceção" +# rever! +# Registos? #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "Registos" +msgstr "Relatórios" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" @@ -1302,11 +1307,9 @@ msgstr "A carregar interface..." #: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format -msgctxt "" -"@info 'width', 'depth' and 'height' are variable names that must NOT be " -"translated; just translate the format of ##x##x## mm." +msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" -msgstr "%(width).1f x %(depth).1f x %(height).1f mm" +msgstr "%(width).1f x %(depth).1f x %(height).1f mm" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format @@ -1338,7 +1341,7 @@ msgstr "Impressora" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" -msgstr "Definições da impressora" +msgstr "Definições da Impressora" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" @@ -1372,7 +1375,7 @@ msgstr "Z (altura)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" -msgstr "Forma da placa de construção" +msgstr "Forma da base de construção" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" @@ -1387,64 +1390,52 @@ msgstr "Base aquecida" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" -msgstr "Padrão Gcode" +msgstr "Variante Gcode" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" -msgstr "Definições da cabeça de impressão" +msgstr "Definições Cabeça de Impressão" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" -msgstr "X mín." +msgstr "X mín" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" -msgid "" -"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\"." -msgstr "Distância desde a parte esquerda da cabeça de impressão até ao centro do bocal. Utilizado para impedir colisões entre as impressões anteriores e a cabeça de impressão ao imprimir \"Individualmente\"." +msgid "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\"." +msgstr "Distância desde a parte esquerda da cabeça de impressão até ao centro do nozzle. Utilizado para impedir colisões entre as impressões anteriores e a cabeça de impressão ao imprimir \"Individualmente\"." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" -msgstr "Y mín." +msgstr "Y mín" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" -msgid "" -"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\"." -msgstr "Distância desde a parte frontal da cabeça de impressão até ao centro do bocal. Utilizado para impedir colisões entre as impressões anteriores e a cabeça de impressão ao imprimir \"Individualmente\"." +msgid "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\"." +msgstr "Distância desde a parte frontal da cabeça de impressão até ao centro do nozzle. Utilizado para impedir colisões entre as impressões anteriores e a cabeça de impressão ao imprimir \"Individualmente\"." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" -msgstr "X máx." +msgstr "X máx" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" -msgid "" -"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\"." -msgstr "Distância desde a parte direita da cabeça de impressão até ao centro do bocal. Utilizado para impedir colisões entre as impressões anteriores e a cabeça de impressão ao imprimir \"Individualmente\"." +msgid "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\"." +msgstr "Distância desde a parte direita da cabeça de impressão até ao centro do nozzle. Utilizado para impedir colisões entre as impressões anteriores e a cabeça de impressão ao imprimir \"Individualmente\"." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" -msgstr "Y máx." +msgstr "Y máx" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" -msgid "" -"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\"." -msgstr "Distância desde a parte posterior da cabeça de impressão até ao centro do bocal. Utilizado para impedir colisões entre as impressões anteriores e a cabeça de impressão ao imprimir \"Individualmente\"." +msgid "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\"." +msgstr "Distância desde a parte posterior da cabeça de impressão até ao centro do nozzle. Utilizado para impedir colisões entre as impressões anteriores e a cabeça de impressão ao imprimir \"Individualmente\"." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" @@ -1453,22 +1444,17 @@ msgstr "Altura do pórtico" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" -msgid "" -"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\"." -msgstr "A diferença de altura entre a ponta do bocal e o sistema de pórtico (eixos X e Y). Utilizado para impedir colisões entre as impressões anteriores e o pórtico ao imprimir \"Individualmente\"." +msgid "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\"." +msgstr "A diferença de altura entre a ponta do nozzle e o sistema de pórtico (eixos X e Y). Utilizado para impedir colisões entre as impressões anteriores e o pórtico ao imprimir \"Individualmente\"." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" -msgstr "Número de extrusoras" +msgstr "Número de Extrusores" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" -msgid "" -"The nominal diameter of filament supported by the printer. The exact " -"diameter will be overridden by the material and/or the profile." +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "O diâmetro nominal do filamento suportado pela impressora. O diâmetro exato será substituído pelo material e/ou perfil." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 @@ -1480,7 +1466,7 @@ msgstr "Diâmetro do material" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" -msgstr "Tamanho do bocal" +msgstr "Tamanho do nozzle" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" @@ -1505,32 +1491,32 @@ msgstr "Comandos Gcode a serem executados no fim." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" -msgstr "Definições do bocal" +msgstr "Definições do Nozzle" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" -msgstr "Desvio X do bocal" +msgstr "Desvio X do Nozzle" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" -msgstr "Desvio Y do bocal" +msgstr "Desvio Y do Nozzle" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" -msgstr "Gcode inicial da extrusora" +msgstr "Gcode Inicial do Extrusor" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" -msgstr "Gcode final da extrusora" +msgstr "Gcode Final do Extrusor" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18 msgctxt "@label" msgid "Changelog" -msgstr "Registo de alterações" +msgstr "Lista das Alterações" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 @@ -1598,14 +1584,13 @@ msgstr "Ligar à impressora em rede" #: /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" +"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 "Para imprimir diretamente para a sua impressora através da rede, certifique-se de que a sua impressora está ligada à rede por meio de um cabo de rede ou através de ligação à rede Wi-Fi. Se não ligar o Cura à impressora, poderá ainda assim utilizar uma unidade USB para transferir ficheiros g-code para a impressora.\n\nSelecione a sua impressora na lista a seguir:" +msgstr "" +"Para imprimir diretamente para a sua impressora através da rede, certifique-se de que a sua impressora está ligada à rede por meio de um cabo de rede ou através de ligação à rede Wi-Fi. Se não ligar o Cura à impressora, poderá ainda assim utilizar uma unidade USB para transferir ficheiros g-code para a impressora.\n" +"\n" +"Selecione a sua impressora na lista a seguir:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1634,10 +1619,8 @@ msgstr "Atualizar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" -msgid "" -"If your printer is not listed, read the
network printing " -"troubleshooting guide" -msgstr "Se a sua impressora não estiver indicada, leia o guia de resolução de problemas de impressão em rede" +msgid "If your printer is not listed, read the network printing troubleshooting guide" +msgstr "Se a sua impressora não estiver na lista, por favor, leia o guia de resolução de problemas de impressão em rede" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" @@ -1657,7 +1640,7 @@ msgstr "Ultimaker 3 Extended" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" -msgstr "Versão de firmware" +msgstr "Versão de Firmware" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" @@ -1688,7 +1671,7 @@ msgstr "Ligar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" -msgstr "Endereço da impressora" +msgstr "Endereço da Impressora" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" @@ -1706,7 +1689,7 @@ msgstr "OK" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 msgctxt "@title:window" msgid "Print over network" -msgstr "Imprimir através da rede" +msgstr "Imprimir Através da Rede" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 msgctxt "@action:button" @@ -1721,13 +1704,13 @@ msgstr "%1 não está configurado para alojar um grupo de impressoras Ultimaker #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "Abre a página de tarefas de impressão com o seu browser predefinido." +msgstr "Abre a página com a lista dos trabalhos de impressão, no seu browser predefinido." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 msgctxt "@action:button" msgid "View print jobs" -msgstr "Visualizar tarefas de impressão" +msgstr "Ver Trabalhos em Impressão" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 @@ -1740,7 +1723,7 @@ msgstr "A preparar para imprimir" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 msgctxt "@label:status" msgid "Printing" -msgstr "A imprimir" +msgstr "A Imprimir" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 msgctxt "@label:status" @@ -1751,7 +1734,7 @@ msgstr "Disponível" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" -msgstr "Ligação com a impressora perdida" +msgstr "Perdeu-se a ligação com a impressora" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" @@ -1771,12 +1754,12 @@ msgstr "Concluído" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "Em pausa" +msgstr "Em Pausa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "A retomar" +msgstr "A Recomeçar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1787,17 +1770,17 @@ msgstr "Impressão cancelada" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 msgctxt "@label" msgid "Not accepting print jobs" -msgstr "Não são aceites tarefas de impressão" +msgstr "Não são aceites trabalhos de impressão" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 msgctxt "@label" msgid "Finishes at: " -msgstr "Termina a: " +msgstr "Termina em: " #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 msgctxt "@label" msgid "Clear build plate" -msgstr "Limpar placa de construção" +msgstr "Limpar base de construção" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 msgctxt "@label" @@ -1807,12 +1790,12 @@ msgstr "A aguardar pela alteração de configuração" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 msgctxt "@title" msgid "Print jobs" -msgstr "Tarefas de impressão" +msgstr "Trabalhos em Impressão" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 msgctxt "@label" msgid "Printing" -msgstr "A imprimir" +msgstr "A Imprimir" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 msgctxt "@label" @@ -1827,7 +1810,7 @@ msgstr "Impressoras" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 msgctxt "@action:button" msgid "View printers" -msgstr "Visualizar impressoras" +msgstr "Ver Impressoras" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" @@ -1837,12 +1820,12 @@ msgstr "Ligar a uma impressora" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" -msgstr "Carregar a configuração da impressora para o Cura" +msgstr "Importar a configuração da impressora para o Cura" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" -msgstr "Ativar configuração" +msgstr "Ativar Configuração" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" @@ -1862,12 +1845,12 @@ msgstr "Perguntar sempre" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Fine quality" -msgstr "Utilizar sempre qualidade de alta resolução" +msgstr "Utilizar sempre Alta Resolução" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" -msgstr "Utilizar sempre a qualidade de baixa resolução" +msgstr "Utilizar sempre Baixa resolução" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" @@ -1877,7 +1860,7 @@ msgstr "Importar ficheiro SolidWorks como STL..." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 msgctxt "@info:tooltip" msgid "Quality of the Exported STL" -msgstr "Qualidade do STL exportado" +msgstr "Qualidade do STL Exportado" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 msgctxt "@action:label" @@ -1908,77 +1891,83 @@ msgstr "Esquema de cores" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 msgctxt "@label:listbox" msgid "Material Color" -msgstr "Cor do material" +msgstr "Cor do Material" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 msgctxt "@label:listbox" msgid "Line Type" -msgstr "Tipo de linha" +msgstr "Tipo de Linha" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "Velocidade de alimentação" +msgstr "Velocidade de Alimentação" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "Espessura da camada" +msgstr "Espessura da Camada" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" msgid "Compatibility Mode" -msgstr "Modo de compatibilidade" +msgstr "Modo Compatibilidade" +# rever! +# Mostrar...? +# Ver...? #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 msgctxt "@label" msgid "Show Travels" -msgstr "Mostrar deslocações" +msgstr "Deslocações" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 msgctxt "@label" msgid "Show Helpers" -msgstr "Mostrar auxiliares" +msgstr "Auxiliares" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 msgctxt "@label" msgid "Show Shell" -msgstr "Mostrar cobertura" +msgstr "Invólucro" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 msgctxt "@label" msgid "Show Infill" -msgstr "Mostrar preenchimento" +msgstr "Enchimento" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 msgctxt "@label" msgid "Only Show Top Layers" -msgstr "Mostrar apenas camadas superiores" +msgstr "Mostrar Só Camadas Superiores" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" -msgstr "Mostrar cinco camadas detalhadas no topo" +msgstr "Mostrar 5 Camadas Superiores Detalhadas" +# rever! +# todas as strings com a frase +# Topo / Base ?? #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 msgctxt "@label" msgid "Top / Bottom" -msgstr "Superior/Inferior" +msgstr "Superior / Inferior" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 msgctxt "@label" msgid "Inner Wall" -msgstr "Parede interna" +msgstr "Parede Interior" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "mín." +msgstr "mín" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "máx." +msgstr "máx" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2013,17 +2002,18 @@ msgstr "Converter imagem..." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:33 msgctxt "@info:tooltip" msgid "The maximum distance of each pixel from \"Base.\"" -msgstr "A distância máxima de cada pixel desde a \"Base\"." +msgstr "A distância máxima de cada pixel desde a \"Base\"" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:38 msgctxt "@action:label" msgid "Height (mm)" msgstr "Altura (mm)" +# rever! #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:56 msgctxt "@info:tooltip" msgid "The base height from the build plate in millimeters." -msgstr "A altura da base desde a placa de construção em milímetros." +msgstr "A altura da \"Base\" desde a base de construção em milímetros." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:61 msgctxt "@action:label" @@ -2033,7 +2023,7 @@ msgstr "Base (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:79 msgctxt "@info:tooltip" msgid "The width in millimeters on the build plate." -msgstr "A largura em milímetros na placa de construção." +msgstr "A largura em milímetros na base de construção." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 msgctxt "@action:label" @@ -2043,7 +2033,7 @@ msgstr "Largura (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 msgctxt "@info:tooltip" msgid "The depth in millimeters on the build plate" -msgstr "A profundidade em milímetros na placa de construção" +msgstr "A profundidade em milímetros na base de construção" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 msgctxt "@action:label" @@ -2052,12 +2042,8 @@ msgstr "Profundidade (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 "Por predefinição, os pixels brancos representam os pontos altos na malha e os pixels pretos representam os pontos baixos na malha. Altere esta opção para inverter o comportamento de forma que os pixels pretos representem os pontos altos na malha e os pixels brancos representem os pontos baixos na malha." +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 "Por predefinição, os pixels brancos representam os pontos altos do objecto e os pixels pretos representam os pontos baixos do objecto. Altere esta opção para inverter o comportamento de forma que os pixels pretos representem os pontos altos do objecto e os pixels brancos representem os pontos baixos do objecto." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 msgctxt "@item:inlistbox" @@ -2103,7 +2089,7 @@ msgstr "Mostrar tudo" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" -msgstr "Abrir projeto" +msgstr "Abrir Projeto" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" @@ -2130,7 +2116,7 @@ msgstr "Definições da impressora" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" -msgstr "Como deve ser resolvido o conflito na máquina?" +msgstr "Como deve ser resolvido o conflito da máquina?" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 @@ -2164,6 +2150,8 @@ msgctxt "@action:label" msgid "Not in profile" msgstr "Inexistente no perfil" +# rever! +# contexto?! #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" @@ -2220,7 +2208,7 @@ msgstr "%1 de %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "O carregamento de um projeto irá limpar todos os modelos na placa de construção." +msgstr "Abrir um projeto irá apagar todos os modelos na base de construção." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2235,7 +2223,7 @@ msgstr "Procurar e atualizar plug-ins" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:27 msgctxt "@label" msgid "Here you can find a list of Third Party plugins." -msgstr "Aqui pode encontrar uma lista de plug-ins de terceiros." +msgstr "Aqui pode encontrar uma lista de plug-ins criados por terceiros." #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:145 msgctxt "@action:button" @@ -2263,7 +2251,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Este plug-in contém uma licença.\nÉ necessário aceitar esta licença para instalar o plug-in.\nConcorda com os termos abaixo?" +msgstr "" +"Este plug-in contém uma licença.\n" +"É necessário aceitar esta licença para instalar o plug-in.\n" +"Concorda com os termos abaixo?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2278,13 +2269,13 @@ msgstr "Rejeitar" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "Contrato de utilizador" +msgstr "Contrato de Utilizador" #: /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 "Selecionar atualizações da impressora" +msgstr "Selecionar Atualizações da Impressora" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:37 msgctxt "@label" @@ -2294,57 +2285,47 @@ msgstr "Selecione quaisquer atualizações realizadas a esta Ultimaker 2." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:45 msgctxt "@label" msgid "Olsson Block" -msgstr "Bloco Olsson" +msgstr "Olson Block" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27 msgctxt "@title" msgid "Build Plate Leveling" -msgstr "Nivelamento da placa de construção" +msgstr "Nivelamento da Base de Construção" #: /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 "Para assegurar uma boa qualidade das suas impressões, é agora possível ajustar a placa de construção. Quando clica em \"Avançar para a posição seguinte\", o bocal irá deslocar-se para as diferentes posições que podem ser ajustadas." +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 "Para assegurar uma boa qualidade das suas impressões, pode agora ajustar a base de construção. Quando clica em \"Avançar para a posição seguinte\", o nozzle irá deslocar-se para as diferentes posições que podem ser ajustadas." #: /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 "Para cada posição, introduza um pedaço de papel debaixo do bocal e ajuste a altura da placa de construção da impressão. A altura da placa de construção da impressão está correta quando o papel ficar ligeiramente preso na ponta do bocal." +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 "Para cada posição, introduza um pedaço de papel debaixo do nozzle e ajuste a altura da base de construção. A altura da base de construção está correta quando o papel fica ligeiramente preso pelo nozzle." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 msgctxt "@action:button" msgid "Start Build Plate Leveling" -msgstr "Iniciar nivelamento da placa de construção" +msgstr "Iniciar Nivelamento da base de construção" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74 msgctxt "@action:button" msgid "Move to Next Position" -msgstr "Avançar para posição seguinte" +msgstr "Avançar para Posição Seguinte" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:27 msgctxt "@title" msgid "Upgrade Firmware" -msgstr "Atualizar firmware" +msgstr "Atualizar Firmware" +# rever! #: /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 "O firmware é a parte do software que é executada diretamente na sua impressora 3D. Este firmware controla os motores de passo, regula a temperatura e assegura o funcionamento da sua impressora." +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 "O firmware é o software que é executado diretamente na sua impressora 3D. Este firmware controla os motores de passo, regula a temperatura e basicamente assegura o funcionamento da sua impressora." #: /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." +msgid "The firmware shipping with new printers works, but new versions tend to have more features and improvements." msgstr "O firmware que é expedido com as novas impressoras funciona corretamente, mas as novas versões costumam ter mais funcionalidades e melhorias." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 @@ -2370,24 +2351,22 @@ msgstr "Selecione quaisquer atualizações realizadas a esta Ultimaker Original #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 msgctxt "@label" msgid "Heated Build Plate (official kit or self-built)" -msgstr "Placa de construção aquecida (kit oficial ou de construção própria)" +msgstr "Base de Construção Aquecida (kit oficial ou de construção própria)" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27 msgctxt "@title" msgid "Check Printer" -msgstr "Verificar impressora" +msgstr "Verificar Impressora" #: /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 "É recomendado efetuar algumas verificações de conformidade à sua Ultimaker. Pode ignorar este passo se souber que a sua máquina está funcional" +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 "É recomendado efetuar algumas verificações de teste à sua Ultimaker. Pode ignorar este passo se souber que a sua máquina está funcional" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 msgctxt "@action:button" msgid "Start Printer Check" -msgstr "Iniciar verificação da impressora" +msgstr "Iniciar Verificação da Impressora" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 msgctxt "@label" @@ -2402,12 +2381,15 @@ msgstr "Ligado" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 msgctxt "@info:status" msgid "Not connected" -msgstr "Não ligado" +msgstr "Sem ligação" +# rever! +# contexto?! +# X mín. de posição final: #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 msgctxt "@label" msgid "Min endstop X: " -msgstr "X mín. de posição final: " +msgstr "Mín. endtop X: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 @@ -2425,37 +2407,41 @@ msgctxt "@info:status" msgid "Not checked" msgstr "Não verificado" +# rever! +# contexto?! #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 msgctxt "@label" msgid "Min endstop Y: " -msgstr "Y mín. de posição final: " +msgstr "Mín. endtop Y: " +# rever! +# contexto?! #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 msgctxt "@label" msgid "Min endstop Z: " -msgstr "Z mín. de posição final: " +msgstr "Mín. endstop Z: " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 msgctxt "@label" msgid "Nozzle temperature check: " -msgstr "Verificação da temperatura do bocal: " +msgstr "Verificação da temperatura do nozzle: " #: /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 "Parar aquecimento" +msgstr "Parar Aquecimento" #: /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 "Iniciar aquecimento" +msgstr "Iniciar Aquecimento" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223 msgctxt "@label" msgid "Build plate temperature check:" -msgstr "Verificação da temperatura da placa de construção:" +msgstr "Verificação da temperatura da base de construção:" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 msgctxt "@info:status" @@ -2470,7 +2456,7 @@ msgstr "Está tudo em ordem! O seu exame está concluído." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" -msgstr "Não ligado a uma impressora" +msgstr "Sem ligação a uma impressora" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 msgctxt "@label:MonitorStatus" @@ -2534,14 +2520,16 @@ msgstr "Tem a certeza de que deseja cancelar a impressão?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:15 msgctxt "@title:window" msgid "Discard or Keep changes" -msgstr "Eliminar ou manter as alterações" +msgstr "Descartar ou Manter as alterações" #: /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 "Personalizou algumas definições do perfil.\nGostaria de manter ou eliminar essas definições?" +msgstr "" +"Alterou algumas das definições do perfil.\n" +"Gostaria de manter ou descartar essas alterações?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2568,7 +2556,7 @@ msgstr "Perguntar sempre isto" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" -msgstr "Eliminar e não perguntar novamente" +msgstr "Descartar e não perguntar novamente" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 @@ -2579,7 +2567,7 @@ msgstr "Manter e não perguntar novamente" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:196 msgctxt "@action:button" msgid "Discard" -msgstr "Eliminar" +msgstr "Descartar" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:209 msgctxt "@action:button" @@ -2599,7 +2587,7 @@ msgstr "Informações" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:68 msgctxt "@label" msgid "Display Name" -msgstr "Apresentar nome" +msgstr "Nome" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:78 msgctxt "@label" @@ -2609,7 +2597,7 @@ msgstr "Marca" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 msgctxt "@label" msgid "Material Type" -msgstr "Tipo de material" +msgstr "Tipo de Material" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 msgctxt "@label" @@ -2634,12 +2622,12 @@ msgstr "Diâmetro" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 msgctxt "@label" msgid "Filament Cost" -msgstr "Custo do filamento" +msgstr "Custo do Filamento" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 msgctxt "@label" msgid "Filament weight" -msgstr "Peso do filamento" +msgstr "Peso do Filamento" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 msgctxt "@label" @@ -2649,7 +2637,7 @@ msgstr "Comprimento do filamento" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 msgctxt "@label" msgid "Cost per Meter" -msgstr "Custo por metro" +msgstr "Custo por Metro" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 msgctxt "@label" @@ -2659,7 +2647,7 @@ msgstr "Este material está associado a %1 e partilha algumas das suas proprieda #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 msgctxt "@label" msgid "Unlink Material" -msgstr "Desassociar material" +msgstr "Desassociar Material" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 msgctxt "@label" @@ -2669,7 +2657,7 @@ msgstr "Descrição" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 msgctxt "@label" msgid "Adhesion Information" -msgstr "Informações de aderência" +msgstr "Informações de Aderência" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 msgctxt "@label" @@ -2679,12 +2667,12 @@ msgstr "Definições de impressão" #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 msgctxt "@title:tab" msgid "Setting Visibility" -msgstr "Visibilidade das definições" +msgstr "Visibilidade das Definições" #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:44 msgctxt "@label:textbox" msgid "Check all" -msgstr "Verificar tudo" +msgstr "Selecionar tudo" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:40 msgctxt "@info:status" @@ -2739,19 +2727,18 @@ msgstr "Tema:" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 msgctxt "@label" -msgid "" -"You will need to restart the application for these changes to have effect." +msgid "You will need to restart the application for these changes to have effect." msgstr "É necessário reiniciar a aplicação para que estas alterações sejam aplicadas." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." -msgstr "Segmentar automaticamente ao alterar as definições." +msgstr "Seccionar automaticamente ao alterar as definições." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 msgctxt "@option:check" msgid "Slice automatically" -msgstr "Segmentar automaticamente" +msgstr "Seccionar automaticamente" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 msgctxt "@label" @@ -2760,21 +2747,19 @@ msgstr "Comportamento da janela" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 msgctxt "@info:tooltip" -msgid "" -"Highlight unsupported areas of the model in red. Without support these areas " -"will not print properly." -msgstr "Realce a vermelho as áreas não suportadas do modelo. Sem suporte, estas áreas não serão impressas adequadamente." +msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." +msgstr "Realçar, a vermelho, as áreas do modelo sem apoio. Sem suporte, estas áreas podem não ser impressas correctamente." +# rever! +# consolas? #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 msgctxt "@option:check" msgid "Display overhang" -msgstr "Apresentar saliência" +msgstr "Mostrar Saliências (Overhangs)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 msgctxt "@info:tooltip" -msgid "" -"Moves the camera so the model is in the center of the view when a model is " -"selected" +msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "Move a câmara de forma que o modelo fique no centro da visualização quando é selecionado um modelo" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 @@ -2790,7 +2775,7 @@ msgstr "O comportamento de zoom predefinido do Cura deve ser invertido?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 msgctxt "@action:button" msgid "Invert the direction of camera zoom." -msgstr "Inverta a direção do zoom da câmara." +msgstr "Inverta a direção do zoom da câmera." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 msgctxt "@info:tooltip" @@ -2800,38 +2785,37 @@ msgstr "O zoom deve deslocar-se na direção do rato?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 msgctxt "@action:button" msgid "Zoom toward mouse direction" -msgstr "Aplicar zoom na direção do rato" +msgstr "Fazer Zoom na direção do rato" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 msgctxt "@info:tooltip" -msgid "" -"Should models on the platform be moved so that they no longer intersect?" -msgstr "Os modelos na plataforma devem ser movidos para que deixem de se cruzar?" +msgid "Should models on the platform be moved so that they no longer intersect?" +msgstr "Os modelos, na plataforma, devem ser movidos para que não se intersectem?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 msgctxt "@option:check" msgid "Ensure models are kept apart" -msgstr "Garantir que os modelos são mantidos afastados" +msgstr "Garantir que os modelos não se interceptam" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" -msgstr "Os modelos na plataforma devem ser movidos para baixo de forma a tocar na placa de construção?" +msgstr "Pousar os modelos na base de construção?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 msgctxt "@option:check" msgid "Automatically drop models to the build plate" -msgstr "Baixar modelos automaticamente para a placa de construção" +msgstr "Pousar automaticamente os modelos na base de construção" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." -msgstr "Mostrar mensagem de atenção no leitor de gcode." +msgstr "Mostrar mensagem de aviso no leitor de gcode." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 msgctxt "@option:check" msgid "Caution message in gcode reader" -msgstr "Mensagem de atenção no leitor de gcode" +msgstr "Mensagem de aviso no leitor de gcode" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 msgctxt "@info:tooltip" @@ -2841,7 +2825,7 @@ msgstr "A camada deve ser forçada a entrar no modo de compatibilidade?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" -msgstr "Forçar modo de compatibilidade da visualização da camada (é necessário reiniciar)" +msgstr "Forçar o modo de compatibilidade na visualização por camada (é necessário reiniciar)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 msgctxt "@label" @@ -2851,36 +2835,32 @@ msgstr "Abrir e guardar ficheiros" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" -msgstr "Os modelos devem ser dimensionados até ao volume de construção se forem demasiado grandes?" +msgstr "Os modelos devem ser redimensionados até ao volume de construção se forem demasiado grandes?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 msgctxt "@option:check" msgid "Scale large models" -msgstr "Dimensionar modelos grandes" +msgstr "Redimensionar modelos demasiado grandes" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 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 "Um modelo pode parecer extremamente pequeno se, por exemplo, a sua unidade estiver em metros e não em milímetros. Estes modelos devem ser aumentados verticalmente?" +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 "Um modelo pode parecer extremamente pequeno se, por exemplo, este tiver sido criado em metros e não em milímetros. Estes modelos devem ser redimensionados?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 msgctxt "@option:check" msgid "Scale extremely small models" -msgstr "Dimensionar modelos extremamente pequenos" +msgstr "Redimensionar modelos extremamente pequenos" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 msgctxt "@info:tooltip" -msgid "" -"Should a prefix based on the printer name be added to the print job name " -"automatically?" -msgstr "Deve um prefixo com base no nome da impressora ser adicionado ao nome da tarefa de impressão automaticamente?" +msgid "Should a prefix based on the printer name be added to the print job name automatically?" +msgstr "Deve um prefixo com base no nome da impressora ser adicionado ao nome do trabalho de impressão automaticamente?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 msgctxt "@option:check" msgid "Add machine prefix to job name" -msgstr "Adicionar prefixo da máquina ao nome da tarefa" +msgstr "Adicionar prefixo da máquina ao nome do trabalho" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 msgctxt "@info:tooltip" @@ -2919,10 +2899,7 @@ msgstr "Importar sempre modelos" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 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." +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 "Quando tiver realizado alterações a um perfil e mudado para outro, será apresentada uma caixa de diálogo a perguntar se pretende manter as alterações. Caso contrário, pode escolher um comportamento predefinido, sendo que a caixa de diálogo nunca mais é apresentada." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 @@ -2945,18 +2922,17 @@ msgctxt "@option:check" msgid "Check for updates on start" msgstr "Procurar atualizações ao iniciar" +# rever! +# legal wording #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 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 "Devem os dados anónimos sobre a sua impressão ser enviados para a Ultimaker? Observe que não são enviados nem armazenados modelos, endereços IP ou outras informações que forneçam a identificação pessoal." +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 "Devem dados anónimos sobre a impressão ser enviados para a Ultimaker? Não são enviadas nem armazenadas quaisquer informações pessoais, incluindo modelos, endereços IP ou outro tipo de identificação pessoal." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 msgctxt "@option:check" msgid "Send (anonymous) print information" -msgstr "Enviar informações de impressão (anónimas)" +msgstr "Enviar informações (anónimas) da impressão" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 @@ -2975,7 +2951,7 @@ msgstr "Ativar" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102 msgctxt "@action:button" msgid "Rename" -msgstr "Renomear" +msgstr "Mudar Nome" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" @@ -3001,12 +2977,12 @@ msgstr "Estado:" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" -msgstr "A aguardar que alguém limpe a placa de construção" +msgstr "A aguardar que alguém limpe a base de construção" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" -msgstr "A aguardar por uma tarefa de impressão" +msgstr "A aguardar por um trabalho de impressão" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 @@ -3059,14 +3035,12 @@ msgstr "Atualizar perfil com as definições/substituições atuais" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:173 msgctxt "@action:button" msgid "Discard current changes" -msgstr "Eliminar alterações atuais" +msgstr "Descartar alterações atuais" #: /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 "Este perfil utiliza as predefinições especificadas pela impressora, pelo que não tem quaisquer definições/substituições na lista a seguir." +msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below." +msgstr "Este perfil utiliza as predefinições especificadas pela impressora, pelo que não tem quaisquer definições/substituições na lista seguinte." #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 msgctxt "@action:label" @@ -3076,12 +3050,12 @@ msgstr "As suas definições atuais correspondem ao perfil selecionado." #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:215 msgctxt "@title:tab" msgid "Global Settings" -msgstr "Definições globais" +msgstr "Definições Globais" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:258 msgctxt "@title:window" msgid "Rename Profile" -msgstr "Renomear perfil" +msgstr "Mudar Nome do Perfil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:271 msgctxt "@title:window" @@ -3115,9 +3089,7 @@ msgid "Materials" msgstr "Materiais" #: /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" +msgctxt "@action:label %1 is printer name, %2 is how this printer names variants, %3 is variant name" msgid "Printer: %1, %2: %3" msgstr "Impressora: %1, %2: %3" @@ -3144,8 +3116,7 @@ msgstr "Importar material" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 msgctxt "@info:status Don't translate the XML tags or !" -msgid "" -"Could not import material %1: %2" +msgid "Could not import material %1: %2" msgstr "Não foi possível importar o material %1: %2" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 @@ -3157,12 +3128,11 @@ msgstr "Material %1 importado com êxito" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 msgctxt "@title:window" msgid "Export Material" -msgstr "Exportar material" +msgstr "Exportar Material" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 msgctxt "@info:status Don't translate the XML tags and !" -msgid "" -"Failed to export material to %1: %2" +msgid "Failed to export material to %1: %2" msgstr "Falha ao exportar material para %1: %2" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 @@ -3174,17 +3144,17 @@ msgstr "Material exportado com êxito para %1" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" -msgstr "Adicionar impressora" +msgstr "Adicionar Impressora" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 msgctxt "@label" msgid "Printer Name:" -msgstr "Nome da impressora:" +msgstr "Nome da Impressora:" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 msgctxt "@action:button" msgid "Add Printer" -msgstr "Adicionar impressora" +msgstr "Adicionar Impressora" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" @@ -3199,14 +3169,16 @@ msgstr "versão: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." -msgstr "Solução completa para impressão 3D por filamento fundido." +msgstr "A Solução completa para a impressão 3D por filamento fundido." #: /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 "O Cura foi desenvolvido pela Ultimaker B.V. em colaboração com a comunidade.\nO Cura tem o prazer de utilizar os seguintes projetos open source:" +msgstr "" +"O Cura foi desenvolvido pela Ultimaker B.V. em colaboração com a comunidade.\n" +"O Cura tem o prazer de utilizar os seguintes projetos open source:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3216,7 +3188,7 @@ msgstr "Interface gráfica do utilizador" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:119 msgctxt "@label" msgid "Application framework" -msgstr "Estrutura de aplicações" +msgstr "Framework da aplicação" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:120 msgctxt "@label" @@ -3236,8 +3208,10 @@ msgstr "Linguagem de programação" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 msgctxt "@label" msgid "GUI framework" -msgstr "Estrutura da GUI" +msgstr "GUI framework" +# rever! +# use eng programing terms? #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 msgctxt "@label" msgid "GUI framework bindings" @@ -3311,16 +3285,18 @@ msgstr "Perfil:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "Nenhum perfil disponível" +msgstr "Nenhum Perfil Disponível" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" -"Some setting/override values are different from the values stored in the " -"profile.\n" +"Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Alguns valores de definição/substituição são diferentes dos valores armazenados no perfil.\n\nClique para abrir o gestor de perfis." +msgstr "" +"Alguns valores de definição/substituição são diferentes dos valores armazenados no perfil.\n" +"\n" +"Clique para abrir o gestor de perfis." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" @@ -3330,12 +3306,12 @@ msgstr "Procurar..." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" -msgstr "Copiar valor para todas as extrusoras" +msgstr "Copiar valor para todos os extrusores" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" -msgstr "Ocultar esta definição" +msgstr "Esconder esta definição" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" @@ -3352,36 +3328,49 @@ msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Configurar visibilidade da definição..." +# rever! +# ocultas? +# escondidas? +# valor normal? automatico? #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 msgctxt "@label" msgid "" -"Some hidden settings use values different from their normal calculated " -"value.\n" +"Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Algumas definições ocultas utilizam valores diferentes do respetivo valor normal calculado.\n\nClique para tornar estas definições visíveis." +msgstr "" +"Algumas das definições invisíveis têm valores diferentes dos valores normais calculados automaticamente.\n" +"\n" +"Clique para tornar estas definições visíveis." +# rever! +# Afeta? +# Influencia? +# Altera? +# Modifica? #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." msgid "Affects" -msgstr "Afeta" +msgstr "Modifica" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 msgctxt "@label Header for list of settings." msgid "Affected By" -msgstr "Afetado por" +msgstr "Modificado Por" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 msgctxt "@label" -msgid "" -"This setting is always shared between all extruders. Changing it here will " -"change the value for all extruders" -msgstr "Esta definição é sempre partilhada entre todas as extrusoras. Ao alterá-la aqui, o valor será alterado para todas as extrusoras" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +msgstr "Esta definição é sempre partilhada entre todos os extrusores. Ao alterá-la aqui, o valor será alterado em todos os extrusores" +# rever! +# contexto?! +# resolvido? +# por-extrusor #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 msgctxt "@label" msgid "The value is resolved from per-extruder values " -msgstr "O valor é resolvido a partir de valores por extrusora " +msgstr "O valor é calculado com base nos valores por-extrusor " #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 msgctxt "@label" @@ -3389,28 +3378,37 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Esta definição tem um valor que é diferente do perfil.\n\nClique para restaurar o valor do perfil." +msgstr "" +"Esta definição tem um valor que é diferente do perfil.\n" +"\n" +"Clique para restaurar o valor do perfil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" msgid "" -"This setting is normally calculated, but it currently has an absolute value " -"set.\n" +"This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Geralmente, esta definição é calculada, mas atualmente tem um valor absoluto definido.\n\nClique para restaurar o valor calculado." +msgstr "" +"Normalmente, o valor desta definição é calculado, mas atualmente tem definido um valor absoluto.\n" +"\n" +"Clique para restaurar o valor calculado." +# rever! +# Configuração da Impressão? #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" -msgstr "Configuração de impressão" +msgstr "Configurar Impressão" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Configuração de impressão desativada\nOs ficheiros G-code não podem ser modificados" +msgstr "" +"Configuração da Impressão desativada\n" +"Os ficheiros G-code não podem ser modificados" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" @@ -3445,9 +3443,7 @@ msgid "Total:" msgstr "Total:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 -msgctxt "" -"@label Print estimates: m for meters, g for grams, %4 is currency and %3 is " -"print cost" +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1 m/~ %2 g/~ %4 %3" @@ -3458,17 +3454,13 @@ msgstr "%1 m/~ %2 g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" -msgid "" -"Recommended Print Setup

Print with the recommended settings " -"for the selected printer, material and quality." -msgstr "Configuração de impressão recomendada

Imprima com as definições recomendadas para a impressora, o material e a qualidade selecionados." +msgid "Recommended Print Setup

Print with the recommended settings for the selected printer, material and quality." +msgstr "Configuração de Impressão Recomendada

Imprimir com as definições recomendadas para a Impressora, Material e Qualidade selecionadas." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" -msgid "" -"Custom Print Setup

Print with finegrained control over every " -"last bit of the slicing process." -msgstr "Configuração de impressão personalizada

Imprima com controlo detalhado de cada etapa do processo de segmentação." +msgid "Custom Print Setup

Print with finegrained control over every last bit of the slicing process." +msgstr "Configuração de Impressão Personalizada

Imprimir com um controlo detalhado de todas as definições específicas de cada uma das etapas do processo de seccionamento." #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" @@ -3489,25 +3481,25 @@ msgstr "Automático: %1" msgctxt "@label" msgid "Print Selected Model With:" msgid_plural "Print Selected Models With:" -msgstr[0] "Imprimir modelo selecionado com:" +msgstr[0] "Imprimir Modelo Selecionado Com:" msgstr[1] "Imprimir modelos selecionados com:" #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" -msgstr[0] "Multiplicar modelo selecionado" +msgstr[0] "Multiplicar Modelo Selecionado" msgstr[1] "Multiplicar modelos selecionados" #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 msgctxt "@label" msgid "Number of Copies" -msgstr "Número de cópias" +msgstr "Número de Cópias" #: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 msgctxt "@title:menu menubar:file" msgid "Open &Recent" -msgstr "Abrir &recente" +msgstr "Abrir &Recente" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" @@ -3518,45 +3510,41 @@ msgstr "Nenhuma impressora ligada" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" -msgstr "Extrusora" +msgstr "Extrusor" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:120 msgctxt "@tooltip" -msgid "" -"The target temperature of the hotend. The hotend will heat up or cool down " -"towards this temperature. If this is 0, the hotend heating is turned off." +msgid "The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the hotend heating is turned off." msgstr "A temperatura-alvo da extremidade quente. A extremidade quente irá aquecer ou arrefecer até esta temperatura. Se esta opção for definida como 0, o aquecimento da extremidade quente será desligado." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:152 msgctxt "@tooltip" msgid "The current temperature of this extruder." -msgstr "A temperatura atual desta extrusora." +msgstr "A temperatura actual deste extrusor." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." -msgstr "A cor do material nesta extrusora." +msgstr "A cor do material neste extrusor." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." -msgstr "O material nesta extrusora." +msgstr "O material neste extrusor." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." -msgstr "O bocal inserido nesta extrusora." +msgstr "O nozzle inserido neste extrusor." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" -msgstr "Placa de construção" +msgstr "Base de construção" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 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." +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 "A temperatura desejada da base aquecida. A base irá aquecer ou arrefecer até esta temperatura. Se esta opção for definida como 0, o aquecimento da base será desligado." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 @@ -3581,17 +3569,17 @@ msgstr "Pré-aquecer" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 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 "Aqueça a base com antecedência antes da impressão. Pode continuar a ajustar a impressora durante o aquecimento e não precisará de esperar que a base aqueça quando estiver pronto para imprimir." +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 "Aqueçer a base com antecedência antes de imprimir. Pode continuar a ajustar as definições de impressão durante o aquecimento e não precisará de esperar que a base aqueça quando começar a impressão." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" msgstr "Controlo da impressora" +# rever! +# contexto?! +# Jog? #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" @@ -3607,6 +3595,9 @@ msgctxt "@label" msgid "Z" msgstr "Z" +# rever! +# contexto?! +# Jog? #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" @@ -3620,12 +3611,12 @@ msgstr "Impressão ativa" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" -msgstr "Nome da tarefa" +msgstr "Nome do trabalho" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" -msgstr "Tempo de impressão" +msgstr "Tempo de Impressão" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" @@ -3640,7 +3631,7 @@ msgstr "Alternar para e&crã inteiro" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" -msgstr "&Anular" +msgstr "&Desfazer" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" @@ -3665,17 +3656,17 @@ msgstr "Configurar Cura..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." -msgstr "&Adicionar impressora..." +msgstr "&Adicionar Impressora..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." -msgstr "Gerir im&pressoras..." +msgstr "Gerir Im&pressoras..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." -msgstr "Gerir materiais..." +msgstr "Gerir Materiais..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" @@ -3685,7 +3676,7 @@ msgstr "&Atualizar perfil com as definições/substituições atuais" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" -msgstr "&Eliminar alterações atuais" +msgstr "&Descartar alterações atuais" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" @@ -3695,7 +3686,7 @@ msgstr "&Criar perfil a partir das definições/substituições atuais..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." -msgstr "Gerir perfis..." +msgstr "Gerir Perfis..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" @@ -3716,8 +3707,8 @@ msgstr "&Sobre..." msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" -msgstr[0] "Eliminar modelo &selecionado" -msgstr[1] "Eliminar modelos &selecionados" +msgstr[0] "Apagar Modelo &Selecionado" +msgstr[1] "Apagar Modelos &Selecionados" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" @@ -3736,32 +3727,32 @@ msgstr[1] "Multiplicar modelos selecionados" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" -msgstr "Eliminar modelo" +msgstr "Apagar Modelo" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" -msgstr "Ce&ntrar modelo na plataforma" +msgstr "Ce&ntrar Modelo na Base" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" -msgstr "&Agrupar modelos" +msgstr "&Agrupar Modelos" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" -msgstr "Desagrupar modelos" +msgstr "Desagrupar Modelos" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" -msgstr "&Unir modelos" +msgstr "&Combinar Modelos" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." -msgstr "&Multiplicar modelo..." +msgstr "&Multiplicar Modelo..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" @@ -3771,7 +3762,7 @@ msgstr "&Selecionar todos os modelos" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" -msgstr "&Limpar placa de construção" +msgstr "&Limpar base de construção" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" @@ -3793,20 +3784,22 @@ msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Repor todas as posições de modelos" +# rever! +# Cancelar todas? #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" -msgstr "Repor todas as &transformações de modelos" +msgstr "Repor Todas as &Transformações do Modelo" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." -msgstr "&Abrir ficheiro(s)..." +msgstr "&Abrir Ficheiro(s)..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." -msgstr "&Novo projeto..." +msgstr "&Novo Projeto..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" @@ -3836,32 +3829,38 @@ msgstr "Plug-ins instalados..." #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" -msgstr "Carregue um modelo 3D" +msgstr "Por favor abra um Modelo 3D ou Projeto" +# rever! +# Pronto para? +# Preparado para? #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" -msgstr "Pronto para segmentar" +msgstr "Disponível para seccionar" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." -msgstr "A segmentar..." +msgstr "A Seccionar..." +# rever! +# Pronto para? +# Preparado para? #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" -msgstr "Pronto para %1" +msgstr "Disponível para %1" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" -msgstr "Não é possível segmentar" +msgstr "Não é possível Seccionar" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" -msgstr "Segmentação indisponível" +msgstr "Seccionamento indisponível" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" @@ -3876,7 +3875,7 @@ msgstr "Cancelar" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" -msgstr "Selecione o dispositivo de saída ativo" +msgstr "Selecione o dispositivo de saída" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 @@ -3886,16 +3885,13 @@ msgstr "Abrir ficheiro(s)" #: /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 "Encontrámos um ou mais ficheiros de projeto nos ficheiros selecionados. Só é possível abrir um ficheiro de projeto de cada vez. Sugerimos que importe apenas modelos desses ficheiros. Deseja continuar?" +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 "Encontrámos um ou mais projetos do Cura nos ficheiros selecionados. Só é possível abrir um Projeto do Cura, de cada vez. Sugerimos importar apenas os modelos 3D desses Projetos do Cura. Deseja continuar?" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 msgctxt "@action:button" msgid "Import all as models" -msgstr "Importar tudo como modelos" +msgstr "Importar tudo como modelos 3D" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" @@ -3957,7 +3953,7 @@ msgstr "&Perfil" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" -msgstr "Definir como extrusora ativa" +msgstr "Definir como Extrusor Ativo" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" @@ -3996,10 +3992,8 @@ msgstr "Novo projeto" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 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 "Tem a certeza de que deseja iniciar um novo projeto? Isto irá limpar a placa de construção e quaisquer definições não guardadas." +msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." +msgstr "Tem a certeza de que deseja iniciar um novo projeto? Isto irá apagar tudo na base de construção assim como quaisquer definições que não tenham sido guardadas." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" @@ -4013,10 +4007,7 @@ msgstr "Abrir ficheiro(s)" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 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." +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 "Encontrámos um ou mais ficheiros G-Code nos ficheiros selecionados. Só é possível abrir um ficheiro G-Code de cada vez. Se pretender abrir um ficheiro G-code, selecione apenas um." #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 @@ -4027,7 +4018,7 @@ msgstr "Guardar projeto" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" -msgstr "Extrusora %1" +msgstr "Extrusor %1" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" @@ -4037,7 +4028,7 @@ msgstr "%1 & material" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" -msgstr "Não mostrar resumo de projeto ao guardar novamente" +msgstr "Não mostrar novamente o resumo do projeto ao guardar" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" @@ -4057,103 +4048,97 @@ msgstr "Monitorizar" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" -msgstr "Altura da camada" +msgstr "Espessura da Camada" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" -msgid "" -"A custom profile is currently active. To enable the quality slider, choose a " -"default quality profile in Custom tab" -msgstr "Está atualmente ativo um perfil personalizado. Para ativar o controlo de deslize de qualidade, escolha um perfil de qualidade predefinido no separador Personalizado" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "De momento está activo um perfil personalizado. Para poder ativar o controlo de qualidade, por favor selecione um dos perfis de qualidade predefinidos no modo Personalizado" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" -msgstr "Velocidade de impressão" +msgstr "Velocidade Impressão" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" -msgstr "Mais lenta" +msgstr "Mais Lenta" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" -msgstr "Mais rápida" +msgstr "Mais Rápida" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" -msgid "" -"You have modified some profile settings. If you want to change these go to " -"custom mode." -msgstr "Algumas definições de perfil foram modificadas. Se pretender alterá-las, aceda ao modo personalizado." +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "Algumas definições do perfil foram modificadas. Se pretender alterá-las, aceda ao modo Personalizado." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" -msgstr "Preenchimento" +msgstr "Enchimento" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" -msgid "" -"Gradual infill will gradually increase the amount of infill towards the top." -msgstr "O preenchimento gradual irá aumentar progressivamente a quantidade de preenchimento em direção ao topo." +msgid "Gradual infill will gradually increase the amount of infill towards the top." +msgstr "O enchimento gradual irá aumentar progressivamente a densidade do enchimento em direção ao topo." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" -msgstr "Ativar gradação" +msgstr "Enchimento Gradual" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" -msgstr "Gerar suporte" +msgstr "Criar Suportes" +# rever! +# collapse ? +# desmoronar? desabar? #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" -msgid "" -"Generate structures to support parts of the model which have overhangs. " -"Without these structures, such parts would collapse during printing." -msgstr "Gera estruturas para suportar peças do modelo com saliências. Sem estas estruturas, essas peças desintegrar-se-iam durante a impressão." +msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." +msgstr "Criar estruturas para suportar partes do modelo, suspensas ou com saliências. Sem estas estruturas, essas partes do modelo podem desmoronar durante a impressão." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" -msgstr "Extrusora de suporte" +msgstr "Extrusor dos Suportes" +# rever! +# mid air? no ar? no meio do ar? +# sagging? deformar? +# Isto irá construir estruturas de suporte debaixo do modelo para impedir a deformação de partes suspensas do modelo ou que a impressão seja feita no ar. +# a utilizar? usado? #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 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 "Selecione a extrusora a ser utilizada para suporte. Isto irá construir estruturas de suporte debaixo do modelo para impedir a flacidez do modelo ou a impressão em suspenso." +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 "Selecionar qual o extrusor usado para imprimir os suportes. Isto irá construir estruturas de suporte por debaixo do modelo para impedir que as partes suspensas do modelo se deformem ou que sejam impressas no ar." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" -msgstr "Aderência à placa de construção" +msgstr "Aderência à Base" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 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 "Ativa a impressão de uma borda ou base reticular. Isto irá adicionar uma área plana em torno ou debaixo do seu objeto, o que facilitará o respetivo corte posteriormente." +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 "Permite a impressão de uma Aba (Brim) ou Raft. Isto irá adicionar, respectivamente, uma área plana em torno ou sob a base do seu objeto, que são fáceis de retirar posteriormente." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" -msgid "" -"Need help improving your prints?
Read the Ultimaker " -"Troubleshooting Guides" -msgstr "Precisa de ajuda para melhorar as suas impressões?
Leia os Guias de resolução de problemas da Ultimaker" +msgid "Need help improving your prints?
Read the Ultimaker Troubleshooting Guides" +msgstr "Precisa de ajuda para melhorar as suas impressões?
Por favor leia os Guias Ultimaker de Resolução de Problemas" #: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 msgctxt "@label %1 is filled in with the name of an extruder" msgid "Print Selected Model with %1" msgid_plural "Print Selected Models with %1" -msgstr[0] "Imprimir modelo selecionado com %1" -msgstr[1] "Imprimir modelos selecionados com %1" +msgstr[0] "Imprimir Modelo Selecionado com o %1" +msgstr[1] "Imprimir Modelos Selecionados com o %1" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:20 msgctxt "@title:window" @@ -4162,10 +4147,8 @@ msgstr "Abrir ficheiro de projeto" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 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 "Este é um ficheiro de projeto Cura. Gostaria de o abrir como um projeto ou importar os modelos a partir dele?" +msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" +msgstr "Este ficheiro é um Projeto do Cura. Pretende abrir como Projeto ou só importar os modelos 3D incluídos no Projeto?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" @@ -4177,10 +4160,15 @@ msgctxt "@action:button" msgid "Import models" msgstr "Importar modelos" +# rever! +# contexto?! +# Relatório? +# Registo de motor? +# use english string? #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:15 msgctxt "@title:window" msgid "Engine Log" -msgstr "Registo de motor" +msgstr "Engine Log" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" @@ -4190,34 +4178,32 @@ msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "Verificar compatibilidade" +msgstr "Verificar compatibilidade dos materiais" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." -msgstr "Clique para verificar a compatibilidade do material em Ultimaker.com." +msgstr "Clique para verificar a compatibilidade dos materiais em Ultimaker.com." #: MachineSettingsAction/plugin.json msgctxt "description" -msgid "" -"Provides a way to change machine settings (such as build volume, nozzle " -"size, etc)" -msgstr "Proporciona uma forma de alterar as definições da máquina (como o volume de construção, o tamanho do bocal etc.)" +msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" +msgstr "Proporciona uma forma de alterar as definições da máquina (tal como o volume de construção, o tamanho do nozzle, etc)" #: MachineSettingsAction/plugin.json msgctxt "name" msgid "Machine Settings action" -msgstr "Ação de definições da máquina" +msgstr "Função Definições da Máquina" #: XRayView/plugin.json msgctxt "description" msgid "Provides the X-Ray view." -msgstr "Fornece a visualização de raio X." +msgstr "Permite a visualização em Raio-X." #: XRayView/plugin.json msgctxt "name" msgid "X-Ray View" -msgstr "Visualização de raio X" +msgstr "Vista Raio-X" #: X3DReader/plugin.json msgctxt "description" @@ -4242,7 +4228,7 @@ msgstr "Gravador de GCode" #: cura-god-mode-plugin/src/GodMode/plugin.json msgctxt "description" msgid "Dump the contents of all settings to a HTML file." -msgstr "Descarregar o conteúdo de todas as definições num ficheiro HTML." +msgstr "Descarregar o conteúdo de todas as definições para um ficheiro HTML." #: cura-god-mode-plugin/src/GodMode/plugin.json msgctxt "name" @@ -4252,23 +4238,26 @@ msgstr "Modo God" #: Doodle3D-cura-plugin/Doodle3D/plugin.json msgctxt "description" msgid "Accepts G-Code and sends them over WiFi to a Doodle3D WiFi-Box." -msgstr "Aceita G-Codes e envia-os por Wi-Fi para uma Wi-Fi box Doodle3D." +msgstr "Recebe ficheiros G-Code e envia-os por Wi-Fi para uma Doodle3D Wi-Fi Box ." #: Doodle3D-cura-plugin/Doodle3D/plugin.json msgctxt "name" msgid "Doodle3D WiFi-Box" -msgstr "Wi-Fi box Doodle3D" +msgstr "Doodle3D Wi-Fi Box" #: ChangeLogPlugin/plugin.json msgctxt "description" msgid "Shows changes since latest checked version." -msgstr "Mostra as alterações efetuadas desde a última versão verificada." +msgstr "Mostra as novas alterações efetuadas desde a última versão." #: ChangeLogPlugin/plugin.json msgctxt "name" msgid "Changelog" -msgstr "Registo de alterações" +msgstr "Lista das Alterações" +# rever! +# contexto! +# flattend - aplanado? nivelado? limpo? basico? #: ProfileFlattener/plugin.json msgctxt "description" msgid "Create a flattend quality changes profile." @@ -4281,8 +4270,7 @@ msgstr "Aplanador de perfis" #: USBPrinting/plugin.json msgctxt "description" -msgid "" -"Accepts G-Code and sends them to a printer. Plugin can also update firmware." +msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware." msgstr "Aceita G-Codes e envia-os para uma impressora. O plug-in também pode atualizar firmware." #: USBPrinting/plugin.json @@ -4313,18 +4301,16 @@ msgstr "Ligação de rede UM3" #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." -msgstr "Procura atualizações de firmware." +msgstr "Procura e verifica se existem atualizações de firmware." #: FirmwareUpdateChecker/plugin.json msgctxt "name" msgid "Firmware Update Checker" -msgstr "Verificador de atualizações de firmware" +msgstr "Verificador Atualizações Firmware" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "" -"Gives you the possibility to open certain files via SolidWorks itself. These " -"are then converted and loaded into Cura" +msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" msgstr "Oferece a possibilidade de abrir determinados ficheiros através do SolidWorks. Estes são posteriormente convertidos e carregados para o Cura" #: CuraSolidWorksPlugin/plugin.json @@ -4335,12 +4321,13 @@ msgstr "SolidWorks Integration" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "Fornece a visualização de simulação." +msgstr "Permite a visualização por camadas." +# rever! #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "Visualização de simulação" +msgstr "Vista Camadas" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4350,27 +4337,27 @@ msgstr "Extensão que permite a utilização de scripts criados pelo utilizador #: PostProcessingPlugin/plugin.json msgctxt "name" msgid "Post Processing" -msgstr "Pós-processamento" +msgstr "Pós-Processamento" #: AutoSave/plugin.json msgctxt "description" msgid "Automatically saves Preferences, Machines and Profiles after changes." -msgstr "Guarda automaticamente preferências, máquinas e perfis após as alterações." +msgstr "Guarda Automaticamente as Preferências, Máquinas e Perfis após fazer alterações." #: AutoSave/plugin.json msgctxt "name" msgid "Auto Save" -msgstr "Guardar automaticamente" +msgstr "Guardar Automaticamente" #: SliceInfoPlugin/plugin.json msgctxt "description" msgid "Submits anonymous slice info. Can be disabled through preferences." -msgstr "Envia informações de segmentação anónimas. Pode ser desativado nas preferências." +msgstr "Envia informações anónimas sobre o seccionamento. Pode ser desativado nas preferências." #: SliceInfoPlugin/plugin.json msgctxt "name" msgid "Slice info" -msgstr "Informações de segmentação" +msgstr "Informações do seccionamento" #: XmlMaterialProfile/plugin.json msgctxt "description" @@ -4380,22 +4367,22 @@ msgstr "Fornece capacidades para ler e gravar perfis de material com base em XML #: XmlMaterialProfile/plugin.json msgctxt "name" msgid "Material Profiles" -msgstr "Perfis de material" +msgstr "Perfis de Materiais" #: LegacyProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from legacy Cura versions." -msgstr "Fornece suporte para importar perfis de versões legadas do Cura." +msgstr "Permite importar perfis de versões antigas do Cura." #: LegacyProfileReader/plugin.json msgctxt "name" msgid "Legacy Cura Profile Reader" -msgstr "Leitor de perfis legados do Cura" +msgstr "Leitor de perfis antigos do Cura" #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." -msgstr "Fornece suporte para importar perfis de ficheiros g-code." +msgstr "Permite importar perfis a partir de ficheiros g-code." #: GCodeProfileReader/plugin.json msgctxt "name" @@ -4475,7 +4462,7 @@ msgstr "Leitor de imagens" #: CuraEngineBackend/plugin.json msgctxt "description" msgid "Provides the link to the CuraEngine slicing backend." -msgstr "Fornece a hiperligação para o back-end de segmentação do CuraEngine." +msgstr "Fornece a hiperligação para o back-end de seccionamento do CuraEngine." #: CuraEngineBackend/plugin.json msgctxt "name" @@ -4485,12 +4472,12 @@ msgstr "Back-end do CuraEngine" #: PerObjectSettingsTool/plugin.json msgctxt "description" msgid "Provides the Per Model Settings." -msgstr "Fornece as definições por modelo." +msgstr "Fornece as definições por-modelo." #: PerObjectSettingsTool/plugin.json msgctxt "name" msgid "Per Model Settings Tool" -msgstr "Ferramenta de definições por modelo" +msgstr "Ferramenta de definições Por-Modelo" #: cura-siemensnx-plugin/plugin.json msgctxt "description" @@ -4525,27 +4512,29 @@ msgstr "Browser de plug-ins" #: SolidView/plugin.json msgctxt "description" msgid "Provides a normal solid mesh view." -msgstr "Fornece uma visualização de malha sólida normal." +msgstr "Permite a visualização (simples) dos objetos como sólidos." #: SolidView/plugin.json msgctxt "name" msgid "Solid View" -msgstr "Visualização sólida" +msgstr "Vista Sólidos" #: GCodeReader/plugin.json msgctxt "description" msgid "Allows loading and displaying G-code files." -msgstr "Permite carregar e apresentar ficheiros G-code." +msgstr "Permite abrir e visualizar ficheiros G-code." #: GCodeReader/plugin.json msgctxt "name" msgid "G-code Reader" msgstr "Leitor de G-code" +# rever! +# Fornece suporte para exportar perfis Cura. #: CuraProfileWriter/plugin.json msgctxt "description" msgid "Provides support for exporting Cura profiles." -msgstr "Fornece suporte para exportar perfis Cura." +msgstr "Possibilita a exportação de perfis do Cura." #: CuraProfileWriter/plugin.json msgctxt "name" @@ -4555,7 +4544,7 @@ msgstr "Gravador de perfis Cura" #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." -msgstr "Fornece suporte para gravar ficheiros 3MF." +msgstr "Possiblita a gravação de ficheiros 3MF." #: 3MFWriter/plugin.json msgctxt "name" @@ -4565,24 +4554,27 @@ msgstr "Gravador 3MF" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "Pergunta uma vez ao utilizador se concorda com a nossa licença" +msgstr "Perguntar, uma vez, ao utilizador, se concorda com a licença" +# rever! +# check the legal term in pt +# licença? +# acordo? +# use the same term for label and description #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "Contrato do utilizador" +msgstr "Contrato de Utilizador" #: UltimakerMachineActions/plugin.json msgctxt "description" -msgid "" -"Provides machine actions for Ultimaker machines (such as bed leveling " -"wizard, selecting upgrades, etc)" -msgstr "Fornece ações automáticas para as máquinas Ultimaker (como assistentes de nivelamento da base, seleção de atualizações etc.)" +msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" +msgstr "Disponibiliza ações especificas para as máquinas Ultimaker (tais como, assistente de nivelamento da base, seleção de atualizações etc.)" #: UltimakerMachineActions/plugin.json msgctxt "name" msgid "Ultimaker machine actions" -msgstr "Ações automáticas da Ultimaker" +msgstr "Ações para impressoras Ultimaker" #: CuraProfileReader/plugin.json msgctxt "description" @@ -4592,4 +4584,4 @@ msgstr "Fornece suporte para importar perfis Cura." #: CuraProfileReader/plugin.json msgctxt "name" msgid "Cura Profile Reader" -msgstr "Leitor de perfis Cura" +msgstr "Leitor de Perfis Cura" diff --git a/resources/i18n/pt_PT/fdmextruder.def.json.po b/resources/i18n/pt_PT/fdmextruder.def.json.po index 852fe4d562..a77b31c6e9 100644 --- a/resources/i18n/pt_PT/fdmextruder.def.json.po +++ b/resources/i18n/pt_PT/fdmextruder.def.json.po @@ -2,20 +2,21 @@ # 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 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-12-07 13:41+0100\n" -"Last-Translator: Bothof \n" +"PO-Revision-Date: 2018-01-23 19:35+0000\n" +"Last-Translator: Paulo Miranda \n" "Language-Team: Bothof\n" "Language: pt_PT\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.5\n" #: fdmextruder.def.json msgctxt "machine_settings label" @@ -30,155 +31,152 @@ msgstr "Definições específicas da máquina" #: fdmextruder.def.json msgctxt "extruder_nr label" msgid "Extruder" -msgstr "Extrusora" +msgstr "Extrusor" #: fdmextruder.def.json msgctxt "extruder_nr description" msgid "The extruder train used for printing. This is used in multi-extrusion." -msgstr "A máquina extrusora utilizada para imprimir. Esta é utilizada em extrusões múltiplas." +msgstr "O núcleos de extrusão utilizado para imprimir. Definição usada com múltiplos extrusores." #: fdmextruder.def.json msgctxt "machine_nozzle_id label" msgid "Nozzle ID" -msgstr "ID do bocal" +msgstr "ID do Nozzle" #: fdmextruder.def.json msgctxt "machine_nozzle_id description" msgid "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\"." -msgstr "A ID do bocal para uma máquina de extrusão, tal como \"AA 0.4\" e \"BB 0.8\"." +msgstr "O ID do nozzle de um núcleo de extrusão, tal como \"AA 0.4\" e \"BB 0.8\"." #: fdmextruder.def.json msgctxt "machine_nozzle_size label" msgid "Nozzle Diameter" -msgstr "Diâmetro do bocal" +msgstr "Diâmetro do Nozzle" #: 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 "O diâmetro interno do bocal. Altere esta definição ao utilizar um tamanho de bocal não convencional." +msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size." +msgstr "" +"O diâmetro interno do nozzle. Altere esta definição quando utilizar um nozzle com um tamanho não convencional." #: fdmextruder.def.json msgctxt "machine_nozzle_offset_x label" msgid "Nozzle X Offset" -msgstr "Desvio X do bocal" +msgstr "Desvio X do Nozzle" #: fdmextruder.def.json msgctxt "machine_nozzle_offset_x description" msgid "The x-coordinate of the offset of the nozzle." -msgstr "A coordenada X do desvio do bocal." +msgstr "A coordenada X do desvio do nozzle." #: fdmextruder.def.json msgctxt "machine_nozzle_offset_y label" msgid "Nozzle Y Offset" -msgstr "Desvio Y do bocal" +msgstr "Desvio Y do Nozzle" #: fdmextruder.def.json msgctxt "machine_nozzle_offset_y description" msgid "The y-coordinate of the offset of the nozzle." -msgstr "A coordenada Y do desvio do bocal." +msgstr "A coordenada Y do desvio do nozzle." #: fdmextruder.def.json msgctxt "machine_extruder_start_code label" msgid "Extruder Start G-Code" -msgstr "G-Code inicial da extrusora" +msgstr "G-Code Inicial do Extrusor" #: fdmextruder.def.json msgctxt "machine_extruder_start_code description" msgid "Start g-code to execute whenever turning the extruder on." -msgstr "G-Code inicial a ser executado sempre que a extrusora for ligada." +msgstr "G-Code inicial a ser executado sempre que o extrusor for ligado." #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_abs label" msgid "Extruder Start Position Absolute" -msgstr "Posição inicial absoluta da extrusora" +msgstr "Posição Inicial Absoluta do Extrusor" #: 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 "Torne a posição inicial da extrusora absoluta em vez de relativa à última posição conhecida da cabeça." +msgid "Make the extruder starting position absolute rather than relative to the last-known location of the head." +msgstr "" +"Define a posição inicial do extrusor, absoluta em vez de relativa à última posição conhecida da cabeça de " +"impressão." #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_x label" msgid "Extruder Start Position X" -msgstr "X da posição inicial da extrusora" +msgstr "Posição X Inicial do Extrusor" #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_x description" msgid "The x-coordinate of the starting position when turning the extruder on." -msgstr "A coordenada X da posição inicial ao ligar a extrusora." +msgstr "A coordenada X da posição inicial ao ligar o extrusor." #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_y label" msgid "Extruder Start Position Y" -msgstr "Y da posição inicial da extrusora" +msgstr "Posição Y Inicial do Extrusor" #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_y description" msgid "The y-coordinate of the starting position when turning the extruder on." -msgstr "A coordenada Y da posição inicial ao ligar a extrusora." +msgstr "A coordenada Y da posição inicial ao ligar o extrusor." #: fdmextruder.def.json msgctxt "machine_extruder_end_code label" msgid "Extruder End G-Code" -msgstr "G-Code final da extrusora" +msgstr "G-Code Final do Extrusor" #: fdmextruder.def.json msgctxt "machine_extruder_end_code description" msgid "End g-code to execute whenever turning the extruder off." -msgstr "G-Code final a ser executado sempre que a extrusora for desligada." +msgstr "G-Code final a ser executado sempre que o extrusor for desligado." #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_abs label" msgid "Extruder End Position Absolute" -msgstr "Posição final absoluta da extrusora" +msgstr "Posição Final Absoluta do Extrusor" #: 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 "Torne a posição final da extrusora absoluta em vez de relativa à última localização conhecida da cabeça." +msgid "Make the extruder ending position absolute rather than relative to the last-known location of the head." +msgstr "" +"Define a posição final do extrusor, absoluta em vez de relativa à última posição conhecida da cabeça de " +"impressão." #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_x label" msgid "Extruder End Position X" -msgstr "X da posição final da extrusora" +msgstr "Posição X Final do Extrusor" #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_x description" msgid "The x-coordinate of the ending position when turning the extruder off." -msgstr "A coordenada X da posição final ao desligar a extrusora." +msgstr "A coordenada X da posição final ao desligar o extrusor." #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_y label" msgid "Extruder End Position Y" -msgstr "Y da posição final da extrusora" +msgstr "Posição Y Final do Extrusor" #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_y description" msgid "The y-coordinate of the ending position when turning the extruder off." -msgstr "A coordenada Y da posição final ao desligar a extrusora." +msgstr "A coordenada Y da posição final ao desligar o extrusor." #: fdmextruder.def.json msgctxt "extruder_prime_pos_z label" msgid "Extruder Prime Z Position" -msgstr "Posição Z de preparação da extrusora" +msgstr "Posição Z Preparação do Extrusor" #: 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 "A coordenada Z da posição de preparação do bocal ao iniciar a impressão." +msgid "The Z coordinate of the position where the nozzle primes at the start of printing." +msgstr "A coordenada Z da posição onde o nozzle é preparado ao iniciar a impressão." #: fdmextruder.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" -msgstr "Aderência à placa de construção" +msgstr "Aderência Base Construção" #: fdmextruder.def.json msgctxt "platform_adhesion description" @@ -188,23 +186,19 @@ msgstr "Aderência" #: fdmextruder.def.json msgctxt "extruder_prime_pos_x label" msgid "Extruder Prime X Position" -msgstr "Posição X de preparação da extrusora" +msgstr "Posição X Preparação do Extrusor" #: 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 "A coordenada X da posição de preparação do bocal ao iniciar a impressão." +msgid "The X coordinate of the position where the nozzle primes at the start of printing." +msgstr "A coordenada X da posição onde o nozzle é preparado ao iniciar a impressão." #: fdmextruder.def.json msgctxt "extruder_prime_pos_y label" msgid "Extruder Prime Y Position" -msgstr "Posição Y de preparação da extrusora" +msgstr "Posição Y Preparação do Extrusor" #: 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 "A coordenada Y da posição de preparação do bocal ao iniciar a impressão." +msgid "The Y coordinate of the position where the nozzle primes at the start of printing." +msgstr "A coordenada Y da posição onde o nozzle é preparado ao iniciar a impressão." diff --git a/resources/i18n/pt_PT/fdmprinter.def.json.po b/resources/i18n/pt_PT/fdmprinter.def.json.po index d7385d9584..d72abef2fd 100644 --- a/resources/i18n/pt_PT/fdmprinter.def.json.po +++ b/resources/i18n/pt_PT/fdmprinter.def.json.po @@ -2,20 +2,22 @@ # 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 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-12-07 13:41+0100\n" -"Last-Translator: Bothof \n" +"PO-Revision-Date: 2018-01-23 19:42+0000\n" +"Last-Translator: Paulo Miranda \n" "Language-Team: Bothof\n" "Language: pt_PT\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.5\n" +"X-Poedit-Bookmarks: 111,-1,-1,-1,-1,-1,-1,-1,-1,-1\n" #: fdmprinter.def.json msgctxt "machine_settings label" @@ -44,107 +46,101 @@ msgstr "Mostrar variantes da máquina" #: 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." +msgid "Whether to show the different variants of this machine, which are described in separate json files." msgstr "Mostrar ou não as diferentes variantes desta máquina, as quais são descritas em ficheiros json separados." #: fdmprinter.def.json msgctxt "machine_start_gcode label" msgid "Start GCode" -msgstr "GCode inicial" +msgstr "GCode Inicial" #: fdmprinter.def.json msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "Comandos Gcode a serem executados no início – separados por \n." +msgstr "" +"Comandos Gcode a serem executados no início – separados por \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" msgid "End GCode" -msgstr "GCode final" +msgstr "GCode Final" #: fdmprinter.def.json msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "Comandos Gcode a serem executados no fim – separados por \n." +msgstr "" +"Comandos Gcode a serem executados no fim – separados por \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" msgid "Material GUID" -msgstr "GUID de material" +msgstr "GUID do material" #: fdmprinter.def.json msgctxt "material_guid description" msgid "GUID of the material. This is set automatically. " -msgstr "GUID do material. Isto é definido automaticamente. " +msgstr "GUID do material. Este é definido automaticamente. " #: fdmprinter.def.json msgctxt "material_bed_temp_wait label" msgid "Wait for Build Plate Heatup" -msgstr "Aguardar pelo aquecimento da placa de construção" +msgstr "Esperar pelo Aquecimento da Base de Construção" #: 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 "Introduzir ou não um comando para aguardar até que a temperatura da placa de construção seja atingida durante o arranque." +msgid "Whether to insert a command to wait until the build plate temperature is reached at the start." +msgstr "Introduzir ou não um comando para esperar até que a temperatura da base de construção seja atingida durante o arranque." #: fdmprinter.def.json msgctxt "material_print_temp_wait label" msgid "Wait for Nozzle Heatup" -msgstr "Aguardar pelo aquecimento do bocal" +msgstr "Esperar pelo Aquecimento do Nozzle" #: fdmprinter.def.json msgctxt "material_print_temp_wait description" msgid "Whether to wait until the nozzle temperature is reached at the start." -msgstr "Aguardar ou não até que a temperatura do bocal seja atingida durante o arranque." +msgstr "Esperar ou não até que a temperatura do nozzle seja atingida durante o arranque." #: fdmprinter.def.json msgctxt "material_print_temp_prepend label" msgid "Include Material Temperatures" -msgstr "Incluir temperaturas do material" +msgstr "Incluir Temperaturas do Material" #: 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 "Incluir ou não os comandos de temperatura do bocal no início do gcode. Se o gcode_inicial já contiver os comandos de temperatura do bocal, o front-end do Cura desativará automaticamente esta definição." +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 "Incluir ou não os comandos de temperatura do nozzle no início do gcode. Se o gcode_inicial já incluir os comandos de temperatura do nozzle, o front-end do Cura desativará automaticamente esta definição." #: fdmprinter.def.json msgctxt "material_bed_temp_prepend label" msgid "Include Build Plate Temperature" -msgstr "Incluir temperatura da placa de construção" +msgstr "Incluir Temperatura da Base de Construção" #: 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 "Incluir ou não os comandos de temperatura da placa de construção no início do gcode. Se o gcode_inicial já contiver os comandos de temperatura da placa de construção, o front-end do Cura desativará automaticamente esta definição." +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 "Incluir ou não os comandos de temperatura da base de construção no início do gcode. Se o gcode_inicial já incluir os comandos de temperatura da base de construção, o front-end do Cura desativará automaticamente esta definição." #: fdmprinter.def.json msgctxt "machine_width label" msgid "Machine Width" -msgstr "Largura da máquina" +msgstr "Largura da Máquina" #: fdmprinter.def.json msgctxt "machine_width description" msgid "The width (X-direction) of the printable area." -msgstr "A largura (direção X) da área de impressão." +msgstr "O diâmetro (direção X) da área de impressão." #: fdmprinter.def.json msgctxt "machine_depth label" msgid "Machine Depth" -msgstr "Profundidade da máquina" +msgstr "Profundidade da Máquina" #: fdmprinter.def.json msgctxt "machine_depth description" @@ -154,18 +150,17 @@ msgstr "A profundidade (direção Y) da área de impressão." #: fdmprinter.def.json msgctxt "machine_shape label" msgid "Build Plate Shape" -msgstr "Forma da placa de construção" +msgstr "Forma da Base de Construção" #: fdmprinter.def.json msgctxt "machine_shape description" -msgid "" -"The shape of the build plate without taking unprintable areas into account." -msgstr "A forma da placa de construção sem ter em consideração as áreas não imprimíveis." +msgid "The shape of the build plate without taking unprintable areas into account." +msgstr "A forma da base de construção sem ter em consideração as áreas onde não é possível imprimir." #: fdmprinter.def.json msgctxt "machine_shape option rectangular" msgid "Rectangular" -msgstr "Retangular" +msgstr "Rectangular" #: fdmprinter.def.json msgctxt "machine_shape option elliptic" @@ -175,7 +170,7 @@ msgstr "Elíptica" #: fdmprinter.def.json msgctxt "machine_height label" msgid "Machine Height" -msgstr "Altura da máquina" +msgstr "Altura da Máquina" #: fdmprinter.def.json msgctxt "machine_height description" @@ -185,70 +180,64 @@ msgstr "A altura (direção Z) da área de impressão." #: fdmprinter.def.json msgctxt "machine_heated_bed label" msgid "Has Heated Build Plate" -msgstr "Contém placa de construção aquecida" +msgstr "Tem Base de Construção Aquecida" #: fdmprinter.def.json msgctxt "machine_heated_bed description" msgid "Whether the machine has a heated build plate present." -msgstr "Se a máquina contém ou não uma placa de construção aquecida." +msgstr "Se a máquina tem ou não uma base de construção aquecida." #: fdmprinter.def.json msgctxt "machine_center_is_zero label" msgid "Is Center Origin" -msgstr "O centro é a origem" +msgstr "O Centro é a Origem" #: 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 "Se as coordenadas X/Y da posição zero da impressora se encontram no centro da área de impressão." +msgid "Whether the X/Y coordinates of the zero position of the printer is at the center of the printable area." +msgstr "Se as coordenadas X/Y da posição zero (origem) da impressora são o centro da área de impressão." #: fdmprinter.def.json msgctxt "machine_extruder_count label" msgid "Number of Extruders" -msgstr "Número de extrusoras" +msgstr "Número de Extrusores" +# train? +# nucleo? #: 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 "Número de máquinas de extrusão. Uma máquina de extrusão é a combinação de um alimentador, de um tubo Bowden e de um bocal." +msgid "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle." +msgstr "Número de núcleos de extrusão. Um núcleo de extrusão é o conjunto de um alimentador (feeder), tubo bowden e nozzle." #: fdmprinter.def.json msgctxt "machine_nozzle_tip_outer_diameter label" msgid "Outer nozzle diameter" -msgstr "Diâmetro externo do bocal" +msgstr "Diâmetro externo do nozzle" #: fdmprinter.def.json msgctxt "machine_nozzle_tip_outer_diameter description" msgid "The outer diameter of the tip of the nozzle." -msgstr "O diâmetro externo da ponta do bocal." +msgstr "O diâmetro externo da ponta do nozzle." #: fdmprinter.def.json msgctxt "machine_nozzle_head_distance label" msgid "Nozzle length" -msgstr "Comprimento do bocal" +msgstr "Comprimento do nozzle" #: 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 "A diferença de altura entre a ponta do bocal e o extremo inferior da cabeça de impressão." +msgid "The height difference between the tip of the nozzle and the lowest part of the print head." +msgstr "A diferença de altura entre a ponta do nozzle e o extremo inferior da cabeça de impressão." #: fdmprinter.def.json msgctxt "machine_nozzle_expansion_angle label" msgid "Nozzle angle" -msgstr "Ângulo do bocal" +msgstr "Ângulo do nozzle" #: 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 "O ângulo entre o plano horizontal e a peça cónica imediatamente acima da ponta do bocal." +msgid "The angle between the horizontal plane and the conical part right above the tip of the nozzle." +msgstr "O ângulo entre o plano horizontal e a parte cónica imediatamente acima da ponta do nozzle." #: fdmprinter.def.json msgctxt "machine_heat_zone_length label" @@ -257,76 +246,66 @@ msgstr "Comprimento da zona de aquecimento" #: 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 "A distância a partir da ponta do bocal à qual o calor do bocal é transferido para o filamento." +msgid "The distance from the tip of the nozzle in which heat from the nozzle is transferred to the filament." +msgstr "A distância, a partir da ponta do nozzle, na qual o calor do nozzle é transferido para o filamento." #: fdmprinter.def.json msgctxt "machine_filament_park_distance label" msgid "Filament Park Distance" -msgstr "Distância de estacionamento do filamento" +msgstr "Distância de \"estacionamento\" do filamento" #: 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 "A distância a partir da ponta do bocal à qual o filamento deve ser estacionado quando já não existe uma extrusora em utilização." +msgid "The distance from the tip of the nozzle where to park the filament when an extruder is no longer used." +msgstr "A distância, a partir da ponta do nozzle, à qual o filamento deve ser \"estacionado\" quando um extrusor já não está em utilização." #: fdmprinter.def.json msgctxt "machine_nozzle_temp_enabled label" msgid "Enable Nozzle Temperature Control" -msgstr "Ativar controlo de temperatura do bocal" +msgstr "Ativar Controlo da Temperatura do Nozzle" #: 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 "Controlar ou não a temperatura a partir do Cura. Desative esta opção para controlar a temperatura do bocal a partir de fora do Cura." +msgid "Whether to control temperature from Cura. Turn this off to control nozzle temperature from outside of Cura." +msgstr "Controlar ou não a temperatura a partir do Cura. Desative esta opção para controlar a temperatura do nozzle a partir de fora do Cura." #: fdmprinter.def.json msgctxt "machine_nozzle_heat_up_speed label" msgid "Heat up speed" msgstr "Velocidade de aquecimento" +# intervalo? #: 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 "A velocidade média (°C/s) a que o bocal é aquecido calculada no intervalo entre as temperaturas normais de impressão e a temperatura de espera." +msgid "The speed (°C/s) by which the nozzle heats up averaged over the window of normal printing temperatures and the standby temperature." +msgstr "A velocidade média (°C/s) a que o nozzle é aquecido, calculada no intervalo entre as temperaturas normais de impressão e a temperatura de espera." #: fdmprinter.def.json msgctxt "machine_nozzle_cool_down_speed label" msgid "Cool down speed" msgstr "Velocidade de arrefecimento" +# intervalo? #: 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 "A velocidade média (°C/s) a que o bocal arrefece calculada no intervalo entre as temperaturas normais de impressão e a temperatura de espera." +msgid "The speed (°C/s) by which the nozzle cools down averaged over the window of normal printing temperatures and the standby temperature." +msgstr "A velocidade média (°C/s) a que o nozzle arrefece, calculada no intervalo entre as temperaturas normais de impressão e a temperatura em modo de espera." #: fdmprinter.def.json msgctxt "machine_min_cool_heat_time_window label" msgid "Minimal Time Standby Temperature" -msgstr "Tempo mínimo para temperatura de espera" +msgstr "Tempo Mínimo da Temperatura em Modo de Espera" #: 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 "O tempo mínimo durante o qual uma extrusora tem de estar inativa antes de o bocal arrefecer. Apenas é permitido arrefecer até à temperatura de espera quando uma extrusora não for utilizada durante um período de tempo superior a este." +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 "O tempo mínimo durante o qual um extrusor tem de estar inativo antes de o nozzle ser arrefecido. Apenas é permitido começar a arrefecer até à temperatura de Modo de Espera quando um extrusor não for utilizado por um período de tempo superior a este." +# variedade ou especie ou tipo? #: fdmprinter.def.json msgctxt "machine_gcode_flavor label" msgid "Gcode flavour" -msgstr "Padrão de Gcode" +msgstr "Variedade de Gcode" #: fdmprinter.def.json msgctxt "machine_gcode_flavor description" @@ -341,7 +320,7 @@ msgstr "Marlin" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option RepRap (Volumetric)" msgid "Marlin (Volumetric)" -msgstr "Marlin (volumétrico)" +msgstr "Marlin (Volumétrico)" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option RepRap (RepRap)" @@ -391,12 +370,12 @@ msgstr "Uma lista de polígonos com áreas onde a cabeça de impressão não pod #: fdmprinter.def.json msgctxt "nozzle_disallowed_areas label" msgid "Nozzle Disallowed Areas" -msgstr "Áreas não permitidas do bocal" +msgstr "Áreas não permitidas ao nozzle" #: fdmprinter.def.json msgctxt "nozzle_disallowed_areas description" msgid "A list of polygons with areas the nozzle is not allowed to enter." -msgstr "Uma lista de polígonos com áreas onde o bocal não pode entrar." +msgstr "Uma lista de polígonos com áreas onde o nozzle não pode entrar." #: fdmprinter.def.json msgctxt "machine_head_polygon label" @@ -406,17 +385,17 @@ msgstr "Polígono da cabeça da máquina" #: fdmprinter.def.json msgctxt "machine_head_polygon description" msgid "A 2D silhouette of the print head (fan caps excluded)." -msgstr "Uma silhueta 2D da cabeça de impressão (excluindo as tampas da ventoinha)." +msgstr "Uma silhueta 2D da cabeça de impressão (excluindo tampas do(s) ventilador(s))." #: fdmprinter.def.json msgctxt "machine_head_with_fans_polygon label" msgid "Machine head & Fan polygon" -msgstr "Polígono da cabeça e da ventoinha da máquina" +msgstr "Polígono da cabeça e ventilador da máquina" #: fdmprinter.def.json msgctxt "machine_head_with_fans_polygon description" msgid "A 2D silhouette of the print head (fan caps included)." -msgstr "Uma silhueta 2D da cabeça de impressão (incluindo as tampas da ventoinha)." +msgstr "Uma silhueta 2D da cabeça de impressão (incluindo tampas do(s) ventilador(s))." #: fdmprinter.def.json msgctxt "gantry_height label" @@ -425,101 +404,93 @@ msgstr "Altura do pórtico" #: 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 "A diferença de altura entre a ponta do bocal e o sistema de pórtico (eixos X e Y)." +msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes)." +msgstr "A diferença de altura entre a ponta do nozzle e o sistema de pórtico (eixos X e Y)." #: fdmprinter.def.json msgctxt "machine_nozzle_id label" msgid "Nozzle ID" -msgstr "ID do bocal" +msgstr "ID do Nozzle" #: fdmprinter.def.json msgctxt "machine_nozzle_id description" msgid "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\"." -msgstr "A ID do bocal para uma máquina de extrusão, tal como \"AA 0.4\" e \"BB 0.8\"." +msgstr "O ID do nozzle de um núcleo de extrusão, tal como \"AA 0.4\" e \"BB 0.8\"." #: fdmprinter.def.json msgctxt "machine_nozzle_size label" msgid "Nozzle Diameter" -msgstr "Diâmetro do bocal" +msgstr "Diâmetro do Nozzle" #: 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 "O diâmetro interno do bocal. Altere esta definição ao utilizar um tamanho de bocal não convencional." +msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size." +msgstr "O diâmetro interno do nozzle. Altere esta definição quando utilizar um nozzle com um tamanho não convencional." #: fdmprinter.def.json msgctxt "machine_use_extruder_offset_to_offset_coords label" msgid "Offset With Extruder" -msgstr "Desvio da extrusora" +msgstr "Desviar com Extrusor" #: fdmprinter.def.json msgctxt "machine_use_extruder_offset_to_offset_coords description" msgid "Apply the extruder offset to the coordinate system." -msgstr "Aplique o desvio da extrusora ao sistema de coordenadas." +msgstr "Aplicar o desvio do extrusor ao sistema de coordenadas." #: fdmprinter.def.json msgctxt "extruder_prime_pos_z label" msgid "Extruder Prime Z Position" -msgstr "Posição Z de preparação da extrusora" +msgstr "Posição Z para Preparação Extrusor" #: 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 "A coordenada Z da posição de preparação do bocal ao iniciar a impressão." +msgid "The Z coordinate of the position where the nozzle primes at the start of printing." +msgstr "A coordenada Z da posição onde fazer a preparação do nozzle no inicio da impressão." #: fdmprinter.def.json msgctxt "extruder_prime_pos_abs label" msgid "Absolute Extruder Prime Position" -msgstr "Posição absoluta de preparação da extrusora" +msgstr "Posição Absoluta Preparação Extrusor" #: 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 "Torne a posição de preparação da extrusora absoluta em vez de relativa à última posição conhecida da cabeça." +msgid "Make the extruder prime position absolute rather than relative to the last-known location of the head." +msgstr "Definir como absoluta, a posição para a preparação do extrusor, em vez de relativa à última posição conhecida da cabeça." #: fdmprinter.def.json msgctxt "machine_max_feedrate_x label" msgid "Maximum Speed X" -msgstr "Velocidade X máxima" +msgstr "Velocidade X Máxima" #: fdmprinter.def.json msgctxt "machine_max_feedrate_x description" msgid "The maximum speed for the motor of the X-direction." -msgstr "A velocidade máxima do motor na direção X." +msgstr "A velocidade máxima do motor da direção X." #: fdmprinter.def.json msgctxt "machine_max_feedrate_y label" msgid "Maximum Speed Y" -msgstr "Velocidade Y máxima" +msgstr "Velocidade Y Máxima" #: fdmprinter.def.json msgctxt "machine_max_feedrate_y description" msgid "The maximum speed for the motor of the Y-direction." -msgstr "A velocidade máxima do motor na direção Y." +msgstr "A velocidade máxima do motor da direção Y." #: fdmprinter.def.json msgctxt "machine_max_feedrate_z label" msgid "Maximum Speed Z" -msgstr "Velocidade Z máxima" +msgstr "Velocidade Z Máxima" #: fdmprinter.def.json msgctxt "machine_max_feedrate_z description" msgid "The maximum speed for the motor of the Z-direction." -msgstr "A velocidade máxima do motor na direção Z." +msgstr "A velocidade máxima do motor da direção Z." #: fdmprinter.def.json msgctxt "machine_max_feedrate_e label" msgid "Maximum Feedrate" -msgstr "Velocidade máxima de alimentação" +msgstr "Velocidade Máxima de Alimentação" #: fdmprinter.def.json msgctxt "machine_max_feedrate_e description" @@ -529,37 +500,37 @@ msgstr "A velocidade máxima do filamento." #: fdmprinter.def.json msgctxt "machine_max_acceleration_x label" msgid "Maximum Acceleration X" -msgstr "Aceleração X máxima" +msgstr "Aceleração X Máxima" #: fdmprinter.def.json msgctxt "machine_max_acceleration_x description" msgid "Maximum acceleration for the motor of the X-direction" -msgstr "A aceleração máxima do motor na direção X" +msgstr "A aceleração máxima do motor da direção X" #: fdmprinter.def.json msgctxt "machine_max_acceleration_y label" msgid "Maximum Acceleration Y" -msgstr "Aceleração Y máxima" +msgstr "Aceleração Y Máxima" #: fdmprinter.def.json msgctxt "machine_max_acceleration_y description" msgid "Maximum acceleration for the motor of the Y-direction." -msgstr "A aceleração máxima do motor na direção Y." +msgstr "A aceleração máxima do motor da direção Y." #: fdmprinter.def.json msgctxt "machine_max_acceleration_z label" msgid "Maximum Acceleration Z" -msgstr "Aceleração Z máxima" +msgstr "Aceleração Z Máxima" #: fdmprinter.def.json msgctxt "machine_max_acceleration_z description" msgid "Maximum acceleration for the motor of the Z-direction." -msgstr "A aceleração máxima do motor na direção Z." +msgstr "A aceleração máxima do motor da direção Z." #: fdmprinter.def.json msgctxt "machine_max_acceleration_e label" msgid "Maximum Filament Acceleration" -msgstr "Aceleração máxima do filamento" +msgstr "Aceleração Máxima do Filamento" #: fdmprinter.def.json msgctxt "machine_max_acceleration_e description" @@ -569,7 +540,7 @@ msgstr "A aceleração máxima do motor do filamento." #: fdmprinter.def.json msgctxt "machine_acceleration label" msgid "Default Acceleration" -msgstr "Aceleração predefinida" +msgstr "Aceleração Predefinida" #: fdmprinter.def.json msgctxt "machine_acceleration description" @@ -579,38 +550,39 @@ msgstr "A aceleração predefinida do movimento da cabeça de impressão." #: fdmprinter.def.json msgctxt "machine_max_jerk_xy label" msgid "Default X-Y Jerk" -msgstr "Solavanco X-Y predefinido" +msgstr "Jerk X-Y Predefinido" #: fdmprinter.def.json msgctxt "machine_max_jerk_xy description" msgid "Default jerk for movement in the horizontal plane." -msgstr "O solavanco predefinido do movimento no plano horizontal." +msgstr "O jerk predefinido do movimento no plano horizontal." #: fdmprinter.def.json msgctxt "machine_max_jerk_z label" msgid "Default Z Jerk" -msgstr "Solavanco Z predefinido" +msgstr "Jerk Z Predefinido" #: fdmprinter.def.json msgctxt "machine_max_jerk_z description" msgid "Default jerk for the motor of the Z-direction." -msgstr "O solavanco predefinido do motor na direção Z." +msgstr "O jerk predefinido do motor da direção Z." #: fdmprinter.def.json msgctxt "machine_max_jerk_e label" msgid "Default Filament Jerk" -msgstr "Solavanco predefinido do filamento" +msgstr "Jerk Predefinido do Filamento" #: fdmprinter.def.json msgctxt "machine_max_jerk_e description" msgid "Default jerk for the motor of the filament." -msgstr "O solavanco predefinido do motor do filamento." +msgstr "O jerk predefinido do motor do filamento." #: fdmprinter.def.json msgctxt "machine_minimum_feedrate label" msgid "Minimum Feedrate" -msgstr "Velocidade mínima de alimentação" +msgstr "Velocidade Mínima de Alimentação" +# english string correct? #: fdmprinter.def.json msgctxt "machine_minimum_feedrate description" msgid "The minimal movement speed of the print head." @@ -623,51 +595,42 @@ msgstr "Qualidade" #: 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 "Todas as definições que influenciam a resolução da impressão. Estas definições têm um grande impacto na qualidade (e no tempo de impressão)." +msgid "All settings that influence the resolution of the print. These settings have a large impact on the quality (and print time)" +msgstr "Todas as definições que influenciam a resolução da impressão. Estas definições têm um grande impacto na qualidade. (e no tempo de impressão)." #: fdmprinter.def.json msgctxt "layer_height label" msgid "Layer Height" -msgstr "Altura da camada" +msgstr "Espessura das Camadas (Layers)" +# Valores? ou numeros? ou espessura? +# mais elevadas ou maiores? #: 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 "A altura de cada camada em mm. Valores mais elevados produzem impressões mais rápidas com menor resolução e valores mais baixos produzem impressões mais lentas com maior resolução." +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 "A espessura de cada camada em milímetros. Espessuras maiores produzem impressões rápidas com baixa resolução, e, espessuras pequenas, produzem impressões mais lentas mas com uma maior resolução/qualidade." #: fdmprinter.def.json msgctxt "layer_height_0 label" msgid "Initial Layer Height" -msgstr "Altura da camada inicial" +msgstr "Espessura da Camada Inicial" #: 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 "A altura da camada inicial em mm. Uma camada inicial mais espessa facilita a aderência à placa de construção." +msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." +msgstr "A espessura da camada inicial em milímetros. Uma camada inicial mais espessa facilita a aderência à base de construção." #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "Tolerância da segmentação" +msgstr "Tolerância do Seccionamento" +# rever! +# centro ou meio? #: fdmprinter.def.json msgctxt "slicing_tolerance description" -msgid "" -"How to slice layers with diagonal surfaces. The areas of a layer can be " -"generated based on where the middle of the layer intersects the surface " -"(Middle). Alternatively each layer can have the areas which fall inside of " -"the volume throughout the height of the layer (Exclusive) or a layer has the " -"areas which fall inside anywhere within the layer (Inclusive). Exclusive " -"retains the most details, Inclusive makes for the best fit and Middle takes " -"the least time to process." -msgstr "Como segmentar camadas com superfícies diagonais. As áreas de uma camada podem ser geradas com base no local onde o centro da camada se cruza com a superfície (Centro). Como alternativa, cada camada pode conter as áreas que se encontram no interior do volume da altura da camada (Exclusivo) ou as áreas que se encontram no interior de qualquer parte da camada (Inclusivo). A opção Exclusivo retém o maior número de detalhes, a opção Inclusivo garante o melhor ajuste e a opção Centro tem o menor tempo de processamento." +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "Métodos para seccionar as camadas com as superfícies diagonais. As áreas de uma camada podem ser geradas onde o centro da camada intersecta a superfície (Centro). Como alternativa, cada camada pode conter as áreas que se encontram no interior do volume ao longo da espessura da camada (Exclusivo) ou uma camada pode conter as áreas que se encontram no interior dos perímetros da camada (Inclusivo). A opção Exclusivo retém o maior número de detalhes, a opção Inclusivo garante a melhor adaptação ao modelo e a opção Centro tem o menor tempo de processamento." #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" @@ -684,269 +647,252 @@ msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" msgstr "Inclusivo" +# rever! +# Diâmetro da linha? +# ou +# Largura da linha? #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" -msgstr "Largura da linha" +msgstr "Diâmetro da Linha" #: 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 "A largura de uma única linha. Normalmente, a largura de cada linha deve corresponder à largura do bocal. No entanto, reduzir ligeiramente este valor pode produzir melhores impressões." +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 "O diâmetro (largura) de uma única linha. Normalmente, o diâmetro de cada linha deve corresponder ao diâmetro do nozzle. No entanto, reduzir ligeiramente este valor pode produzir melhores impressões." #: fdmprinter.def.json msgctxt "wall_line_width label" msgid "Wall Line Width" -msgstr "Largura da linha de parede" +msgstr "Diâmetro Linha Parede" #: fdmprinter.def.json msgctxt "wall_line_width description" msgid "Width of a single wall line." -msgstr "A largura de uma única linha de parede." +msgstr "O diâmetro de uma única linha de parede." #: fdmprinter.def.json msgctxt "wall_line_width_0 label" msgid "Outer Wall Line Width" -msgstr "Largura da linha de parede externa" +msgstr "Diâmetro Linha Parede Exterior" #: 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 "A largura da linha de parede mais externa. Ao reduzir este valor, é possível imprimir com maior nível de detalhe." +msgid "Width of the outermost wall line. By lowering this value, higher levels of detail can be printed." +msgstr "O diâmetro da linha de parede mais exterior. Ao reduzir este valor, é possível imprimir com maior nível de detalhe." #: fdmprinter.def.json msgctxt "wall_line_width_x label" msgid "Inner Wall(s) Line Width" -msgstr "Largura da linha de parede(s) interna" +msgstr "Diâmetro Linha Parede(s) Interior" #: 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 "A largura de uma única linha de parede para todas as linhas de parede exceto a mais externa." +msgid "Width of a single wall line for all wall lines except the outermost one." +msgstr "O diâmetro de uma única linha de parede para todas as linhas de parede excepto a mais exterior." #: fdmprinter.def.json msgctxt "roofing_line_width label" msgid "Top Surface Skin Line Width" -msgstr "Largura da linha de revestimento da superfície superior" +msgstr "Diâmetro Linha Revestimento Superior" #: fdmprinter.def.json msgctxt "roofing_line_width description" msgid "Width of a single line of the areas at the top of the print." -msgstr "A largura de uma única linha das áreas na parte superior da impressão." +msgstr "O diâmetro de uma única linha das superfícies de revestimento na parte superior da impressão." #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" -msgstr "Largura da linha superior/inferior" +msgstr "Diâmetro Linha Superior / Inferior" #: fdmprinter.def.json msgctxt "skin_line_width description" msgid "Width of a single top/bottom line." -msgstr "A largura de uma única linha superior/inferior." +msgstr "O diâmetro de uma única linha das superfícies superior/inferior." #: fdmprinter.def.json msgctxt "infill_line_width label" msgid "Infill Line Width" -msgstr "Largura da linha de preenchimento" +msgstr "Diâmetro Linha Enchimento" #: fdmprinter.def.json msgctxt "infill_line_width description" msgid "Width of a single infill line." -msgstr "A largura de uma única linha de preenchimento." +msgstr "O diâmetro de uma única linha de enchimento." #: fdmprinter.def.json msgctxt "skirt_brim_line_width label" msgid "Skirt/Brim Line Width" -msgstr "Largura da linha de contorno/borda" +msgstr "Diâmetro Linha Contorno / Aba" #: fdmprinter.def.json msgctxt "skirt_brim_line_width description" msgid "Width of a single skirt or brim line." -msgstr "A largura de uma única linha de contorno ou borda." +msgstr "O diâmetro de uma única linha do contorno ou da aba." #: fdmprinter.def.json msgctxt "support_line_width label" msgid "Support Line Width" -msgstr "Largura da linha de suporte" +msgstr "Diâmetro Linha Suportes" #: fdmprinter.def.json msgctxt "support_line_width description" msgid "Width of a single support structure line." -msgstr "A largura de uma única linha de estrutura de suporte." +msgstr "O diâmetro de uma única linha da estrutura de suporte." #: fdmprinter.def.json msgctxt "support_interface_line_width label" msgid "Support Interface Line Width" -msgstr "Largura da linha da interface de suporte" +msgstr "Diâmetro Linha Interface Suporte" #: fdmprinter.def.json msgctxt "support_interface_line_width description" msgid "Width of a single line of support roof or floor." -msgstr "A largura de uma única linha de piso ou teto de suporte." +msgstr "O diâmetro de uma única linha do chão ou tecto de suporte." #: fdmprinter.def.json msgctxt "support_roof_line_width label" msgid "Support Roof Line Width" -msgstr "Largura da linha do teto de suporte" +msgstr "Diâmetro Linha Tecto Suporte" #: fdmprinter.def.json msgctxt "support_roof_line_width description" msgid "Width of a single support roof line." -msgstr "A largura de uma única linha de teto de suporte." +msgstr "O diâmetro de uma única linha do tecto de suporte." #: fdmprinter.def.json msgctxt "support_bottom_line_width label" msgid "Support Floor Line Width" -msgstr "Largura da linha do piso de suporte" +msgstr "Diâmetro Linha Piso Suporte" #: fdmprinter.def.json msgctxt "support_bottom_line_width description" msgid "Width of a single support floor line." -msgstr "A largura de uma única linha de piso de suporte." +msgstr "O diâmetro de uma única linha do piso de suporte." #: fdmprinter.def.json msgctxt "prime_tower_line_width label" msgid "Prime Tower Line Width" -msgstr "Largura da linha da torre de preparação" +msgstr "Diâmetro Linha Torre Preparação" #: fdmprinter.def.json msgctxt "prime_tower_line_width description" msgid "Width of a single prime tower line." -msgstr "A largura de uma única linha da torre de preparação." +msgstr "O diâmetro de uma única linha da torre de preparação." #: fdmprinter.def.json msgctxt "initial_layer_line_width_factor label" msgid "Initial Layer Line Width" -msgstr "Largura da linha da camada inicial" +msgstr "Diâmetro Linha Camada Inicial" #: fdmprinter.def.json msgctxt "initial_layer_line_width_factor description" -msgid "" -"Multiplier of the line width on the first layer. Increasing this could " -"improve bed adhesion." -msgstr "Multiplicador da largura da linha na primeira camada. Aumentar a largura poderá melhorar a aderência à base." +msgid "Multiplier of the line width on the first layer. Increasing this could improve bed adhesion." +msgstr "Multiplicador do diâmetro da linha da camada inicial. Aumentar o diâmetro poderá melhorar a aderência à base de construção." #: fdmprinter.def.json msgctxt "shell label" msgid "Shell" -msgstr "Cobertura" +msgstr "Invólucro" #: fdmprinter.def.json msgctxt "shell description" msgid "Shell" -msgstr "Cobertura" +msgstr "Invólucro" #: fdmprinter.def.json msgctxt "wall_extruder_nr label" msgid "Wall Extruder" -msgstr "Extrusora de parede" +msgstr "Extrusor Paredes" +# Este é utilizado em extrusões múltiplas. ?? +# Definição utilizada com múltiplos extrusores. ?? +# Definição para múltiplos extrusores. #: fdmprinter.def.json msgctxt "wall_extruder_nr description" -msgid "" -"The extruder train used for printing the walls. This is used in multi-" -"extrusion." -msgstr "A máquina de extrusão utilizada para imprimir as paredes. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir as paredes. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" -msgstr "Extrusora de parede externa" +msgstr "Extrusor Parede Exterior" #: fdmprinter.def.json msgctxt "wall_0_extruder_nr description" -msgid "" -"The extruder train used for printing the outer wall. This is used in multi-" -"extrusion." -msgstr "A máquina de extrusão utilizada para imprimir a parede externa. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train used for printing the outer wall. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir a parede exterior. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "Extrusora de parede interna" +msgstr "Extrusor Paredes Interiores" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" -msgid "" -"The extruder train used for printing the inner walls. This is used in multi-" -"extrusion." -msgstr "A máquina de extrusão utilizada para imprimir as paredes internas. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train used for printing the inner walls. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir as paredes interiores. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "wall_thickness label" msgid "Wall Thickness" -msgstr "Espessura das paredes" +msgstr "Espessura das Paredes" #: fdmprinter.def.json msgctxt "wall_thickness description" -msgid "" -"The thickness of the walls in the horizontal direction. This value divided " -"by the wall line width defines the number of walls." -msgstr "A espessura das paredes na direção horizontal. Este valor, dividido pela largura da linha de parede, define o número de paredes." +msgid "The thickness of the walls in the horizontal direction. This value divided by the wall line width defines the number of walls." +msgstr "A espessura das paredes na direção horizontal. Este valor, dividido pelo diâmetro da linha de parede, define o número de paredes." #: fdmprinter.def.json msgctxt "wall_line_count label" msgid "Wall Line Count" -msgstr "Contagem de linhas de parede" +msgstr "Número Linhas Paredes" #: 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 "O número de paredes. Quando calculado através da espessura da parede, este valor é arredondado para um número inteiro." +msgid "The number of walls. When calculated by the wall thickness, this value is rounded to a whole number." +msgstr "O número de paredes. Quando calculado através da espessura das paredes, este valor é arredondado para um número inteiro." #: fdmprinter.def.json msgctxt "wall_0_wipe_dist label" msgid "Outer Wall Wipe Distance" -msgstr "Distância de limpeza da parede externa" +msgstr "Distância Limpeza Parede Exterior" #: 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 "A distância de um movimento de deslocação inserido depois da parede externa para ocultar melhor a costura Z." +msgid "Distance of a travel move inserted after the outer wall, to hide the Z seam better." +msgstr "A distância de um movimento de deslocação inserido depois da parede exterior, para ocultar melhor a junta Z." #: fdmprinter.def.json msgctxt "roofing_extruder_nr label" msgid "Top Surface Skin Extruder" -msgstr "Extrusora de revestimento da superfície superior" +msgstr "Extrusor Revestimento Superior" #: fdmprinter.def.json msgctxt "roofing_extruder_nr description" -msgid "" -"The extruder train used for printing the top most skin. This is used in " -"multi-extrusion." -msgstr "A máquina de extrusão utilizada para imprimir o revestimento superior. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train used for printing the top most skin. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir a(s) camada(s) de revestimento das superfícies mais superiores. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "roofing_layer_count label" msgid "Top Surface Skin Layers" -msgstr "Camadas de revestimento da superfície superior" +msgstr "Camadas Revestimento Superior" #: fdmprinter.def.json msgctxt "roofing_layer_count description" -msgid "" -"The number of top most skin layers. Usually only one top most layer is " -"sufficient to generate higher quality top surfaces." -msgstr "O número de camadas de revestimento superiores. Por norma, uma só camada superior é suficiente para gerar superfícies superiores de maior qualidade." +msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." +msgstr "O número de camadas de revestimento da superfície superior. Por norma, uma só camada superior é suficiente para gerar superfícies superiores de maior qualidade." #: fdmprinter.def.json msgctxt "roofing_pattern label" msgid "Top Surface Skin Pattern" -msgstr "Padrão do revestimento da superfície superior" +msgstr "Padrão Revestimento Superior" #: fdmprinter.def.json msgctxt "roofing_pattern description" msgid "The pattern of the top most layers." -msgstr "O padrão das camadas superiores." +msgstr "O padrão geométrico das camadas de revestimento da superfície superior." #: fdmprinter.def.json msgctxt "roofing_pattern option lines" @@ -966,100 +912,82 @@ msgstr "Ziguezague" #: fdmprinter.def.json msgctxt "roofing_angles label" msgid "Top Surface Skin Line Directions" -msgstr "Direções da linha de revestimento da superfície superior" +msgstr "Direções Linha Revestimento Superior" #: fdmprinter.def.json msgctxt "roofing_angles description" -msgid "" -"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)." -msgstr "Uma lista de valores inteiros relativos às direções de linha a utilizar quando as camadas de revestimento da superfície superior utilizarem o padrão de linhas ou ziguezague. Os elementos da lista são utilizados em sequência, à medida que as camadas progridem, voltando ao início assim que a lista chega ao fim. Os itens da lista são separados por vírgulas e a lista completa é disposta entre parênteses retos. A predefinição é uma lista vazia, cujas médias utilizam os ângulos predefinidos tradicionais (45 e 135 graus)." +msgid "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)." +msgstr "Uma lista de ângulos (números inteiros) relativos às direções de linha a utilizar quando as camadas de revestimento da superfície superior utilizarem o padrão de Linhas ou Ziguezague. Os valores da lista são utilizados em sequência, à medida que as camadas progridem, voltando ao início assim que a lista chega ao fim. Os itens da lista são separados por vírgulas e a lista completa é escrita entre parênteses retos. Por defeito a lista está vazia, o que significa a utilização dos ângulos predefinidos tradicionais (45 e 135 graus)." #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" -msgstr "Extrusora superior/inferior" +msgstr "Extrusor Superior / Inferior" #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr description" -msgid "" -"The extruder train used for printing the top and bottom skin. This is used " -"in multi-extrusion." -msgstr "A máquina de extrusão utilizada para imprimir o revestimento superior e inferior. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train used for printing the top and bottom skin. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir as camadas superiores e inferiores da impressão. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "top_bottom_thickness label" msgid "Top/Bottom Thickness" -msgstr "Espessura superior/inferior" +msgstr "Espessura Superior / Inferior" #: 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 "A espessura das camadas superiores/inferiores na impressão. Este valor, dividido pela altura da camada, define o número de camadas superiores/inferiores." +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 "A espessura total das camadas superiores e inferiores na impressão. Este valor, dividido pela Espessura das Camadas, define o número de camadas superiores / inferiores." #: fdmprinter.def.json msgctxt "top_thickness label" msgid "Top Thickness" -msgstr "Espessura superior" +msgstr "Espessura Superior" #: 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 "A espessura das camadas superiores na impressão. Este valor, dividido pela altura da camada, define o número de camadas superiores." +msgid "The thickness of the top layers in the print. This value divided by the layer height defines the number of top layers." +msgstr "A espessura total das camadas superiores na impressão. Este valor, dividido pela Espessura das Camadas, define o número de camadas superiores." #: fdmprinter.def.json msgctxt "top_layers label" msgid "Top Layers" -msgstr "Camadas superiores" +msgstr "Camadas Superiores" #: 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 "O número de camadas superiores. Quando calculado através da espessura superior, este valor é arredondado para um número inteiro." +msgid "The number of top layers. When calculated by the top thickness, this value is rounded to a whole number." +msgstr "O número de camadas superiores. Quando calculado através da Espessura Superior, este valor é arredondado para um número inteiro." #: fdmprinter.def.json msgctxt "bottom_thickness label" msgid "Bottom Thickness" -msgstr "Espessura inferior" +msgstr "Espessura Inferior" #: 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 "A espessura das camadas inferiores na impressão. Este valor, dividido pela altura da camada, define o número de camadas inferiores." +msgid "The thickness of the bottom layers in the print. This value divided by the layer height defines the number of bottom layers." +msgstr "A espessura total das camadas inferiores na impressão. Este valor, dividido pela Espessura das Camadas, define o número de camadas inferiores." #: fdmprinter.def.json msgctxt "bottom_layers label" msgid "Bottom Layers" -msgstr "Camadas inferiores" +msgstr "Camadas Inferiores" #: 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 "O número de camadas inferiores. Quando calculado pela espessura inferior, este valor é arredondado para um número inteiro." +msgid "The number of bottom layers. When calculated by the bottom thickness, this value is rounded to a whole number." +msgstr "O número de camadas inferiores. Quando calculado através da Espessura Inferior, este valor é arredondado para um número inteiro." #: fdmprinter.def.json msgctxt "top_bottom_pattern label" msgid "Top/Bottom Pattern" -msgstr "Padrão superior/inferior" +msgstr "Padrão Superior / Inferior" #: fdmprinter.def.json msgctxt "top_bottom_pattern description" msgid "The pattern of the top/bottom layers." -msgstr "O padrão das camadas superiores/inferiores." +msgstr "O padrão geométrico das camadas superiores / inferiores." #: fdmprinter.def.json msgctxt "top_bottom_pattern option lines" @@ -1076,15 +1004,17 @@ msgctxt "top_bottom_pattern option zigzag" msgid "Zig Zag" msgstr "Ziguezague" +# Is the English string correct? meaning? #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 label" msgid "Bottom Pattern Initial Layer" -msgstr "Camada inicial de padrão inferior" +msgstr "Padrão da Base na Camada Inicial" +# Is the English string correct? meaning? #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 description" msgid "The pattern on the bottom of the print on the first layer." -msgstr "O padrão na parte inferior da primeira camada." +msgstr "O padrão geométrico da base da peça na camada inicial." #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 option lines" @@ -1104,104 +1034,90 @@ msgstr "Ziguezague" #: fdmprinter.def.json msgctxt "skin_angles label" msgid "Top/Bottom Line Directions" -msgstr "Direções de linha superior/inferior" +msgstr "Direções Linha Superior / Inferior" #: 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 "Uma lista de valores inteiros relativos às direções de linha a utilizar quando as camadas superiores/inferiores utilizarem o padrão de linhas ou ziguezague. Os elementos da lista são utilizados em sequência, à medida que as camadas progridem, voltando ao início assim que a lista chega ao fim. Os itens da lista são separados por vírgulas e a lista completa é disposta entre parênteses retos. A predefinição é uma lista vazia, cujas médias utilizam os ângulos predefinidos tradicionais (45 e 135 graus)." +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 "Uma lista de ângulos (números inteiros) relativos às direções de linha a utilizar quando as camadas da superfície superiores/inferiores utilizarem os padrões de Linhas ou Ziguezague. Os valores da lista são utilizados em sequência, à medida que as camadas progridem, voltando ao início assim que a lista chega ao fim. Os itens da lista são separados por vírgulas e a lista completa é escrita entre parênteses retos. Por defeito a lista está vazia, o que significa a utilização dos ângulos predefinidos tradicionais (45 e 135 graus)." +# Inserção? +# desvio? +# Movimento? #: fdmprinter.def.json msgctxt "wall_0_inset label" msgid "Outer Wall Inset" -msgstr "Inserção de parede externa" +msgstr "Desvio Parede Exterior" #: 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 "Inserção aplicada à trajetória da parede externa. Se a parede externa for menor que o bocal e impressa depois das paredes internas, utilize este desvio para que o orifício do bocal se sobreponha às paredes internas e não ao exterior do modelo." +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 "Desvio aplicado à trajetória da parede exterior. Se a parede exterior for menor que o nozzle e impressa depois das paredes interiores, utilize este desvio para que o buraco do nozzle se sobreponha às paredes interiores e não ao exterior do modelo." +# antes das interiores? #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" -msgstr "Paredes externas antes das internas" +msgstr "Paredes Exteriores Primeiro" #: 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 "Quando ativado, imprime paredes do exterior para o interior. Isto pode ajudar a melhorar a precisão dimensional em X e Y ao utilizar um plástico de alta viscosidade, como o ABS; no entanto, pode diminuir a qualidade de impressão da superfície externa, especialmente em saliências." +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 "Quando ativado, imprime as paredes do exterior para o interior. Isto pode ajudar a melhorar a precisão dimensional em X e Y quando utilizar um plástico com alta viscosidade, como o ABS; no entanto, pode diminuir a qualidade de impressão da superfície exterior, especialmente em saliências." #: fdmprinter.def.json msgctxt "alternate_extra_perimeter label" msgid "Alternate Extra Wall" -msgstr "Alternar parede adicional" +msgstr "Alternar Parede Adicional" +# capturado? +# integrado? #: 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 "Imprime uma parede adicional em camadas alternadas. Deste modo, o preenchimento é capturado entre estas paredes adicionais, resultando em impressões mais robustas." +msgid "Prints an extra wall at every other layer. This way infill gets caught between these extra walls, resulting in stronger prints." +msgstr "Imprimir uma parede adicional em camadas alternadas. Deste modo, o enchimento é \"capturado\" entre estas paredes adicionais, resultando em impressões mais robustas." #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_enabled label" msgid "Compensate Wall Overlaps" -msgstr "Compensar sobreposição de paredes" +msgstr "Compensar Sobreposição Paredes" #: 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 "Compensa o fluxo de peças de uma parede a ser impressa onde já existe uma parede." +msgid "Compensate the flow for parts of a wall being printed where there is already a wall in place." +msgstr "Compensar o fluxo em partes de uma parede a ser impressa, onde já exista uma parede." #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_0_enabled label" msgid "Compensate Outer Wall Overlaps" -msgstr "Compensar sobreposição de paredes externas" +msgstr "Compensar Sobreposição Paredes Exteriores" #: 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 "Compensa o fluxo de peças de uma parede externa a ser impressa onde já existe uma parede." +msgid "Compensate the flow for parts of an outer wall being printed where there is already a wall in place." +msgstr "Compensar o fluxo em partes de uma parede exterior a ser impressa, onde já exista uma parede." #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_x_enabled label" msgid "Compensate Inner Wall Overlaps" -msgstr "Compensar sobreposição de paredes internas" +msgstr "Compensar Sobreposição Paredes Interiores" #: 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 "Compensa o fluxo de peças de uma parede interna a ser impressa onde já existe uma parede." +msgid "Compensate the flow for parts of an inner wall being printed where there is already a wall in place." +msgstr "Compensar o fluxo em partes de uma parede interior a ser impressa, onde já exista uma parede." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" msgid "Fill Gaps Between Walls" -msgstr "Preencher folgas entre paredes" +msgstr "Preencher Folgas Paredes" +# rever! +# onde nenhuma parede cabe #: fdmprinter.def.json msgctxt "fill_perimeter_gaps description" msgid "Fills the gaps between walls where no walls fit." -msgstr "Preenche as folgas entre paredes onde não é possível instalar paredes." +msgstr "Preencher as folgas entre paredes onde não é possível criar paredes." #: fdmprinter.def.json msgctxt "fill_perimeter_gaps option nowhere" @@ -1216,60 +1132,57 @@ msgstr "Em todo o lado" #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" -msgstr "Imprimir paredes finas" +msgstr "Imprimir Paredes Finas" #: fdmprinter.def.json msgctxt "fill_outline_gaps description" -msgid "" -"Print pieces of the model which are horizontally thinner than the nozzle " -"size." -msgstr "Imprime peças do modelo que são horizontalmente mais finas do que o tamanho do bocal." +msgid "Print pieces of the model which are horizontally thinner than the nozzle size." +msgstr "Imprimir paredes do modelo que são mais finas horizontalmente do que o tamanho do nozzle." #: fdmprinter.def.json msgctxt "xy_offset label" msgid "Horizontal Expansion" -msgstr "Expansão horizontal" +msgstr "Expansão Horizontal" #: 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 "Quantidade de desvio aplicado a todos os polígonos em cada camada. Os valores positivos podem compensar orifícios demasiado grandes; os valores negativos podem compensar orifícios demasiado pequenos." +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 "" +"Quantidade de desvio aplicado a todos os polígonos em cada camada.\n" +" Valores positivos podem compensar buracos demasiado grandes; os valores negativos podem compensar buracos demasiado pequenos." #: fdmprinter.def.json msgctxt "xy_offset_layer_0 label" msgid "Initial Layer Horizontal Expansion" -msgstr "Expansão horizontal da camada inicial" +msgstr "Expansão Horizontal Camada Inicial" +# conhecido como? +# o chamado ? #: fdmprinter.def.json msgctxt "xy_offset_layer_0 description" -msgid "" -"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\"." -msgstr "Quantidade de desvio aplicado a todos os polígonos na primeira camada. Um valor negativo pode compensar o esmagamento da primeira camada, conhecido como o \"pé de elefante\"." +msgid "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\"." +msgstr "" +"Quantidade de desvio aplicado a todos os polígonos na primeira camada.\n" +" Um valor negativo pode compensar o \"esmagamento\" da camada inicial, conhecido como \"pé de elefante\"." #: fdmprinter.def.json msgctxt "z_seam_type label" msgid "Z Seam Alignment" -msgstr "Alinhamento da costura Z" +msgstr "Alinhamento da Junta-Z" +# adoptar? #: 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 "Ponto inicial de cada trajetória numa camada. Quando as trajetórias das camadas consecutivas começam no mesmo ponto, pode ser apresentada uma costura vertical na impressão. Ao alinhá-las próximo a uma posição especificada pelo utilizador, é mais fácil remover a costura. Quando dispostas aleatoriamente, as imprecisões no início das trajetórias serão menos percetíveis. Ao adotar a trajetória mais curta, a impressão será mais rápida." +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 "" +"Ponto inicial de cada trajetória de uma camada.\n" +"Quando as trajetórias em camadas consecutivas começam no mesmo ponto, pode aparecer uma junta vertical na impressão.\n" +" Ao alinhar o inicio das trajectórias próximo a uma posição definida pelo utilizador, é mais fácil remover a linha de junta. Quando dispostas aleatoriamente, as imprecisões no início das trajetórias serão menos perceptíveis. Ao adoptar a trajetória mais curta, a impressão será mais rápida." #: fdmprinter.def.json msgctxt "z_seam_type option back" msgid "User Specified" -msgstr "Especificado pelo utilizador" +msgstr "Definido pelo utilizador" #: fdmprinter.def.json msgctxt "z_seam_type option shortest" @@ -1281,143 +1194,140 @@ msgctxt "z_seam_type option random" msgid "Random" msgstr "Aleatório" +# canto? ou esquina? angulo? +# acentuado? agudo? #: fdmprinter.def.json msgctxt "z_seam_type option sharpest_corner" msgid "Sharpest Corner" -msgstr "Canto mais acentuado" +msgstr "Canto mais Acentuado" #: fdmprinter.def.json msgctxt "z_seam_x label" msgid "Z Seam X" -msgstr "X da costura Z" +msgstr "X da Junta-Z" #: 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." +msgid "The X coordinate of the position near where to start printing each part in a layer." msgstr "A coordenada X da posição próxima do local onde a impressão de cada parte de uma camada será iniciada." #: fdmprinter.def.json msgctxt "z_seam_y label" msgid "Z Seam Y" -msgstr "Y da costura Z" +msgstr "Y da Junta-Z" #: 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." +msgid "The Y coordinate of the position near where to start printing each part in a layer." msgstr "A coordenada Y da posição próxima do local onde a impressão de cada parte de uma camada será iniciada." +# rever! +# canto? esquina? angulo? #: fdmprinter.def.json msgctxt "z_seam_corner label" msgid "Seam Corner Preference" -msgstr "Preferência de canto da costura" +msgstr "Preferência Canto Junta" +# rever! +# torna mais provável que esta surja num canto +# aconteça? surja? apareça? #: fdmprinter.def.json msgctxt "z_seam_corner description" -msgid "" -"Control whether corners on the model outline influence the position of the " -"seam. None means that corners have no influence on the seam position. Hide " -"Seam makes the seam more likely to occur on an inside corner. Expose Seam " -"makes the seam more likely to occur on an outside corner. Hide or Expose " -"Seam makes the seam more likely to occur at an inside or outside corner." -msgstr "Controla se os cantos do contorno do modelo influenciam a posição da costura. Nenhum significa que os cantos não influenciam a posição da costura. Ocultar costura torna mais provável que esta surja num canto interno. Expor costura torna mais provável que esta surja num canto externo. Ocultar ou expor costura torna mais provável que esta surja num canto interno ou externo." +msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner." +msgstr "Controla se os cantos do contorno do modelo influenciam a posição da junta. Nenhum significa que os cantos não influenciam a posição da junta. Ocultar Junta faz com que seja mais provável que a junta surja num canto interior. Expor Junta faz com que seja mais provável que a junta aconteça num canto exterior. Ocultar ou Expor Junta faz com que seja mais provável que a junta aconteça num canto interior ou exterior." #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_none" msgid "None" msgstr "Nenhum" +# rever! +# ocultar? esconder? #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_inner" msgid "Hide Seam" -msgstr "Ocultar costura" +msgstr "Ocultar Junta" +# rever! +# expor? mostrar? #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_outer" msgid "Expose Seam" -msgstr "Expor costura" +msgstr "Expor Junta" +# rever! +# ocultar ou esconder? #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_any" msgid "Hide or Expose Seam" -msgstr "Ocultar ou expor costura" +msgstr "Ocultar ou Expor Junta" #: fdmprinter.def.json msgctxt "z_seam_relative label" msgid "Z Seam Relative" -msgstr "Relativo à costura Z" +msgstr "Relativo à Junta-Z" #: fdmprinter.def.json msgctxt "z_seam_relative description" -msgid "" -"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." -msgstr "Quando ativado, as coordenadas da costura Z são relativas ao centro de cada peça. Quando desativado, as coordenadas definem uma posição absoluta na placa de construção." +msgid "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." +msgstr "Quando ativado, as coordenadas da junta-Z são relativas ao centro de cada peça. Quando desativado, as coordenadas definem uma posição absoluta na base de construção." +# rever! +# gaps? Espaços? intervalos? folgas? #: fdmprinter.def.json msgctxt "skin_no_small_gaps_heuristic label" msgid "Ignore Small Z Gaps" -msgstr "Ignorar pequenas folgas Z" +msgstr "Ignorar Pequenos Espaços Z" #: 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 "Quando o modelo tem pequenas folgas verticais, pode ser gasto cerca de 5% de tempo de cálculo adicional na criação de um revestimento superior e inferior nessas folgas reduzidas. Nesse caso, desative esta definição." +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 "Quando o modelo tem pequenos espaços verticais, cerca de mais 5% de tempo de cálculo pode ser despendido na criação das superfícies de revestimentos superior e inferior nestes pequenos espaços. Nesse caso desative esta definição." #: fdmprinter.def.json msgctxt "skin_outline_count label" msgid "Extra Skin Wall Count" -msgstr "Contagem de paredes de revestimento adicional" +msgstr "Paredes Revestimento Extra" +# rever! +# tetos ? tectos? +# iniciados? que começam? +# materialde enchimento? #: 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 "Substitui a parte mais externa do padrão superior/inferior por várias linhas concêntricas. Utilizar uma ou duas linhas melhora os tetos iniciados com material de preenchimento." +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 "Substitui a parte mais exterior do padrão superior/inferior por um número de linhas concêntricas. Usar uma ou duas linhas melhora os tectos que começam no material de enchimento." #: fdmprinter.def.json msgctxt "ironing_enabled label" msgid "Enable Ironing" -msgstr "Ativar engomagem" +msgstr "Ativar Engomar (Ironing)" +# O objetivo é derreter mais o plástico das superfícies superiores, criando uma superfície mais uniforme. #: fdmprinter.def.json msgctxt "ironing_enabled description" -msgid "" -"Go over the top surface one additional time, but without extruding material. " -"This is meant to melt the plastic on top further, creating a smoother " -"surface." -msgstr "Passa novamente sobre a superfície superior, mas sem extrudir material. O objetivo é derreter mais o plástico na parte superior, criando uma superfície mais uniforme." +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "Passar com o nozzle uma vez mais, sobre as superfícies superiores, mas sem extrudir material. O objetivo é criar superfícies mais suaves/lisas, ao derreter (\"engomar\") o plástico das superfícies superiores." #: fdmprinter.def.json msgctxt "ironing_only_highest_layer label" msgid "Iron Only Highest Layer" -msgstr "Engomar apenas camada superior" +msgstr "Engomar Só Última Camada" #: fdmprinter.def.json msgctxt "ironing_only_highest_layer description" -msgid "" -"Only perform ironing on the very last layer of the mesh. This saves time if " -"the lower layers don't need a smooth surface finish." -msgstr "Engoma apenas a última camada de malha. Isto permite poupar tempo se as camadas inferiores não precisarem de um acabamento de superfície uniforme." +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "Engomar apenas a última camada do modelo. Isto permite poupar tempo se as camadas inferiores não precisarem de ter um acabamento mais suave." #: fdmprinter.def.json msgctxt "ironing_pattern label" msgid "Ironing Pattern" -msgstr "Padrão de engomagem" +msgstr "Padrão de Engomar" #: fdmprinter.def.json msgctxt "ironing_pattern description" msgid "The pattern to use for ironing top surfaces." -msgstr "O padrão a utilizar para engomar as superfícies superiores." +msgstr "O padrão geométrico a utilizar para engomar as superfícies superiores." #: fdmprinter.def.json msgctxt "ironing_pattern option concentric" @@ -1432,64 +1342,62 @@ msgstr "Ziguezague" #: fdmprinter.def.json msgctxt "ironing_line_spacing label" msgid "Ironing Line Spacing" -msgstr "Espaçamento da linha de engomagem" +msgstr "Distância Linhas de Engomar" #: fdmprinter.def.json msgctxt "ironing_line_spacing description" msgid "The distance between the lines of ironing." -msgstr "A distância entre as linhas de engomagem." +msgstr "A distância entre as linhas de engomar." #: fdmprinter.def.json msgctxt "ironing_flow label" msgid "Ironing Flow" -msgstr "Fluxo de engomagem" +msgstr "Fluxo de Engomar" +# rever! +# filled - abastecido? cheio? #: fdmprinter.def.json msgctxt "ironing_flow description" -msgid "" -"The amount of material, relative to a normal skin line, to extrude during " -"ironing. Keeping the nozzle filled helps filling some of the crevices of the " -"top surface, but too much results in overextrusion and blips on the side of " -"the surface." -msgstr "A quantidade de material, em relação a uma linha de revestimento normal, a ser extrudido durante a engomagem. Manter o bocal abastecido ajuda a preencher algumas das fendas da superfície superior, mas o excesso de abastecimento resulta em sobre-extrusão e bolhas na parte lateral da superfície." +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "A quantidade de material, em relação a uma linha de revestimento normal, a ser extrudido durante o processo de engomar. Manter o nozzle cheio ajuda a preencher algumas das fissuras da superfície superior, mas cheio de mais, provoca sobre-extrusão e pequenos pontos ou \"bolhas\" na parte lateral da superfície." #: fdmprinter.def.json msgctxt "ironing_inset label" msgid "Ironing Inset" -msgstr "Inserção de engomagem" +msgstr "Desvio Interior de Engomar" #: fdmprinter.def.json msgctxt "ironing_inset description" -msgid "" -"A distance to keep from the edges of the model. Ironing all the way to the " -"edge of the mesh may result in a jagged edge on your print." -msgstr "A distância a manter em relação às extremidades do modelo. Engomar até à extremidade da malha pode resultar numa extremidade irregular na sua impressão." +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "A distância a manter em relação às extremidades do modelo. \"Engomar\" até à extremidade da superfície pode resultar em arestas irregulares na impressão." #: fdmprinter.def.json msgctxt "speed_ironing label" msgid "Ironing Speed" -msgstr "Velocidade de engomagem" +msgstr "Velocidade de Engomar" #: fdmprinter.def.json msgctxt "speed_ironing description" msgid "The speed at which to pass over the top surface." -msgstr "A velocidade de passagem sobre a superfície superior." +msgstr "A velocidade da passagem do nozzle (engomar) sobre a superfície superior." #: fdmprinter.def.json msgctxt "acceleration_ironing label" msgid "Ironing Acceleration" -msgstr "Aceleração de engomagem" +msgstr "Aceleração de Engomar" #: fdmprinter.def.json msgctxt "acceleration_ironing description" msgid "The acceleration with which ironing is performed." -msgstr "A aceleração com a qual a engomagem é efetuada." +msgstr "A aceleração com a qual se realiza o processo de engomar." #: fdmprinter.def.json msgctxt "jerk_ironing label" msgid "Ironing Jerk" -msgstr "Solavanco de engomagem" +msgstr "Jerk de Engomar" +# rever! +# A velocidade máxima da alteração da velocidade instantânea #: fdmprinter.def.json msgctxt "jerk_ironing description" msgid "The maximum instantaneous velocity change while performing ironing." @@ -1498,61 +1406,62 @@ msgstr "A mudança de velocidade instantânea máxima ao engomar." #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" -msgstr "Preenchimento" +msgstr "Enchimento" #: fdmprinter.def.json msgctxt "infill description" msgid "Infill" -msgstr "Preenchimento" +msgstr "Enchimento" #: fdmprinter.def.json msgctxt "infill_extruder_nr label" msgid "Infill Extruder" -msgstr "Extrusora de preenchimento" +msgstr "Extrusor Enchimento" #: fdmprinter.def.json msgctxt "infill_extruder_nr description" -msgid "" -"The extruder train used for printing infill. This is used in multi-extrusion." -msgstr "A máquina de extrusão utilizada para imprimir o preenchimento. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train used for printing infill. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir o enchimento. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "infill_sparse_density label" msgid "Infill Density" -msgstr "Densidade de preenchimento" +msgstr "Densidade do Enchimento" #: fdmprinter.def.json msgctxt "infill_sparse_density description" msgid "Adjusts the density of infill of the print." -msgstr "Ajusta a densidade do preenchimento da impressão." +msgstr "Ajusta a densidade do enchimento da impressão." +# rever! +# Distância? espaço? intervalo? #: fdmprinter.def.json msgctxt "infill_line_distance label" msgid "Infill Line Distance" -msgstr "Distância da linha de preenchimento" +msgstr "Distância Linhas Enchimento" #: 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 "A distância entre as linhas de preenchimento impressas. Esta definição é calculada através da densidade de preenchimento e da largura da linha de preenchimento." +msgid "Distance between the printed infill lines. This setting is calculated by the infill density and the infill line width." +msgstr "A distância entre as linhas de enchimento impressas. O valor desta definição é calculada através da densidade de enchimento e do diâmetro da linha de enchimento." #: fdmprinter.def.json msgctxt "infill_pattern label" msgid "Infill Pattern" -msgstr "Padrão de preenchimento" +msgstr "Padrão de Enchimento" +# of the print +# da impressão? da peça? +# A direção do +# No enchimento com Linha e Ziguezague a direção é invertida em camadas alternadas +# invertido? rodado? +# padrões - ?geometricos?? +# alterados? mudam? movidos? delocados? +# fornecer uma? permitir uma? #: 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, tri-hexagon, cubic, octet, quarter cubic, cross and concentric " -"patterns are fully printed every layer. Cubic, quarter cubic and octet " -"infill change with every layer to provide a more equal distribution of " -"strength over each direction." -msgstr "O padrão do material de preenchimento da impressão. A direção de troca de preenchimento de linha e ziguezague em camadas alternadas, reduzindo os custos de material. Os padrões de grelha, triângulo, tri-hexágono, cubo, octeto, quarto cúbico, cruz e concêntrico são totalmente impressos em cada camada. Os preenchimentos cúbico, quarto cúbico e octeto são alterados a cada camada para fornecer uma distribuição mais uniforme da resistência em cada direção." +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, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "O padrão geométrico do enchimento da impressão. A direção do enchimento com Linhas e Ziguezague é invertida em camadas alternadas, reduzindo os custos em material. Os padrões em Grelha, Triângulo, Tri-Hexágono, Cúbico, Octeto, Quarto Cúbico, Cruz e Concêntrico são totalmente impressos em cada camada. Os enchimentos Cúbico, Quarto Cúbico e Octeto são deslocados em cada camada para permitir uma distribuição mais uniforme da resistência em cada direção." #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1572,7 +1481,7 @@ msgstr "Triângulos" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "Tri-hexágono" +msgstr "Tri-Hexágono" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1582,7 +1491,7 @@ msgstr "Cúbico" #: fdmprinter.def.json msgctxt "infill_pattern option cubicsubdiv" msgid "Cubic Subdivision" -msgstr "Subdivisão cúbica" +msgstr "Subdivisão Cúbica" #: fdmprinter.def.json msgctxt "infill_pattern option tetrahedral" @@ -1592,7 +1501,7 @@ msgstr "Octeto" #: fdmprinter.def.json msgctxt "infill_pattern option quarter_cubic" msgid "Quarter Cubic" -msgstr "Quarto cúbico" +msgstr "Quarto Cúbico" #: fdmprinter.def.json msgctxt "infill_pattern option concentric" @@ -1622,273 +1531,217 @@ msgstr "Cruz 3D" #: fdmprinter.def.json msgctxt "zig_zaggify_infill label" msgid "Connect Infill Lines" -msgstr "Ligar linhas de preenchimento" +msgstr "Ligar Linhas Enchimento" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "" -"Connect the ends where the infill pattern meets the inner wall using a line " -"which follows the shape of the inner wall. Enabling this setting can make " -"the infill adhere to the walls better and reduce the effects of infill on " -"the quality of vertical surfaces. Disabling this setting reduces the amount " -"of material used." -msgstr "Liga as extremidades onde o padrão de preenchimento entra em contacto com a parede interna utilizando uma linha que acompanha a forma da parede interna. Ativar esta definição pode melhorar a aderência do preenchimento às paredes e reduzir os efeitos do preenchimento na qualidade das superfícies verticais. Desativar esta definição reduz a quantidade de material utilizado." +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "Ligar as extremidades onde o padrão de enchimento entra em contacto com a parede interior utilizando uma linha que acompanha a forma da parede interior. Ativar esta definição pode melhorar a adesão do enchimento às paredes e reduzir os efeitos do enchimento na qualidade das superfícies verticais. Desativar esta definição reduz a quantidade de material utilizado." #: fdmprinter.def.json msgctxt "infill_angles label" msgid "Infill Line Directions" -msgstr "Direções da linha de preenchimento" +msgstr "Direções Linhas Enchimento" #: 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 "Uma lista de valores inteiros relativos às direções de linha a utilizar. Os elementos da lista são utilizados em sequência, à medida que as camadas progridem, voltando ao início assim que a lista chega ao fim. Os itens da lista são separados por vírgulas e a lista completa é disposta entre parênteses retos. A predefinição é uma lista vazia, cujas médias utilizam os ângulos predefinidos tradicionais (45 e 135 graus para os padrões de linha e ziguezague e 45 graus para todos os restantes padrões)." +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 "Uma lista de ângulos (números inteiros) relativos às direções de linha a utilizar. Os valores da lista são utilizados em sequência, à medida que as camadas progridem, voltando ao início assim que a lista chega ao fim. Os itens da lista são separados por vírgulas e a lista completa é escrita entre parênteses retos. Por defeito a lista está vazia, o que significa a utilização dos ângulos predefinidos tradicionais (45 e 135 graus para os padrões de Linhas ou Ziguezague e 45 graus para todos os outros padrões)." #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "Desvio X do preenchimento" +msgstr "Deslocar Enchimento em X" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "O padrão de preenchimento apresenta um desvio a esta distância ao longo do eixo X." +msgstr "O padrão geométrico de enchimento é deslocado por esta distância ao longo do eixo X." +# Desvio? +# Delocar? deslocamento +# Mover? #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "Desvio Y do preenchimento" +msgstr "Deslocar Enchimento em Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "O padrão de preenchimento apresenta um desvio a esta distância ao longo do eixo Y." +msgstr "O padrão geométrico de enchimento é deslocado por esta distância ao longo do eixo Y." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" -msgstr "Cobertura de subdivisão cúbica" +msgstr "Invólucro Subdivisão Cúbica" #: 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 "Um acréscimo ao raio do centro de cada cubo para verificar os limites do modelo, de forma a decidir se este cubo deve ser subdividido. Valores mais elevados resultam numa cobertura mais espessa dos cubos pequenos próximos aos limites do modelo." +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 "Um acréscimo ao raio a partir do centro de cada cubo para encontrar os limites do modelo, de forma a decidir se este cubo deve ser subdividido. Valores mais elevados resultam num invólucro mais espesso com cubos pequenos perto do limite do modelo." #: fdmprinter.def.json msgctxt "infill_overlap label" msgid "Infill Overlap Percentage" -msgstr "Percentagem de sobreposição do preenchimento" +msgstr "Sobreposição Enchimento (%)" #: 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 "A quantidade de sobreposição entre o preenchimento e as paredes. Uma ligeira sobreposição permite que as paredes sejam ligadas firmemente ao preenchimento." +msgid "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill." +msgstr "A Percentagem de sobreposição entre o enchimento e as paredes. Uma ligeira sobreposição permite que as paredes sejam ligadas firmemente ao enchimento." #: fdmprinter.def.json msgctxt "infill_overlap_mm label" msgid "Infill Overlap" -msgstr "Sobreposição do preenchimento" +msgstr "Sobreposição Enchimento (mm)" #: 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 "A quantidade de sobreposição entre o preenchimento e as paredes. Uma ligeira sobreposição permite que as paredes sejam ligadas firmemente ao preenchimento." +msgid "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill." +msgstr "A distância em milímetros da sobreposição entre o enchimento e as paredes. Uma ligeira sobreposição permite que as paredes se unam firmemente ao enchimento." #: fdmprinter.def.json msgctxt "skin_overlap label" msgid "Skin Overlap Percentage" -msgstr "Percentagem de sobreposição do revestimento" +msgstr "Sobreposição Revestimento (%)" +# rever! +# Esta é uma percentagem das larguras médias de linha das linhas de revestimento e da parede mais interna. #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "" -"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." -msgstr "A quantidade de sobreposição entre o revestimento e as paredes, como percentagem de largura da linha. Uma ligeira sobreposição permite que as paredes se liguem firmemente ao revestimento. Esta é uma percentagem das larguras médias de linha das linhas de revestimento e da parede mais interna." +msgid "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." +msgstr "A sobreposição entre o revestimento e as paredes, como percentagem do diâmetro da linha. Uma ligeira sobreposição permite que as paredes se liguem firmemente ao revestimento. Esta é uma percentagem da média dos diâmetros da linha de revestimento e da parede mais interior." #: fdmprinter.def.json msgctxt "skin_overlap_mm label" msgid "Skin Overlap" -msgstr "Sobreposição de revestimento" +msgstr "Sobreposição Revestimento (mm)" #: 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 "A quantidade de sobreposição entre o revestimento e as paredes. Uma ligeira sobreposição permite que as paredes se liguem firmemente ao revestimento." +msgid "The amount of overlap between the skin and the walls. A slight overlap allows the walls to connect firmly to the skin." +msgstr "A distância em milímetros da sobreposição entre o revestimento e as paredes. Uma ligeira sobreposição permite que as paredes se liguem firmemente ao revestimento." #: fdmprinter.def.json msgctxt "infill_wipe_dist label" msgid "Infill Wipe Distance" -msgstr "Distância de limpeza do preenchimento" +msgstr "Distância Limpeza Enchimento" #: 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 "A distância de um movimento de deslocação inserido depois de cada linha de preenchimento, para melhorar a aderência do preenchimento às paredes. Esta opção é semelhante à sobreposição de preenchimento, mas sem extrusão e apenas numa das extremidades da linha de preenchimento." +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 "A distância de um movimento de deslocação inserido depois de cada linha de enchimento, para melhorar a união do enchimento às paredes. Esta opção é semelhante à sobreposição de enchimento, mas sem extrusão e apenas numa das extremidades da linha de enchimento." #: fdmprinter.def.json msgctxt "infill_sparse_thickness label" msgid "Infill Layer Thickness" -msgstr "Espessura da camada de preenchimento" +msgstr "Espessura Camada Enchimento" #: 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 "A espessura por camada de material de preenchimento. Este valor deve sempre ser um múltiplo da altura da camada. Caso contrário, será arredondado." +msgid "The thickness per layer of infill material. This value should always be a multiple of the layer height and is otherwise rounded." +msgstr "A espessura por camada de material de enchimento. Este valor deve ser sempre um múltiplo da Espessura das Camadas, ou será arredondado." #: fdmprinter.def.json msgctxt "gradual_infill_steps label" msgid "Gradual Infill Steps" -msgstr "Passos de preenchimento gradual" +msgstr "Degraus Enchimento Gradual" #: 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 "O número de vezes que a densidade de preenchimento deve ser reduzida para metade ao alcançar superfícies superiores mais abaixo. As áreas que se encontram mais próximas das superfícies superiores obtêm uma maior densidade, até ao limite da Densidade de preenchimento." +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 "O número de vezes que a densidade de enchimento deve ser reduzida para metade ao alcançar superfícies superiores mais abaixo. As áreas que se encontram mais próximas das superfícies superiores têm uma maior densidade, até ao definido na Densidade de Enchimento." #: fdmprinter.def.json msgctxt "gradual_infill_step_height label" msgid "Gradual Infill Step Height" -msgstr "Altura do passo de preenchimento gradual" +msgstr "Altura do passo de enchimento gradual" #: 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 "A altura de preenchimento de uma determinada densidade antes de mudar para metade da densidade." +msgid "The height of infill of a given density before switching to half the density." +msgstr "A altura de enchimento de uma determinada densidade antes de mudar para metade da densidade." #: fdmprinter.def.json msgctxt "infill_before_walls label" msgid "Infill Before Walls" -msgstr "Preenchimento antes das paredes" +msgstr "Enchimento antes das paredes" #: 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 "Imprime o preenchimento antes de imprimir as paredes. Imprimir as paredes em primeiro lugar pode resultar em paredes mais precisas, embora as saliências sejam impressas com menor qualidade. Imprimir o preenchimento em primeiro lugar resulta em paredes mais robustas, embora, por vezes, o padrão de preenchimento possa ser visto através da superfície." +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 "Imprime o enchimento antes de imprimir as paredes. Imprimir as paredes em primeiro lugar pode resultar em paredes mais precisas, embora as saliências sejam impressas com menor qualidade. Imprimir o enchimento em primeiro lugar resulta em paredes mais robustas, embora, por vezes, o padrão geométrico de enchimento possa ser visto através da superfície." #: fdmprinter.def.json msgctxt "min_infill_area label" msgid "Minimum Infill Area" -msgstr "Área de preenchimento mínimo" +msgstr "Área de enchimento mínimo" #: fdmprinter.def.json msgctxt "min_infill_area description" msgid "Don't generate areas of infill smaller than this (use skin instead)." -msgstr "Não cria áreas de preenchimento mais reduzidas do que esta (em vez disso, utiliza o revestimento)." +msgstr "Não cria áreas de enchimento mais reduzidas do que esta (em vez disso, utiliza o revestimento)." #: fdmprinter.def.json msgctxt "skin_preshrink label" msgid "Skin Removal Width" -msgstr "Largura de remoção do revestimento" +msgstr "Largura Remoção Revestimento" #: fdmprinter.def.json msgctxt "skin_preshrink description" -msgid "" -"The largest width of skin areas which are to be removed. Every skin area " -"smaller than this value will disappear. This can help in limiting the amount " -"of time and material spent on printing top/bottom skin at slanted surfaces " -"in the model." +msgid "The largest width of skin areas which are to be removed. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing top/bottom skin at slanted surfaces in the model." msgstr "A maior largura das áreas de revestimento a serem removidas. Todas as áreas de revestimento inferiores a este valor irão desaparecer. Isto pode ajudar a limitar a quantidade de tempo e material gastos na impressão do revestimento superior/inferior nas superfícies inclinadas do modelo." #: fdmprinter.def.json msgctxt "top_skin_preshrink label" msgid "Top Skin Removal Width" -msgstr "Largura de remoção do revestimento superior" +msgstr "Largura Remoção Revestimento Superior" #: fdmprinter.def.json msgctxt "top_skin_preshrink description" -msgid "" -"The largest width of top skin areas which are to be removed. Every skin area " -"smaller than this value will disappear. This can help in limiting the amount " -"of time and material spent on printing top skin at slanted surfaces in the " -"model." +msgid "The largest width of top skin areas which are to be removed. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing top skin at slanted surfaces in the model." msgstr "A maior largura das áreas de revestimento superiores a serem removidas. Todas as áreas de revestimento inferiores a este valor irão desaparecer. Isto pode ajudar a limitar a quantidade de tempo e material gastos na impressão do revestimento superior nas superfícies inclinadas do modelo." #: fdmprinter.def.json msgctxt "bottom_skin_preshrink label" msgid "Bottom Skin Removal Width" -msgstr "Largura de remoção do revestimento inferior" +msgstr "Largura Remoção Revestimento Inferior" #: fdmprinter.def.json msgctxt "bottom_skin_preshrink description" -msgid "" -"The largest width of bottom skin areas which are to be removed. Every skin " -"area smaller than this value will disappear. This can help in limiting the " -"amount of time and material spent on printing bottom skin at slanted " -"surfaces in the model." +msgid "The largest width of bottom skin areas which are to be removed. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing bottom skin at slanted surfaces in the model." msgstr "A maior largura das áreas de revestimento inferiores a serem removidas. Todas as áreas de revestimento inferiores a este valor irão desaparecer. Isto pode ajudar a limitar a quantidade de tempo e material gastos na impressão do revestimento inferior nas superfícies inclinadas do modelo." #: fdmprinter.def.json msgctxt "expand_skins_expand_distance label" msgid "Skin Expand Distance" -msgstr "Distância de expansão do revestimento" +msgstr "Distância Expansão Revestimento" #: fdmprinter.def.json msgctxt "expand_skins_expand_distance description" -msgid "" -"The distance the skins are expanded into the infill. Higher values makes the " -"skin attach better to the infill pattern and makes the walls on neighboring " -"layers adhere better to the skin. Lower values save amount of material used." -msgstr "A distância a que os revestimentos são expandidos para o preenchimento. Os valores mais elevados melhoram a fixação do revestimento no padrão de preenchimento, bem como a aderência das paredes das camadas adjacentes ao revestimento. Os valores mais baixos reduzem a quantidade de material utilizado." +msgid "The distance the skins are expanded into the infill. Higher values makes the skin attach better to the infill pattern and makes the walls on neighboring layers adhere better to the skin. Lower values save amount of material used." +msgstr "A distância a que os revestimentos são expandidos para o enchimento. Os valores mais elevados melhoram a fixação do revestimento no padrão geométrico de enchimento, bem como a aderência das paredes das camadas adjacentes ao revestimento. Os valores mais baixos reduzem a quantidade de material utilizado." #: fdmprinter.def.json msgctxt "top_skin_expand_distance label" msgid "Top Skin Expand Distance" -msgstr "Distância de expansão do revestimento superior" +msgstr "Distância Expansão Revestimento Superior" #: fdmprinter.def.json msgctxt "top_skin_expand_distance description" -msgid "" -"The distance the top skins are expanded into the infill. Higher values makes " -"the skin attach better to the infill pattern and makes the walls on the " -"layer above adhere better to the skin. Lower values save amount of material " -"used." -msgstr "A distância à qual os revestimentos superiores são expandidos para o preenchimento. Os valores mais elevados melhoram a fixação do revestimento no padrão de preenchimento, bem como a aderência das paredes da camada superior ao revestimento. Os valores mais baixos reduzem a quantidade de material utilizado." +msgid "The distance the top skins are expanded into the infill. Higher values makes the skin attach better to the infill pattern and makes the walls on the layer above adhere better to the skin. Lower values save amount of material used." +msgstr "A distância à qual os revestimentos superiores são expandidos para o enchimento. Os valores mais elevados melhoram a fixação do revestimento no padrão geométrico geométrico de enchimento, bem como a aderência das paredes da camada superior ao revestimento. Os valores mais baixos reduzem a quantidade de material utilizado." #: fdmprinter.def.json msgctxt "bottom_skin_expand_distance label" msgid "Bottom Skin Expand Distance" -msgstr "Distância de expansão do revestimento inferior" +msgstr "Distância Expansão Revestimento Inferior" #: fdmprinter.def.json msgctxt "bottom_skin_expand_distance description" -msgid "" -"The distance the bottom skins are expanded into the infill. Higher values " -"makes the skin attach better to the infill pattern and makes the skin adhere " -"better to the walls on the layer below. Lower values save amount of material " -"used." -msgstr "A distância à qual os revestimentos inferiores são expandidos para o preenchimento. Os valores mais elevados melhoram a fixação do revestimento no padrão de preenchimento, bem como a aderência do revestimento às paredes da camada inferior. Os valores mais baixos reduzem a quantidade de material utilizado." +msgid "The distance the bottom skins are expanded into the infill. Higher values makes the skin attach better to the infill pattern and makes the skin adhere better to the walls on the layer below. Lower values save amount of material used." +msgstr "A distância à qual os revestimentos inferiores são expandidos para o enchimento. Os valores mais elevados melhoram a fixação do revestimento no padrão geométrico de enchimento, bem como a aderência do revestimento às paredes da camada inferior. Os valores mais baixos reduzem a quantidade de material utilizado." #: fdmprinter.def.json msgctxt "max_skin_angle_for_expansion label" @@ -1897,25 +1750,17 @@ msgstr "Ângulo máximo do revestimento para expansão" #: 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 "As superfícies superiores/inferiores do objeto com um ângulo superior a esta definição não conseguirão expandir o revestimento superior/inferior. Isto evita a expansão das áreas de revestimento reduzidas que são criadas quando a superfície do modelo apresenta uma inclinação quase vertical. Um ângulo de 0° é horizontal e um ângulo de 90° é vertical." +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 "As superfícies superiores e/ou inferiores do objeto com um ângulo superior a este valor não irão expandir o seu revestimento superior/inferior. Isto evita a expansão das áreas de revestimento reduzidas que são criadas quando a superfície do modelo apresenta uma inclinação quase vertical. Um ângulo de 0° é horizontal e um ângulo de 90° é vertical." #: fdmprinter.def.json msgctxt "min_skin_width_for_expansion label" msgid "Minimum Skin Width for Expansion" -msgstr "Largura mínima do revestimento para expansão" +msgstr "Largura Mínima Revestimento para Expansão" #: 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." +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 "As áreas de revestimento mais reduzidas do que este valor não são expandidas. Isto evita a expansão das áreas de revestimento reduzidas que são criadas quando a superfície do modelo apresenta uma inclinação quase vertical." #: fdmprinter.def.json @@ -1935,23 +1780,23 @@ msgstr "Temperatura automática" #: 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 "Muda automaticamente a temperatura de cada camada com a velocidade média de fluxo dessa camada." +msgid "Change the temperature for each layer automatically with the average flow speed of that layer." +msgstr "Mudar, automaticamente, a temperatura de cada camada com a velocidade de fluxo média dessa camada." #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" -msgstr "Temperatura de impressão predefinida" +msgstr "Temperatura Impressão Predefinida" +# rever! +# english string missing period +# devem ter como base este valor. +# devem ser baseadas neste valor. +# devem utilizar desvios com base neste valor. #: 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 "A temperatura predefinida utilizada para a impressão. Esta deve ser a temperatura \"base\" de um material. Todas as outras temperaturas de impressão devem utilizar desvios com base neste valor." +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 "A temperatura predefinida utilizada para a impressão. Esta deve ser a temperatura \"base\" de um material. Todas as outras temperaturas de impressão devem ser baseadas neste valor" #: fdmprinter.def.json msgctxt "material_print_temperature label" @@ -1966,13 +1811,11 @@ msgstr "A temperatura utilizada para a impressão." #: fdmprinter.def.json msgctxt "material_print_temperature_layer_0 label" msgid "Printing Temperature Initial Layer" -msgstr "Temperatura de impressão da camada inicial" +msgstr "Temperatura Impressão Camada Inicial" #: 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." +msgid "The temperature used for printing the first layer. Set at 0 to disable special handling of the initial layer." msgstr "A temperatura utilizada para imprimir a primeira camada. Esta é definida como 0 para desativar o manuseamento especial da camada inicial." #: fdmprinter.def.json @@ -1982,9 +1825,7 @@ msgstr "Temperatura de impressão inicial" #: 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." +msgid "The minimal temperature while heating up to the Printing Temperature at which printing can already start." msgstr "A temperatura mínima ao aquecer até à Temperatura de impressão à qual a impressão já pode começar." #: fdmprinter.def.json @@ -1994,9 +1835,7 @@ msgstr "Temperatura de impressão final" #: 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." +msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "A temperatura à qual o arrefecimento é iniciado imediatamente antes do final da impressão." #: fdmprinter.def.json @@ -2006,9 +1845,7 @@ msgstr "Gráfico de temperatura de fluxo" #: fdmprinter.def.json msgctxt "material_flow_temp_graph description" -msgid "" -"Data linking material flow (in mm3 per second) to temperature (degrees " -"Celsius)." +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." msgstr "Os dados que ligam o fluxo de material (em mm3 por segundo) à temperatura (graus Celsius)." #: fdmprinter.def.json @@ -2018,32 +1855,28 @@ msgstr "Modificador da velocidade de arrefecimento da extrusão" #: 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 "A velocidade adicional a que o bocal arrefece durante a extrusão. É utilizado o mesmo valor para indicar a velocidade de aquecimento perdida ao aquecer durante a extrusão." +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 "A velocidade adicional a que o nozzle arrefece durante a extrusão. É utilizado o mesmo valor para indicar a velocidade de aquecimento perdida ao aquecer durante a extrusão." #: fdmprinter.def.json msgctxt "material_bed_temperature label" msgid "Build Plate Temperature" -msgstr "Temperatura da placa de construção" +msgstr "Temperatura da base de construção" #: 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 "A temperatura utilizada para a placa de construção aquecida. Se for 0, a base não será aquecida para esta impressão." +msgid "The temperature used for the heated build plate. If this is 0, the bed will not heat up for this print." +msgstr "A temperatura utilizada para a base de construção aquecida. Se for 0, a base não será aquecida para esta impressão." #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" msgid "Build Plate Temperature Initial Layer" -msgstr "Temperatura da placa de construção da camada inicial" +msgstr "Temperatura da base de construção da camada inicial" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 description" msgid "The temperature used for the heated build plate at the first layer." -msgstr "A temperatura utilizada para a placa de construção aquecida na primeira camada." +msgstr "A temperatura utilizada para a base de construção aquecida na primeira camada." #: fdmprinter.def.json msgctxt "material_diameter label" @@ -2052,9 +1885,7 @@ msgstr "Diâmetro" #: 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." +msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "Ajusta o diâmetro do filamento utilizado. Faça corresponder este valor com o diâmetro do filamento utilizado." #: fdmprinter.def.json @@ -2084,36 +1915,33 @@ msgstr "Fluxo" #: fdmprinter.def.json msgctxt "material_flow description" -msgid "" -"Flow compensation: the amount of material extruded is multiplied by this " -"value." +msgid "Flow compensation: the amount of material extruded is multiplied by this value." msgstr "Compensação de fluxo: a quantidade de material extrudido é multiplicada por este valor." #: fdmprinter.def.json msgctxt "retraction_enable label" msgid "Enable Retraction" -msgstr "Ativar retração" +msgstr "Ativar Retração" #: fdmprinter.def.json msgctxt "retraction_enable description" -msgid "" -"Retract the filament when the nozzle is moving over a non-printed area. " -msgstr "Retrai o filamento quando o bocal está em movimento numa área sem impressão. " +msgid "Retract the filament when the nozzle is moving over a non-printed area. " +msgstr "Retrai o filamento quando o nozzle está em movimento numa área sem impressão. " #: fdmprinter.def.json msgctxt "retract_at_layer_change label" msgid "Retract at Layer Change" -msgstr "Retrair na mudança de camada" +msgstr "Retrair na Mudança Camada" #: fdmprinter.def.json msgctxt "retract_at_layer_change description" msgid "Retract the filament when the nozzle is moving to the next layer." -msgstr "Retrai o filamento quando o bocal se está a deslocar para a camada seguinte." +msgstr "Retrai o filamento quando o nozzle se está a deslocar para a camada seguinte." #: fdmprinter.def.json msgctxt "retraction_amount label" msgid "Retraction Distance" -msgstr "Distância de retração" +msgstr "Distância de Retração" #: fdmprinter.def.json msgctxt "retraction_amount description" @@ -2123,29 +1951,37 @@ msgstr "O comprimento do material retraído durante um movimento de retração." #: fdmprinter.def.json msgctxt "retraction_speed label" msgid "Retraction Speed" -msgstr "Velocidade de retração" +msgstr "Velocidade de Retração" #: fdmprinter.def.json msgctxt "retraction_speed description" -msgid "" -"The speed at which the filament is retracted and primed during a retraction " -"move." +msgid "The speed at which the filament is retracted and primed during a retraction move." msgstr "A velocidade a que o filamento é retraído e preparado durante um movimento de retração." +# rever! +# retrair? +# é retraido? +# recuo? +# recolhido? #: fdmprinter.def.json msgctxt "retraction_retract_speed label" msgid "Retraction Retract Speed" -msgstr "Velocidade de recolha de retração" +msgstr "Velocidade Retrair na Retração" +# rever! +# retrair? +# é retraido? +# recuo? +# recolhido? #: fdmprinter.def.json msgctxt "retraction_retract_speed description" msgid "The speed at which the filament is retracted during a retraction move." -msgstr "A velocidade a que o filamento é recolhido durante um movimento de retração." +msgstr "A velocidade a que o filamento é retraído durante um movimento de retração." #: fdmprinter.def.json msgctxt "retraction_prime_speed label" msgid "Retraction Prime Speed" -msgstr "Velocidade de preparação de retração" +msgstr "Velocidade Preparar na Retração" #: fdmprinter.def.json msgctxt "retraction_prime_speed description" @@ -2155,113 +1991,95 @@ msgstr "A velocidade a que o filamento é preparado durante um movimento de retr #: fdmprinter.def.json msgctxt "retraction_extra_prime_amount label" msgid "Retraction Extra Prime Amount" -msgstr "Quantidade de preparação adicional de retração" +msgstr "Preparação Adicional de Retração" #: 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 "Pode ocorrer vazamento de material durante um movimento de deslocação, o qual pode ser compensado aqui." +msgid "Some material can ooze away during a travel move, which can be compensated for here." +msgstr "Pode ocorrer escorrimento de material durante um movimento de deslocação, o qual pode ser compensado aqui." #: fdmprinter.def.json msgctxt "retraction_min_travel label" msgid "Retraction Minimum Travel" -msgstr "Deslocação mínima de retração" +msgstr "Deslocação Mínima da Retração" #: 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." +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 "A distância mínima de deslocação necessária para que ocorra uma retração. Isto ajuda a obter menos retrações numa área reduzida." #: fdmprinter.def.json msgctxt "retraction_count_max label" msgid "Maximum Retraction Count" -msgstr "Contagem máxima de retração" +msgstr "Número Máximo Retrações" #: 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." +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 "Esta definição limita o número de retrações que ocorrem no intervalo mínimo de distância de extrusão. As retrações adicionais dentro deste intervalo serão ignoradas. Isto evita a retração repetida no mesmo filamento, uma vez que tal pode achatar o filamento e causar problemas de trituração." #: fdmprinter.def.json msgctxt "retraction_extrusion_window label" msgid "Minimum Extrusion Distance Window" -msgstr "Intervalo mínimo de distância de extrusão" +msgstr "Intervalo Mínimo Distância Extrusão" +# de forma a que o número de vezes que uma retração acontece na mesma área do material seja efetivamente limitado. #: 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 "O intervalo no qual a contagem máxima de retração é aplicada. Este valor deve ser aproximadamente o mesmo que a distância de retração, de forma que o número de vezes que uma retração passa no mesmo retalho de material seja efetivamente limitado." +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 "O intervalo no qual o número máximo de retrações é aplicado. Este valor deve ser aproximadamente o mesmo que o da Distância de Retração, de forma a limitar, efectivamente, o número de vezes que uma retração acontece na mesma área do filamento." #: fdmprinter.def.json msgctxt "material_standby_temperature label" msgid "Standby Temperature" -msgstr "Temperatura de espera" +msgstr "Temperatura em Espera" #: fdmprinter.def.json msgctxt "material_standby_temperature description" -msgid "" -"The temperature of the nozzle when another nozzle is currently used for " -"printing." -msgstr "A temperatura do bocal quando outro bocal está a ser utilizado para a impressão." +msgid "The temperature of the nozzle when another nozzle is currently used for printing." +msgstr "A temperatura do nozzle quando outro nozzle está a ser utilizado para a impressão." +# rever! +# restantes retração srtings #: fdmprinter.def.json msgctxt "switch_extruder_retraction_amount label" msgid "Nozzle Switch Retraction Distance" -msgstr "Distância de retração de substituição do bocal" +msgstr "Distância de retração de substituição do nozzle" #: 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." +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 "A quantidade de retração: defina como 0 para não obter qualquer retração. Normalmente, esta deve ser a mesma que o comprimento da zona de aquecimento." #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speeds label" msgid "Nozzle Switch Retraction Speed" -msgstr "Velocidade de retração de substituição do bocal" +msgstr "Velocidade de retração de substituição do nozzle" #: 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." +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 "A velocidade a que o filamento é retraído. Uma maior velocidade de retração funciona melhor, mas uma velocidade de retração muito elevada pode resultar na trituração do filamento." #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speed label" msgid "Nozzle Switch Retract Speed" -msgstr "Velocidade de recolha de substituição do bocal" +msgstr "Velocidade de recolha de substituição do nozzle" #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speed description" -msgid "" -"The speed at which the filament is retracted during a nozzle switch retract." -msgstr "A velocidade a que o filamento é retraído durante uma recolha de substituição do bocal." +msgid "The speed at which the filament is retracted during a nozzle switch retract." +msgstr "A velocidade a que o filamento é retraído durante uma recolha de substituição do nozzle." #: fdmprinter.def.json msgctxt "switch_extruder_prime_speed label" msgid "Nozzle Switch Prime Speed" -msgstr "Velocidade de preparação de substituição do bocal" +msgstr "Velocidade de preparação de substituição do nozzle" #: 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 "A velocidade a que o filamento é empurrado após uma retração de substituição do bocal." +msgid "The speed at which the filament is pushed back after a nozzle switch retraction." +msgstr "A velocidade a que o filamento é empurrado após uma retração de substituição do nozzle." #: fdmprinter.def.json msgctxt "speed label" @@ -2276,8 +2094,13 @@ msgstr "Velocidade" #: fdmprinter.def.json msgctxt "speed_print label" msgid "Print Speed" -msgstr "Velocidade de impressão" +msgstr "Velocidade de Impressão" +# rever! +# a que +# em que +# com que ?? +# com qual #: fdmprinter.def.json msgctxt "speed_print description" msgid "The speed at which printing happens." @@ -2286,17 +2109,22 @@ msgstr "A velocidade a que é efetuada a impressão." #: fdmprinter.def.json msgctxt "speed_infill label" msgid "Infill Speed" -msgstr "Velocidade de preenchimento" +msgstr "Velocidade Enchimento" +# rever! +# a que +# em que +# com que ?? +# com qual #: fdmprinter.def.json msgctxt "speed_infill description" msgid "The speed at which infill is printed." -msgstr "A velocidade a que o preenchimento é impresso." +msgstr "A velocidade a que o enchimento é impresso." #: fdmprinter.def.json msgctxt "speed_wall label" msgid "Wall Speed" -msgstr "Velocidade de parede" +msgstr "Velocidade Paredes" #: fdmprinter.def.json msgctxt "speed_wall description" @@ -2306,34 +2134,31 @@ msgstr "A velocidade a que as paredes são impressas." #: fdmprinter.def.json msgctxt "speed_wall_0 label" msgid "Outer Wall Speed" -msgstr "Velocidade de parede externa" +msgstr "Velocidade Parede Exterior" +# rever! +# english string correct? plural? #: 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 "A velocidade a que as paredes externas são impressas. Imprimir a parede externa a uma velocidade mais reduzida melhora a qualidade final do revestimento. No entanto, a existência de uma grande diferença entre a velocidade da parede interna e a velocidade de parede externa afetará a qualidade de forma negativa." +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 "A velocidade a que as paredes exteriores são impressas. Imprimir a parede exterior a uma velocidade mais reduzida melhora a qualidade final do revestimento. No entanto, a existência de uma grande diferença entre a velocidade da parede interior e a velocidade de parede exterior afetará a qualidade de uma forma negativa." #: fdmprinter.def.json msgctxt "speed_wall_x label" msgid "Inner Wall Speed" -msgstr "Velocidade de parede interna" +msgstr "Velocidade Parede Interior" +# rever! +# É conveniente introduzir esta definição entre a velocidade de parede exterior e a velocidade de enchimento. #: 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 "A velocidade a que todas as paredes internas são impressas. Imprimir a parede interna mais rapidamente do que a parede externa irá reduzir o tempo de impressão. É conveniente introduzir esta definição entre a velocidade de parede externa e a velocidade de preenchimento." +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 "A velocidade a que todas as paredes interiores são impressas. Imprimir a parede interior mais rapidamente do que a parede exterior irá reduzir o tempo de impressão. O resultado é melhor quando este valor é entre a velocidade de parede exterior e a velocidade de enchimento." #: fdmprinter.def.json msgctxt "speed_roofing label" msgid "Top Surface Skin Speed" -msgstr "Velocidade de revestimento da superfície superior" +msgstr "Velocidade Revestimento Superior" #: fdmprinter.def.json msgctxt "speed_roofing description" @@ -2343,7 +2168,7 @@ msgstr "A velocidade a que as camadas de revestimento da superfície superior s #: fdmprinter.def.json msgctxt "speed_topbottom label" msgid "Top/Bottom Speed" -msgstr "Velocidade superior/inferior" +msgstr "Velocidade Superior/Inferior" #: fdmprinter.def.json msgctxt "speed_topbottom description" @@ -2353,27 +2178,22 @@ msgstr "A velocidade a que as camadas superiores/inferiores são impressas." #: fdmprinter.def.json msgctxt "speed_support label" msgid "Support Speed" -msgstr "Velocidade de suporte" +msgstr "Velocidade Suporte" #: 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." +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 "A velocidade a que a estrutura de suporte é impressa. Imprimir o suporte a velocidades elevadas pode reduzir consideravelmente o tempo de impressão. A qualidade da superfície da estrutura de suporte não é importante, uma vez que esta é removida após a impressão." #: fdmprinter.def.json msgctxt "speed_support_infill label" msgid "Support Infill Speed" -msgstr "Velocidade de preenchimento do suporte" +msgstr "Velocidade de enchimento do suporte" #: 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 "A velocidade a que o preenchimento do suporte é impresso. Imprimir o preenchimento a velocidades baixas melhora a estabilidade." +msgid "The speed at which the infill of support is printed. Printing the infill at lower speeds improves stability." +msgstr "A velocidade a que o enchimento do suporte é impresso. Imprimir o enchimento a velocidades baixas melhora a estabilidade." #: fdmprinter.def.json msgctxt "speed_support_interface label" @@ -2382,22 +2202,18 @@ msgstr "Velocidade da interface de suporte" #: 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 "A velocidade a que os tetos e os pisos de suporte são impressos. Imprimi-los a velocidades baixas pode melhorar a qualidade das saliências." +msgid "The speed at which the roofs and floors of support are printed. Printing them at lower speeds can improve overhang quality." +msgstr "A velocidade a que os tectos e os pisos de suporte são impressos. Imprimi-los a velocidades baixas pode melhorar a qualidade das saliências." #: fdmprinter.def.json msgctxt "speed_support_roof label" msgid "Support Roof Speed" -msgstr "Velocidade do teto de suporte" +msgstr "Velocidade do tecto de suporte" #: 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 "A velocidade a que os tetos de suporte são impressos. Imprimi-los a velocidades baixas pode melhorar a qualidade das saliências." +msgid "The speed at which the roofs of support are printed. Printing them at lower speeds can improve overhang quality." +msgstr "A velocidade a que os tectos de suporte são impressos. Imprimi-los a velocidades baixas pode melhorar a qualidade das saliências." #: fdmprinter.def.json msgctxt "speed_support_bottom label" @@ -2406,9 +2222,7 @@ msgstr "Velocidade do piso de suporte" #: 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." +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 "A velocidade a que o piso de suporte é impresso. Imprimi-lo a uma velocidade baixa pode melhorar a aderência do suporte na parte superior do modelo." #: fdmprinter.def.json @@ -2418,10 +2232,7 @@ msgstr "Velocidade da torre de preparação" #: 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." +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 "A velocidade à qual a torre de preparação é impressa. Imprimir a torre de preparação mais lentamente pode torná-la mais estável quando a aderência entre os diferentes filamentos é insuficiente." #: fdmprinter.def.json @@ -2437,14 +2248,12 @@ msgstr "A velocidade a que os movimentos de deslocação são efetuados." #: fdmprinter.def.json msgctxt "speed_layer_0 label" msgid "Initial Layer Speed" -msgstr "Velocidade da camada inicial" +msgstr "Velocidade Camada Inicial" #: 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 "A velocidade da camada inicial. É recomendado um valor inferior para melhorar a aderência à placa de construção." +msgid "The speed for the initial layer. A lower value is advised to improve adhesion to the build plate." +msgstr "A velocidade da camada inicial. É recomendado um valor inferior para melhorar a aderência à base de construção." #: fdmprinter.def.json msgctxt "speed_print_layer_0 label" @@ -2453,10 +2262,8 @@ msgstr "Velocidade de impressão da camada inicial" #: 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 "A velocidade de impressão da camada inicial. É recomendado um valor inferior para melhorar a aderência à placa de construção." +msgid "The speed of printing for the initial layer. A lower value is advised to improve adhesion to the build plate." +msgstr "A velocidade de impressão da camada inicial. É recomendado um valor inferior para melhorar a aderência à base de construção." #: fdmprinter.def.json msgctxt "speed_travel_layer_0 label" @@ -2465,37 +2272,29 @@ msgstr "Velocidade de deslocação da camada inicial" #: 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 "A velocidade dos movimentos de deslocação na camada inicial. É recomendado um valor inferior para evitar que as peças anteriormente impressas sejam separadas da placa de construção. O valor desta definição pode ser automaticamente calculado a partir da proporção entre a Velocidade de deslocação e a Velocidade de impressão." +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 "A velocidade dos movimentos de deslocação na camada inicial. É recomendado um valor inferior para evitar que as peças anteriormente impressas sejam separadas da base de construção. O valor desta definição pode ser automaticamente calculado a partir da proporção entre a Velocidade de deslocação e a Velocidade de impressão." #: fdmprinter.def.json msgctxt "skirt_brim_speed label" msgid "Skirt/Brim Speed" -msgstr "Velocidade de contorno/borda" +msgstr "Velocidade Contorno / Aba" #: 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 "A velocidade a que o contorno e a borda são impressos. Geralmente, isto é efetuado à velocidade de camada inicial, mas, por vezes, pode preferir imprimir o contorno ou a borda a uma velocidade diferente." +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 "A velocidade a que o contorno e a aba são impressos. Geralmente, isto é efetuado à velocidade de camada inicial, mas, por vezes, pode preferir imprimir o contorno ou a aba a uma velocidade diferente." #: fdmprinter.def.json msgctxt "max_feedrate_z_override label" msgid "Maximum Z Speed" msgstr "Velocidade Z máxima" +# a que a base de construção é movida. Defini-la como zero #: 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 "A velocidade máxima a que a placa de construção é movida. Defini-la como zero faz com que a impressão utilize as predefinições de firmware para a velocidade Z máxima." +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 "A velocidade máxima do movimento da base de construção. Definir esta como zero faz com que a impressão utilize as predefinições de firmware para a velocidade Z máxima." #: fdmprinter.def.json msgctxt "speed_slowdown_layers label" @@ -2504,11 +2303,8 @@ msgstr "Número de camadas mais lentas" #: 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 "As primeiras camadas são impressas mais lentamente do que o resto do modelo para obter uma melhor aderência à placa de construção e melhorar a taxa de sucesso geral das impressões. A velocidade é aumentada gradualmente nessas camadas." +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 "As primeiras camadas são impressas mais lentamente do que o resto do modelo para obter uma melhor aderência à base de construção e melhorar a taxa de sucesso geral das impressões. A velocidade é aumentada gradualmente nessas camadas." #: fdmprinter.def.json msgctxt "speed_equalize_flow_enabled label" @@ -2517,12 +2313,8 @@ msgstr "Equilibrar fluxo de filamento" #: 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 "Imprime linhas mais finas do que o normal de forma mais rápida, para que a quantidade de material extrudido por segundo permaneça o mesmo. As peças finas do modelo podem requerer linhas impressas com uma menor largura de linha do que a fornecida nas definições. Esta definição controla as mudanças de velocidade dessas linhas." +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 "Imprime linhas mais finas do que o normal de forma mais rápida, para que a quantidade de material extrudido por segundo permaneça o mesmo. As peças finas do modelo podem requerer linhas impressas com uma menor espessura de linha do que a especificada nas definições. Esta definição controla as mudanças de velocidade dessas linhas." #: fdmprinter.def.json msgctxt "speed_equalize_flow_max label" @@ -2531,8 +2323,7 @@ msgstr "Velocidade máxima para equilíbrio de fluxo" #: fdmprinter.def.json msgctxt "speed_equalize_flow_max description" -msgid "" -"Maximum print speed when adjusting the print speed in order to equalize flow." +msgid "Maximum print speed when adjusting the print speed in order to equalize flow." msgstr "A velocidade máxima de impressão ao ajustar a velocidade de impressão para equilibrar o fluxo." #: fdmprinter.def.json @@ -2542,9 +2333,7 @@ msgstr "Ativar controlo da aceleração" #: 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." +msgid "Enables adjusting the print head acceleration. Increasing the accelerations can reduce printing time at the cost of print quality." msgstr "Permite o ajuste da aceleração da cabeça de impressão. Aumentar as acelerações pode reduzir o tempo de impressão em detrimento da qualidade de impressão." #: fdmprinter.def.json @@ -2560,12 +2349,12 @@ msgstr "A aceleração com que é efetuada a impressão." #: fdmprinter.def.json msgctxt "acceleration_infill label" msgid "Infill Acceleration" -msgstr "Aceleração de preenchimento" +msgstr "Aceleração de enchimento" #: fdmprinter.def.json msgctxt "acceleration_infill description" msgid "The acceleration with which infill is printed." -msgstr "A aceleração com que o preenchimento é impresso." +msgstr "A aceleração com que o enchimento é impresso." #: fdmprinter.def.json msgctxt "acceleration_wall label" @@ -2580,27 +2369,27 @@ msgstr "A aceleração com que as paredes são impressas." #: fdmprinter.def.json msgctxt "acceleration_wall_0 label" msgid "Outer Wall Acceleration" -msgstr "Aceleração da parede externa" +msgstr "Aceleração da parede exterior" #: fdmprinter.def.json msgctxt "acceleration_wall_0 description" msgid "The acceleration with which the outermost walls are printed." -msgstr "A aceleração com que as paredes mais externas são impressas." +msgstr "A aceleração com que as paredes exteriores são impressas." #: fdmprinter.def.json msgctxt "acceleration_wall_x label" msgid "Inner Wall Acceleration" -msgstr "Aceleração da parede interna" +msgstr "Aceleração da parede interior" #: fdmprinter.def.json msgctxt "acceleration_wall_x description" msgid "The acceleration with which all inner walls are printed." -msgstr "A aceleração com que todas as paredes internas são impressas." +msgstr "A aceleração com que todas as paredes interiores são impressas." #: fdmprinter.def.json msgctxt "acceleration_roofing label" msgid "Top Surface Skin Acceleration" -msgstr "Aceleração do revestimento da superfície superior" +msgstr "Aceleração Revestimento Superior" #: fdmprinter.def.json msgctxt "acceleration_roofing description" @@ -2630,12 +2419,12 @@ msgstr "A aceleração com que a estrutura de suporte é impressa." #: fdmprinter.def.json msgctxt "acceleration_support_infill label" msgid "Support Infill Acceleration" -msgstr "Aceleração de preenchimento do suporte" +msgstr "Aceleração de enchimento do suporte" #: fdmprinter.def.json msgctxt "acceleration_support_infill description" msgid "The acceleration with which the infill of support is printed." -msgstr "A aceleração com que o preenchimento do suporte é impresso." +msgstr "A aceleração com que o enchimento do suporte é impresso." #: fdmprinter.def.json msgctxt "acceleration_support_interface label" @@ -2644,22 +2433,18 @@ msgstr "Aceleração da interface de suporte" #: 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 "A aceleração com que os tetos e pisos de suporte são impressos. Imprimi-los com uma aceleração inferior pode melhorar a qualidade das saliências." +msgid "The acceleration with which the roofs and floors of support are printed. Printing them at lower acceleration can improve overhang quality." +msgstr "A aceleração com que os tectos e pisos de suporte são impressos. Imprimi-los com uma aceleração inferior pode melhorar a qualidade das saliências." #: fdmprinter.def.json msgctxt "acceleration_support_roof label" msgid "Support Roof Acceleration" -msgstr "Aceleração do teto de suporte" +msgstr "Aceleração do tecto de suporte" #: 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 "A aceleração com que os tetos de suporte são impressos. Imprimi-los com uma aceleração inferior pode melhorar a qualidade das saliências." +msgid "The acceleration with which the roofs of support are printed. Printing them at lower acceleration can improve overhang quality." +msgstr "A aceleração com que os tectos de suporte são impressos. Imprimi-los com uma aceleração inferior pode melhorar a qualidade das saliências." #: fdmprinter.def.json msgctxt "acceleration_support_bottom label" @@ -2668,9 +2453,7 @@ msgstr "Aceleração do piso de suporte" #: 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." +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 "A aceleração com que os pisos de suporte são impressos. Imprimi-los com uma aceleração inferior pode melhorar a aderência do suporte na parte superior do modelo." #: fdmprinter.def.json @@ -2726,195 +2509,176 @@ msgstr "A aceleração dos movimentos de deslocação na camada inicial." #: fdmprinter.def.json msgctxt "acceleration_skirt_brim label" msgid "Skirt/Brim Acceleration" -msgstr "Aceleração de contorno/borda" +msgstr "Aceleração Contorno / Aba" #: 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 "A aceleração com que o contorno e a borda são impressos. Geralmente, isto é efetuado com a aceleração da camada inicial, mas, por vezes, pode preferir imprimir o contorno ou a borda com uma aceleração diferente." +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 "A aceleração com que o contorno e a aba são impressos. Normalmente, isto é efetuado com a aceleração da camada inicial, mas, por vezes, pode preferir imprimir o contorno ou a aba com uma aceleração diferente." #: fdmprinter.def.json msgctxt "jerk_enabled label" msgid "Enable Jerk Control" -msgstr "Ativar controlo de solavanco" +msgstr "Ativar Controlo do Jerk" +# rever! +# solavanco? +# movimento brusco #: 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 "Permite o ajuste do solavanco da cabeça de impressão quando a velocidade nos eixos X ou Y muda. Aumentar o solavanco pode reduzir o tempo de impressão em detrimento da qualidade de impressão." +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 "Permite ajustar o jerk da cabeça de impressão quando a velocidade nos eixos X ou Y muda. Aumentar o jerk pode reduzir o tempo de impressão em detrimento da qualidade de impressão." #: fdmprinter.def.json msgctxt "jerk_print label" msgid "Print Jerk" -msgstr "Solavanco de impressão" +msgstr "Jerk da Impressão" +# rever! +# all jerk strings +# ver qual a trad é mais aproximada doo sentido original +# tradução original - A mudança de velocidade instantânea máxima da cabeça de impressão. #: fdmprinter.def.json msgctxt "jerk_print description" msgid "The maximum instantaneous velocity change of the print head." -msgstr "A mudança de velocidade instantânea máxima da cabeça de impressão." +msgstr "A velocidade instantânea máxima num movimento brusco da cabeça de impressão." #: fdmprinter.def.json msgctxt "jerk_infill label" msgid "Infill Jerk" -msgstr "Solavanco de preenchimento" +msgstr "Jerk do Enchimento" #: fdmprinter.def.json msgctxt "jerk_infill description" msgid "The maximum instantaneous velocity change with which infill is printed." -msgstr "A mudança de velocidade instantânea máxima com a qual o preenchimento é impresso." +msgstr "A mudança de velocidade instantânea máxima com a qual o enchimento é impresso." #: fdmprinter.def.json msgctxt "jerk_wall label" msgid "Wall Jerk" -msgstr "Solavanco de parede" +msgstr "Jerk das Paredes" #: fdmprinter.def.json msgctxt "jerk_wall description" -msgid "" -"The maximum instantaneous velocity change with which the walls are printed." +msgid "The maximum instantaneous velocity change with which the walls are printed." msgstr "A mudança de velocidade instantânea máxima com a qual as paredes são impressas." #: fdmprinter.def.json msgctxt "jerk_wall_0 label" msgid "Outer Wall Jerk" -msgstr "Solavanco de parede externa" +msgstr "Jerk da Parede Exterior" #: fdmprinter.def.json msgctxt "jerk_wall_0 description" -msgid "" -"The maximum instantaneous velocity change with which the outermost walls are " -"printed." -msgstr "A mudança de velocidade instantânea máxima com a qual as paredes externas são impressas." +msgid "The maximum instantaneous velocity change with which the outermost walls are printed." +msgstr "A mudança de velocidade instantânea máxima com a qual as paredes exteriores são impressas." #: fdmprinter.def.json msgctxt "jerk_wall_x label" msgid "Inner Wall Jerk" -msgstr "Solavanco de parede interna" +msgstr "Jerk das Paredes Interiores" #: fdmprinter.def.json msgctxt "jerk_wall_x description" -msgid "" -"The maximum instantaneous velocity change with which all inner walls are " -"printed." -msgstr "A mudança de velocidade instantânea máxima com a qual todas as paredes internas são impressas." +msgid "The maximum instantaneous velocity change with which all inner walls are printed." +msgstr "A mudança de velocidade instantânea máxima com a qual todas as paredes interiores são impressas." #: fdmprinter.def.json msgctxt "jerk_roofing label" msgid "Top Surface Skin Jerk" -msgstr "Solavanco de revestimento da superfície superior" +msgstr "Jerk Revestimento Superior" #: fdmprinter.def.json msgctxt "jerk_roofing description" -msgid "" -"The maximum instantaneous velocity change with which top surface skin layers " -"are printed." +msgid "The maximum instantaneous velocity change with which top surface skin layers are printed." msgstr "A mudança de velocidade instantânea máxima com a qual as camadas de revestimento da superfície superior são impressas." #: fdmprinter.def.json msgctxt "jerk_topbottom label" msgid "Top/Bottom Jerk" -msgstr "Solavanco superior/inferior" +msgstr "Jerk Superior/Inferior" #: fdmprinter.def.json msgctxt "jerk_topbottom description" -msgid "" -"The maximum instantaneous velocity change with which top/bottom layers are " -"printed." +msgid "The maximum instantaneous velocity change with which top/bottom layers are printed." msgstr "A mudança de velocidade instantânea máxima com a qual as camadas superiores/inferiores são impressas." #: fdmprinter.def.json msgctxt "jerk_support label" msgid "Support Jerk" -msgstr "Solavanco de suporte" +msgstr "Jerk do Suporte" #: fdmprinter.def.json msgctxt "jerk_support description" -msgid "" -"The maximum instantaneous velocity change with which the support structure " -"is printed." +msgid "The maximum instantaneous velocity change with which the support structure is printed." msgstr "A mudança de velocidade instantânea máxima com a qual a estrutura de suporte é impressa." #: fdmprinter.def.json msgctxt "jerk_support_infill label" msgid "Support Infill Jerk" -msgstr "Solavanco de preenchimento do suporte" +msgstr "Jerk do Enchimento do Suporte" #: fdmprinter.def.json msgctxt "jerk_support_infill description" -msgid "" -"The maximum instantaneous velocity change with which the infill of support " -"is printed." -msgstr "A mudança de velocidade instantânea máxima com a qual o preenchimento do suporte é impresso." +msgid "The maximum instantaneous velocity change with which the infill of support is printed." +msgstr "A mudança de velocidade instantânea máxima com a qual o enchimento do suporte é impresso." #: fdmprinter.def.json msgctxt "jerk_support_interface label" msgid "Support Interface Jerk" -msgstr "Solavanco de interface de suporte" +msgstr "Jerk da Interface do Suporte" #: 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 "A mudança de velocidade instantânea máxima com a qual os tetos e pisos de suporte são impressos." +msgid "The maximum instantaneous velocity change with which the roofs and floors of support are printed." +msgstr "A mudança de velocidade instantânea máxima com a qual os tectos e pisos de suporte são impressos." #: fdmprinter.def.json msgctxt "jerk_support_roof label" msgid "Support Roof Jerk" -msgstr "Solavanco de teto de suporte" +msgstr "Jerk do Tecto do Suporte" #: fdmprinter.def.json msgctxt "jerk_support_roof description" -msgid "" -"The maximum instantaneous velocity change with which the roofs of support " -"are printed." -msgstr "A mudança de velocidade instantânea máxima com a qual os tetos de suporte são impressos." +msgid "The maximum instantaneous velocity change with which the roofs of support are printed." +msgstr "A mudança de velocidade instantânea máxima com a qual os tectos de suporte são impressos." +# rever! +# piso? #: fdmprinter.def.json msgctxt "jerk_support_bottom label" msgid "Support Floor Jerk" -msgstr "Solavanco de piso de suporte" +msgstr "Jerk do Piso do Suporte" #: fdmprinter.def.json msgctxt "jerk_support_bottom description" -msgid "" -"The maximum instantaneous velocity change with which the floors of support " -"are printed." +msgid "The maximum instantaneous velocity change with which the floors of support are printed." msgstr "A mudança de velocidade instantânea máxima com a qual os pisos de suporte são impressos." #: fdmprinter.def.json msgctxt "jerk_prime_tower label" msgid "Prime Tower Jerk" -msgstr "Solavanco da torre de preparação" +msgstr "Jerk da Torre de Preparação" #: fdmprinter.def.json msgctxt "jerk_prime_tower description" -msgid "" -"The maximum instantaneous velocity change with which the prime tower is " -"printed." +msgid "The maximum instantaneous velocity change with which the prime tower is printed." msgstr "A mudança de velocidade instantânea máxima com a qual a torre de preparação é impressa." #: fdmprinter.def.json msgctxt "jerk_travel label" msgid "Travel Jerk" -msgstr "Solavanco de deslocação" +msgstr "Jerk de Deslocação" #: fdmprinter.def.json msgctxt "jerk_travel description" -msgid "" -"The maximum instantaneous velocity change with which travel moves are made." +msgid "The maximum instantaneous velocity change with which travel moves are made." msgstr "A mudança de velocidade instantânea máxima com a qual os movimentos de deslocação são impressos." #: fdmprinter.def.json msgctxt "jerk_layer_0 label" msgid "Initial Layer Jerk" -msgstr "Solavanco de camada inicial" +msgstr "Jerk da Camada Inicial" #: fdmprinter.def.json msgctxt "jerk_layer_0 description" @@ -2924,19 +2688,17 @@ msgstr "A mudança de velocidade instantânea máxima de impressão para a camad #: fdmprinter.def.json msgctxt "jerk_print_layer_0 label" msgid "Initial Layer Print Jerk" -msgstr "Solavanco de impressão da camada inicial" +msgstr "Jerk Impressão Camada Inicial" #: fdmprinter.def.json msgctxt "jerk_print_layer_0 description" -msgid "" -"The maximum instantaneous velocity change during the printing of the initial " -"layer." +msgid "The maximum instantaneous velocity change during the printing of the initial layer." msgstr "A mudança de velocidade instantânea máxima durante a impressão da camada inicial." #: fdmprinter.def.json msgctxt "jerk_travel_layer_0 label" msgid "Initial Layer Travel Jerk" -msgstr "Solavanco de deslocação da camada inicial" +msgstr "Jerk Deslocação Camada Inicial" #: fdmprinter.def.json msgctxt "jerk_travel_layer_0 description" @@ -2946,15 +2708,20 @@ msgstr "A aceleração dos movimentos de deslocação na camada inicial." #: fdmprinter.def.json msgctxt "jerk_skirt_brim label" msgid "Skirt/Brim Jerk" -msgstr "Solavanco de contorno/borda" +msgstr "Jerk de Contorno / Aba" #: fdmprinter.def.json msgctxt "jerk_skirt_brim description" -msgid "" -"The maximum instantaneous velocity change with which the skirt and brim are " -"printed." -msgstr "A mudança de velocidade instantânea máxima com a qual o contorno e a borda são impressos." +msgid "The maximum instantaneous velocity change with which the skirt and brim are printed." +msgstr "A mudança de velocidade instantânea máxima com a qual o contorno e a aba são impressos." +# rever! +# Deslocação? +# Deslocamento? +# Movimento? +# Viagem? +# Trajectória? +# Travel? #: fdmprinter.def.json msgctxt "travel label" msgid "Travel" @@ -2968,17 +2735,12 @@ msgstr "deslocação" #: fdmprinter.def.json msgctxt "retraction_combing label" msgid "Combing Mode" -msgstr "Modo de combing" +msgstr "Modo de Combing" #: 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 "O combing mantém o bocal nas áreas já impressas durante a deslocação. Isto resulta em movimentos de deslocação ligeiramente mais longos, mas reduz a necessidade de retrações. Se o combing estiver desativado, o material será retraído e o bocal irá deslocar-se em linha reta para o próximo ponto. Também é possível evitar o combing em áreas de revestimento superiores/inferiores efetuando o combing apenas no preenchimento." +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 "\"Combing\" mantém o nozzle dentro das áreas já impressas durante o movimento. Isto resulta em movimentos ligeiramente mais longos, mas reduz a necessidade de retrações. Se o \"Combing\" estiver desativado, o material será retraído e o nozzle irá deslocar-se em linha recta para o próximo ponto. Também é possível evitar o \"Combing\" em áreas de revestimento superiores/inferiores efetuando o \"Combing\" apenas dentro do enchimento." #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -2993,29 +2755,27 @@ msgstr "Tudo" #: fdmprinter.def.json msgctxt "retraction_combing option noskin" msgid "No Skin" -msgstr "Sem revestimento" +msgstr "Sem Revestimento" #: fdmprinter.def.json msgctxt "travel_retract_before_outer_wall label" msgid "Retract Before Outer Wall" -msgstr "Retrair antes da parede externa" +msgstr "Retrair Antes Parede Exterior" #: fdmprinter.def.json msgctxt "travel_retract_before_outer_wall description" msgid "Always retract when moving to start an outer wall." -msgstr "Retrair sempre durante o movimento de início de uma parede externa." +msgstr "Retrair sempre quando se vai começar uma parede exterior." #: fdmprinter.def.json msgctxt "travel_avoid_other_parts label" msgid "Avoid Printed Parts When Traveling" -msgstr "Evitar peças impressas durante a deslocação" +msgstr "Evitar Áreas Impressas Durante Movimento" #: 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 "O bocal evita as peças já impressas durante a deslocação. Esta opção só está disponível quando o combing está ativado." +msgid "The nozzle avoids already printed parts when traveling. This option is only available when combing is enabled." +msgstr "O nozzle evita as áreas já impressas durante a deslocação. Esta opção só está disponível quando o combing está ativado." #: fdmprinter.def.json msgctxt "travel_avoid_distance label" @@ -3024,62 +2784,48 @@ msgstr "Distância para evitar peças durante a deslocação" #: fdmprinter.def.json msgctxt "travel_avoid_distance description" -msgid "" -"The distance between the nozzle and already printed parts when avoiding " -"during travel moves." -msgstr "A distância entre o bocal e as peças já impressas ao evitá-las durante os movimentos de deslocação." +msgid "The distance between the nozzle and already printed parts when avoiding during travel moves." +msgstr "A distância entre o nozzle e as peças já impressas ao evitá-las durante os movimentos de deslocação." #: fdmprinter.def.json msgctxt "start_layers_at_same_position label" msgid "Start Layers with the Same Part" -msgstr "Iniciar camadas com a mesma peça" +msgstr "Começar Camadas Mesmo Objecto" #: 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 "Em cada camada, comece por imprimir o objeto junto ao mesmo ponto para não iniciar uma nova camada imprimindo a peça com a qual terminou a camada anterior. Isto produz melhores saliências e pequenas peças, mas aumenta o tempo de impressão." +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 "Em cada camada, começar a imprimir o objeto perto do mesmo ponto, para não se começar a imprimir uma nova camada com a peça com a qual se terminou a camada anterior. O que resulta em melhores impressões de saliências e de pequenos objectos, mas aumenta o tempo de impressão." #: fdmprinter.def.json msgctxt "layer_start_x label" msgid "Layer Start X" -msgstr "X de início da camada" +msgstr "X Início Camada" #: 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." +msgid "The X coordinate of the position near where to find the part to start printing each layer." msgstr "A coordenada X da posição próxima do local onde se situa a peça pela qual iniciar a impressão de cada camada." #: fdmprinter.def.json msgctxt "layer_start_y label" msgid "Layer Start Y" -msgstr "Y de início da camada" +msgstr "Y Início Camada" #: 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." +msgid "The Y coordinate of the position near where to find the part to start printing each layer." msgstr "A coordenada Y da posição do local onde se situa a peça pela qual iniciar a impressão de cada camada." #: fdmprinter.def.json msgctxt "retraction_hop_enabled label" msgid "Z Hop When Retracted" -msgstr "Salto Z ao retrair" +msgstr "Salto-Z ao Retrair" #: 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 "Sempre que for efetuada uma retração, a placa de construção é baixada para criar uma folga entre o bocal e a impressão. Desta forma, evita-se que o bocal atinja a impressão durante os movimentos de deslocação, reduzindo a probabilidade de derrubar a impressão da placa de construção." +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 "Sempre que for efetuada uma retração, a base de construção é rebaixada para criar uma folga entre o nozzle e a impressão. Desta forma, evita-se que o nozzle atinja a impressão durante os movimentos de deslocação, reduzindo a probabilidade de derrubar a impressão da base de construção." #: fdmprinter.def.json msgctxt "retraction_hop_only_when_collides label" @@ -3088,34 +2834,39 @@ msgstr "Salto Z apenas sobre as peças impressas" #: 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 "Efetua um salto Z apenas ao deslocar-se sobre as peças impressas que não podem ser evitadas pelo movimento horizontal através da opção Evitar peças impressas durante a deslocação." +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 "Efetua um salto Z apenas ao deslocar-se sobre as peças impressas que não podem ser evitadas pelo movimento horizontal através da opção Evitar Peças impressas durante a deslocação." #: fdmprinter.def.json msgctxt "retraction_hop label" msgid "Z Hop Height" -msgstr "Altura do salto Z" +msgstr "Altura do Salto-Z" #: fdmprinter.def.json msgctxt "retraction_hop description" msgid "The height difference when performing a Z Hop." -msgstr "A diferença de altura ao efetuar um salto Z." +msgstr "A diferença de altura ao efetuar um Salto-Z." +# rever! +# Salto? +# Pulo? +# Rebaixar? #: fdmprinter.def.json msgctxt "retraction_hop_after_extruder_switch label" msgid "Z Hop After Extruder Switch" -msgstr "Salto Z após substituição da extrusora" +msgstr "Salto-Z Após Mudança Extrusor" +# rever! #: 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 "Após a máquina mudar de uma extrusora para outra, a placa de construção é baixada para criar uma folga entre o bocal e a impressão. Desta forma, evita-se que o bocal liberte material vazado para a parte exterior de uma impressão." +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 "Após a máquina mudar de um extrusor para outro, a base de construção é rebaixada para criar uma folga entre o nozzle e a impressão. Desta forma, evita-se que o nozzle deixe, na parte exterior de uma impressão, algum material que possa escorrer quando acaba de imprimir." +# rever! +# todoas as strings de Arrefecimento +# limiar? +# intervalo? +# limite? #: fdmprinter.def.json msgctxt "cooling label" msgid "Cooling" @@ -3129,102 +2880,87 @@ msgstr "Arrefecimento" #: fdmprinter.def.json msgctxt "cool_fan_enabled label" msgid "Enable Print Cooling" -msgstr "Ativar arrefecimento de impressão" +msgstr "Ativar Arrefecimento Impressão" #: 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 "Ativa as ventoinhas de arrefecimento de impressão ao imprimir. As ventoinhas melhoram a qualidade de impressão com menores tempos de camada e pontes/saliências." +msgid "Enables the print cooling fans while printing. The fans improve print quality on layers with short layer times and bridging / overhangs." +msgstr "Ativa os ventiladores de arrefecimento durante a impressão. Os ventiladores melhoram a qualidade de impressão, nas camadas que têm uma curta duração de impressão e / ou nas partes do modelo que contêm vãos / saliências." #: fdmprinter.def.json msgctxt "cool_fan_speed label" msgid "Fan Speed" -msgstr "Velocidade da ventoinha" +msgstr "Velocidade Ventiladores" +# rever! +# ...giram. +# A velocidade a que giram os ventiladores... +# rotação? +# A velocidade de rotação dos ventiladores... #: fdmprinter.def.json msgctxt "cool_fan_speed description" msgid "The speed at which the print cooling fans spin." -msgstr "A velocidade a que as ventoinhas de arrefecimento da impressão giram." +msgstr "A velocidade de rotação dos ventiladores de arrefecimento da impressão." #: fdmprinter.def.json msgctxt "cool_fan_speed_min label" msgid "Regular Fan Speed" -msgstr "Velocidade normal da ventoinha" +msgstr "Velocidade Normal Ventiladores" #: 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 "A velocidade a que as ventoinhas giram antes de atingir o limiar. Quando uma camada é impressa mais rapidamente do que o limiar, a velocidade da ventoinha tende gradualmente a aproximar-se da velocidade máxima." +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 "A velocidade a que os ventiladores giram antes de atingir o limiar. Quando uma camada é impressa mais rapidamente do que o limiar, a velocidade do ventilador tende gradualmente a aproximar-se da velocidade máxima." #: fdmprinter.def.json msgctxt "cool_fan_speed_max label" msgid "Maximum Fan Speed" -msgstr "Velocidade máxima da ventoinha" +msgstr "Velocidade Máxima Ventiladores" #: 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 "A velocidade a que as ventoinhas giram no tempo mínimo de camada. A velocidade da ventoinha aumenta gradualmente entre a velocidade normal da ventoinha e a velocidade máxima da ventoinha quando o limiar é alcançado." +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 "A velocidade a que os ventiladores giram no tempo mínimo de camada. A velocidade do ventilador aumenta gradualmente entre a velocidade normal do ventilador e a velocidade máxima do ventilador quando o limiar é alcançado." #: fdmprinter.def.json msgctxt "cool_min_layer_time_fan_speed_max label" msgid "Regular/Maximum Fan Speed Threshold" -msgstr "Limiar de velocidade normal/máxima da ventoinha" +msgstr "Limiar Normal / Máximo Velocidade Ventilador" #: 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 "O tempo de camada que define o limiar entre a velocidade normal da ventoinha e a velocidade máxima da ventoinha. As camadas que são impressas mais lentamente utilizam a velocidade normal da ventoinha. Para camadas mais rápidas, a velocidade da ventoinha aumenta gradualmente até à velocidade máxima." +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 "O tempo de camada que define o limiar entre a velocidade normal e a velocidade máxima do ventilador. As camadas que são impressas mais lentamente utilizam a velocidade normal do ventilador. Para camadas mais rápidas, a velocidade do ventilador aumenta gradualmente até à velocidade máxima." #: fdmprinter.def.json msgctxt "cool_fan_speed_0 label" msgid "Initial Fan Speed" -msgstr "Velocidade inicial da ventoinha" +msgstr "Velocidade Inicial do ventilador" #: 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 "A velocidade a que as ventoinhas giram ao iniciar a impressão. Nas camadas subsequentes, a velocidade da ventoinha aumenta gradualmente até à camada correspondente à Velocidade normal da ventoinha em altura." +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 "A velocidade a que os ventiladores giram ao iniciar a impressão. Nas camadas subsequentes, a velocidade do ventilador aumenta gradualmente até à camada correspondente à Velocidade normal do ventilador em altura." #: fdmprinter.def.json msgctxt "cool_fan_full_at_height label" msgid "Regular Fan Speed at Height" -msgstr "Velocidade normal da ventoinha em altura" +msgstr "Altura Velocidade Normal Ventilador" #: 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 "A altura a que as ventoinhas giram à velocidade normal da ventoinha. Nas camadas inferiores, a velocidade da ventoinha aumenta gradualmente da Velocidade inicial da ventoinha para a Velocidade normal da ventoinha." +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 "A altura a que os ventiladores giram à velocidade normal. Nas camadas inferiores, a velocidade do ventilador aumenta gradualmente da Velocidade Inicial até a Velocidade Normal do ventilador." #: fdmprinter.def.json msgctxt "cool_fan_full_layer label" msgid "Regular Fan Speed at Layer" -msgstr "Velocidade normal da ventoinha na camada" +msgstr "Camada Velocidade Normal Ventilador" #: 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 "A camada na qual as ventoinhas giram à velocidade normal da ventoinha. Se for definida a velocidade normal da ventoinha em altura, este valor é calculado e arredondado para um número inteiro." +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 "A camada na qual os ventiladores giram à velocidade normal do ventilador. Se a Altura para Velocidade Normal do ventilador estiver definida , este valor é calculado e arredondado para um número inteiro." #: fdmprinter.def.json msgctxt "cool_min_layer_time label" @@ -3233,133 +2969,108 @@ msgstr "Tempo mínimo por camada" #: 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 "O tempo mínimo gasto numa camada. Isto força a impressora a abrandar para que, no mínimo, o tempo aqui definido seja gasto numa camada. Isto permite que o material impresso arrefeça devidamente antes de imprimir a camada seguinte. Ainda assim, as camadas podem demorar menos do que o tempo mínimo por camada se a opção Elevar cabeça estiver desativada e se a Velocidade mínima for desrespeitada." +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 "O tempo mínimo gasto numa camada. Isto força a impressora a abrandar para que, no mínimo, o tempo aqui definido seja gasto numa camada. Isto permite que o material impresso arrefeça devidamente antes de imprimir a camada seguinte. Ainda assim, as camadas podem demorar menos do que o tempo mínimo por camada se a opção Elevar Cabeça estiver desativada e se a Velocidade Mínima for desrespeitada." #: fdmprinter.def.json msgctxt "cool_min_speed label" msgid "Minimum Speed" -msgstr "Velocidade mínima" +msgstr "Velocidade Mínima" #: 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 "A velocidade mínima de impressão, apesar do abrandamento devido ao tempo mínimo por camada. Se a impressora abrandar demasiado, a pressão do bocal será demasiado baixa, o que resultará numa má qualidade de impressão." +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 "A velocidade mínima de impressão, apesar do abrandamento devido ao tempo mínimo por camada. Se a impressora abrandar demasiado, a pressão no nozzle será demasiado baixa, o que resultará numa má qualidade de impressão." #: fdmprinter.def.json msgctxt "cool_lift_head label" msgid "Lift Head" -msgstr "Elevar cabeça" +msgstr "Elevar Cabeça" #: 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 "Quando a velocidade mínima for alcançada devido ao tempo mínimo por camada, eleve e afaste a cabeça da impressão e aguarde o tempo adicional até atingir o tempo mínimo por camada." +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 "Quando a velocidade mínima for alcançada devido ao tempo mínimo por camada, elevar e afastar a cabeça da impressão e aguardar o tempo adicional até atingir o tempo mínimo por camada." #: fdmprinter.def.json msgctxt "support label" msgid "Support" -msgstr "Suporte" +msgstr "Suportes" #: fdmprinter.def.json msgctxt "support description" msgid "Support" -msgstr "Suporte" +msgstr "Suportes" #: fdmprinter.def.json msgctxt "support_enable label" msgid "Generate Support" -msgstr "Gerar suporte" +msgstr "Criar Suportes" #: 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 "Gera estruturas para suportar peças do modelo com saliências. Sem estas estruturas, essas peças desintegrar-se-iam durante a impressão." +msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." +msgstr "Criar estruturas para suportar partes do modelo, suspensas ou com saliências. Sem estas estruturas, essas partes do modelo podem deformar-se ou mesmo desmoronar durante a impressão." #: fdmprinter.def.json msgctxt "support_extruder_nr label" msgid "Support Extruder" -msgstr "Extrusora de suporte" +msgstr "Extrusor dos Suportes" #: 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 "A máquina de extrusão a ser utilizada para imprimir o suporte. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train to use for printing the support. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir os suportes. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "support_infill_extruder_nr label" msgid "Support Infill Extruder" -msgstr "Extrusora de preenchimento do suporte" +msgstr "Extrusor de enchimento do suporte" #: 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 "A máquina de extrusão a ser utilizada para imprimir o preenchimento do suporte. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train to use for printing the infill of the support. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir o enchimento dos suportes. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "support_extruder_nr_layer_0 label" msgid "First Layer Support Extruder" -msgstr "Extrusora de suporte da primeira camada" +msgstr "Extrusor de suporte da primeira camada" #: 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 "A máquina de extrusão a ser utilizada para imprimir a primeira camada de preenchimento do suporte. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train to use for printing the first layer of support infill. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir a primeira camada de enchimento dos suportes. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "support_interface_extruder_nr label" msgid "Support Interface Extruder" -msgstr "Extrusora de interface de suporte" +msgstr "Extrusor de interface de suporte" #: 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 "A máquina de extrusão a ser utilizada para imprimir os tetos e pisos do suporte. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train to use for printing the roofs and floors of the support. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir os tectos e pisos do suporte. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "support_roof_extruder_nr label" msgid "Support Roof Extruder" -msgstr "Extrusora de teto de suporte" +msgstr "Extrusor de tecto de suporte" #: 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 "A máquina de extrusão a ser utilizada para imprimir os tetos de suporte. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train to use for printing the roofs of the support. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir os tectos do suporte. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "support_bottom_extruder_nr label" msgid "Support Floor Extruder" -msgstr "Extrusora de piso de suporte" +msgstr "Extrusor de piso de suporte" #: 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 "A máquina de extrusão a ser utilizada para imprimir os pisos de suporte. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train to use for printing the floors of the support. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir os pisos do suporte. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "support_type label" @@ -3368,16 +3079,13 @@ msgstr "Colocação do suporte" #: 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 "Ajusta a colocação das estruturas de suporte. A colocação pode ser definida para tocar na placa de construção ou em todo o lado. Quando definida para tocar em todo o lado, as estruturas de suporte também serão impressas no modelo." +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 "Ajusta a colocação das estruturas de suporte. A colocação pode ser definida para tocar na base de construção ou em todo o lado. Quando definida para tocar em todo o lado, as estruturas de suporte também serão impressas no modelo." #: fdmprinter.def.json msgctxt "support_type option buildplate" msgid "Touching Buildplate" -msgstr "Tocar na placa de construção" +msgstr "A Tocar na base de construção" #: fdmprinter.def.json msgctxt "support_type option everywhere" @@ -3387,26 +3095,22 @@ msgstr "Em todo o lado" #: fdmprinter.def.json msgctxt "support_angle label" msgid "Support Overhang Angle" -msgstr "Ângulo de saliência de suporte" +msgstr "Ângulo Saliência para Suportes" #: 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 "O ângulo mínimo de saliências ao qual é adicionado suporte. Com um valor de 0°, todas as saliências são suportadas e com um valor de 90° não será fornecido qualquer suporte." +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 "O ângulo mínimo das saliências ao qual é adicionado suportes. Com um valor de 0°, todas as saliências são suportadas e um valor de 90° não irá gerar qualquer suporte." #: fdmprinter.def.json msgctxt "support_pattern label" msgid "Support Pattern" -msgstr "Padrão de suporte" +msgstr "Padrão de Suportes" #: 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 "O padrão das estruturas de suporte da impressão. As diferentes opções disponíveis resultam num suporte robusto ou de fácil remoção." +msgid "The pattern of the support structures of the print. The different options available result in sturdy or easy to remove support." +msgstr "O padrão geométrico das estruturas de suporte da impressão. As diferentes opções disponíveis resultam num suporte robusto ou de fácil remoção." #: fdmprinter.def.json msgctxt "support_pattern option lines" @@ -3450,9 +3154,7 @@ msgstr "Ligar ziguezagues de suporte" #: fdmprinter.def.json msgctxt "support_connect_zigzags description" -msgid "" -"Connect the ZigZags. This will increase the strength of the zig zag support " -"structure." +msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "Liga os ziguezagues. Isto irá aumentar a resistência da estrutura de suporte em ziguezague." #: fdmprinter.def.json @@ -3462,9 +3164,7 @@ msgstr "Densidade do suporte" #: 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." +msgid "Adjusts the density of the support structure. A higher value results in better overhangs, but the supports are harder to remove." msgstr "Ajusta a densidade da estrutura de suporte. Um valor mais elevado resulta em melhores saliências, embora os suportes sejam mais difíceis de remover." #: fdmprinter.def.json @@ -3474,9 +3174,7 @@ msgstr "Distância da linha de suporte" #: fdmprinter.def.json msgctxt "support_line_distance description" -msgid "" -"Distance between the printed support structure lines. This setting is " -"calculated by the support density." +msgid "Distance between the printed support structure lines. This setting is calculated by the support density." msgstr "A distância entre as linhas da estrutura de suporte impressas. Esta definição é calculada através da densidade do suporte." #: fdmprinter.def.json @@ -3486,10 +3184,7 @@ msgstr "Distância Z de suporte" #: 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." +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 "A distância entre a parte superior/inferior da estrutura de suporte e a impressão. Esta folga permite retirar os suportes depois de o modelo ser impresso. Este valor é arredondado para um múltiplo da altura da camada." #: fdmprinter.def.json @@ -3529,11 +3224,7 @@ msgstr "Prioridade da distância de suporte" #: 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." +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 "Se a Distância X/Y de suporte substitui a Distância Z de suporte ou vice-versa. Quando X/Y substitui Z, a distância X/Y pode afastar o suporte do modelo, influenciando a distância Z real relativamente às saliências. É possível desativar esta opção não aplicando a distância X/Y em torno das saliências." #: fdmprinter.def.json @@ -3553,36 +3244,28 @@ msgstr "Distância X/Y mínima de suporte" #: fdmprinter.def.json msgctxt "support_xy_distance_overhang description" -msgid "" -"Distance of the support structure from the overhang in the X/Y directions. " +msgid "Distance of the support structure from the overhang in the X/Y directions. " msgstr "A distância da estrutura de suporte relativamente às saliências nas direções X/Y. " #: fdmprinter.def.json msgctxt "support_bottom_stair_step_height label" msgid "Support Stair Step Height" -msgstr "Altura dos degraus de suporte" +msgstr "Altura Degraus Suporte" #: 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 "A altura dos degraus da parte inferior semelhante a uma escada do suporte apoiado sobre o modelo. Um valor inferior dificulta a remoção do suporte, mas valores demasiado elevados podem resultar em estruturas de suporte instáveis. É definido como zero para desativar o comportamento semelhante a uma escada." +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 "A altura dos degraus da parte inferior, semelhante a uma escada, do suporte apoiado sobre o modelo. Um valor pequeno dificulta a remoção do suporte, mas valores demasiado grandes podem resultar em estruturas de suporte instáveis. Definir como zero para desativar o comportamento semelhante a uma escada." #: fdmprinter.def.json msgctxt "support_bottom_stair_step_width label" msgid "Support Stair Step Maximum Width" -msgstr "Largura máxima dos degraus de suporte" +msgstr "Largura Máxima Degraus Suporte" #: 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 "A largura máxima dos degraus da parte inferior semelhante a uma escada do suporte apoiado sobre o modelo. Um valor inferior dificulta a remoção do suporte, mas valores demasiado elevados podem resultar em estruturas de suporte instáveis." +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 "A largura máxima dos degraus da parte inferior, semelhante a uma escada, do suporte apoiado sobre o modelo. Um valor pequeno dificulta a remoção do suporte, mas valores demasiado grandes podem resultar em estruturas de suporte instáveis." #: fdmprinter.def.json msgctxt "support_join_distance label" @@ -3591,10 +3274,7 @@ msgstr "Distância da junção do suporte" #: 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." +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 "A distância máxima entre as estruturas de suporte nas direções X/Y. Quando as estruturas separadas estão mais próximas do que este valor, as estruturas fundem-se numa só." #: fdmprinter.def.json @@ -3604,47 +3284,38 @@ msgstr "Expansão horizontal de suporte" #: 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." +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 "Quantidade de desvio aplicado a todos os polígonos de suporte em cada camada. Os valores positivos podem uniformizar as áreas de suporte e produzir suportes mais robustos." #: fdmprinter.def.json msgctxt "support_infill_sparse_thickness label" msgid "Support Infill Layer Thickness" -msgstr "Espessura da camada de preenchimento de suporte" +msgstr "Espessura da camada de enchimento de suporte" #: fdmprinter.def.json msgctxt "support_infill_sparse_thickness description" -msgid "" -"The thickness per layer of support infill material. This value should always " -"be a multiple of the layer height and is otherwise rounded." -msgstr "A espessura por camada de material de preenchimento de suporte. Este valor deve sempre ser um múltiplo da altura da camada. Caso contrário, será arredondado." +msgid "The thickness per layer of support infill material. This value should always be a multiple of the layer height and is otherwise rounded." +msgstr "A espessura por camada de material de enchimento de suporte. Este valor deve sempre ser um múltiplo da altura da camada. Caso contrário, será arredondado." #: fdmprinter.def.json msgctxt "gradual_support_infill_steps label" msgid "Gradual Support Infill Steps" -msgstr "Passos de preenchimento gradual de suporte" +msgstr "Passos de enchimento gradual de suporte" #: fdmprinter.def.json msgctxt "gradual_support_infill_steps description" -msgid "" -"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." -msgstr "O número de vezes que a densidade de preenchimento do suporte deve ser reduzida para metade ao alcançar superfícies superiores mais abaixo. As áreas que se encontram mais próximas das superfícies superiores obtêm uma maior densidade, até ao limite da Densidade de preenchimento do suporte." +msgid "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." +msgstr "O número de vezes que a densidade de enchimento do suporte deve ser reduzida para metade ao alcançar superfícies superiores mais abaixo. As áreas que se encontram mais próximas das superfícies superiores obtêm uma maior densidade, até ao limite da Densidade de enchimento do suporte." #: fdmprinter.def.json msgctxt "gradual_support_infill_step_height label" msgid "Gradual Support Infill Step Height" -msgstr "Altura do passo de preenchimento gradual de suporte" +msgstr "Altura do passo de enchimento gradual de suporte" #: fdmprinter.def.json msgctxt "gradual_support_infill_step_height description" -msgid "" -"The height of support infill of a given density before switching to half the " -"density." -msgstr "A altura do preenchimento de suporte de uma determinada densidade antes de mudar para metade da densidade." +msgid "The height of support infill of a given density before switching to half the density." +msgstr "A altura do enchimento de suporte de uma determinada densidade antes de mudar para metade da densidade." #: fdmprinter.def.json msgctxt "support_interface_enable label" @@ -3653,23 +3324,18 @@ msgstr "Ativar interface de suporte" #: 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." +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 "Gera uma interface densa entre o modelo e o suporte. Isto irá criar um revestimento na parte superior do suporte, onde o modelo é impresso, e na parte inferior do suporte, onde este é apoiado sobre o modelo." #: fdmprinter.def.json msgctxt "support_roof_enable label" msgid "Enable Support Roof" -msgstr "Ativar teto de suporte" +msgstr "Ativar tecto de suporte" #: 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 "Gera uma placa densa de material entre a parte superior do suporte e o modelo. Isto irá criar um revestimento entre o modelo e o suporte." +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 "Gera uma base densa de material entre a parte superior do suporte e o modelo. Isto irá criar um revestimento entre o modelo e o suporte." #: fdmprinter.def.json msgctxt "support_bottom_enable label" @@ -3678,10 +3344,8 @@ msgstr "Ativar piso de suporte" #: 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 "Gera uma placa densa de material entre a parte inferior do suporte e o modelo. Isto irá criar um revestimento entre o modelo e o suporte." +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 "Gera uma base densa de material entre a parte inferior do suporte e o modelo. Isto irá criar um revestimento entre o modelo e o suporte." #: fdmprinter.def.json msgctxt "support_interface_height label" @@ -3690,22 +3354,18 @@ msgstr "Espessura da interface de suporte" #: 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." +msgid "The thickness of the interface of the support where it touches with the model on the bottom or the top." msgstr "A espessura da interface de suporte onde esta entra em contacto com o modelo na parte inferior ou superior." #: fdmprinter.def.json msgctxt "support_roof_height label" msgid "Support Roof Thickness" -msgstr "Espessura do teto de suporte" +msgstr "Espessura do tecto de suporte" #: 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 "A espessura dos tetos de suporte. Isto controla a quantidade de camadas densas na parte superior do suporte na qual o modelo é apoiado." +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 "A espessura dos tectos de suporte. Isto controla a quantidade de camadas densas na parte superior do suporte na qual o modelo é apoiado." #: fdmprinter.def.json msgctxt "support_bottom_height label" @@ -3714,24 +3374,18 @@ msgstr "Espessura do piso de suporte" #: 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." +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 "A espessura dos pisos de suporte. Isto controla o número de camadas densas que são impressas por cima de locais de um modelo no qual o suporte é apoiado." #: fdmprinter.def.json msgctxt "support_interface_skip_height label" msgid "Support Interface Resolution" -msgstr "Resolução da interface de suporte" +msgstr "Resolução Interface Suporte" #: 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 "Ao verificar os locais onde existe modelo por cima e por baixo do suporte, tome as medidas necessárias de acordo com a altura determinada. Os valores mais reduzidos irão segmentar mais lentamente, enquanto os valores mais elevados podem fazer com que o suporte normal seja impresso em alguns locais onde deveria existir uma interface de suporte." +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 "Ao verificar os locais onde existe modelo por cima e por baixo do suporte, tome as medidas necessárias de acordo com a altura determinada. Os valores mais reduzidos irão seccionar mais lentamente, enquanto os valores mais elevados podem fazer com que o suporte normal seja impresso em alguns locais onde deveria existir uma interface de suporte." #: fdmprinter.def.json msgctxt "support_interface_density label" @@ -3740,35 +3394,28 @@ msgstr "Densidade da interface de suporte" #: 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 "Ajusta a densidade dos tetos e pisos da estrutura de suporte. Um valor mais elevado resulta em melhores saliências, embora os suportes sejam mais difíceis de remover." +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 "Ajusta a densidade dos tectos e pisos da estrutura de suporte. Um valor mais elevado resulta em melhores saliências, embora os suportes sejam mais difíceis de remover." #: fdmprinter.def.json msgctxt "support_roof_density label" msgid "Support Roof Density" -msgstr "Densidade do teto de suporte" +msgstr "Densidade do tecto de suporte" #: 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 "A densidade dos tetos da estrutura de suporte. Um valor mais elevado resulta em melhores saliências, embora os suportes sejam mais difíceis de remover." +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 "A densidade dos tectos da estrutura de suporte. Um valor mais elevado resulta em melhores saliências, embora os suportes sejam mais difíceis de remover." #: fdmprinter.def.json msgctxt "support_roof_line_distance label" msgid "Support Roof Line Distance" -msgstr "Distância da linha do teto de suporte" +msgstr "Distância da linha do tecto de suporte" #: 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 "A distância entre as linhas do teto de suporte impressas. Esta definição é calculada através da Densidade do teto de suporte, mas pode ser ajustada em separado." +msgid "Distance between the printed support roof lines. This setting is calculated by the Support Roof Density, but can be adjusted separately." +msgstr "A distância entre as linhas do tecto de suporte impressas. Esta definição é calculada através da Densidade do tecto de suporte, mas pode ser ajustada em separado." #: fdmprinter.def.json msgctxt "support_bottom_density label" @@ -3777,9 +3424,7 @@ msgstr "Densidade do piso de suporte" #: 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." +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 "A densidade dos pisos da estrutura de suporte. Um valor mais elevado resulta numa melhor aderência do suporte na parte superior do modelo." #: fdmprinter.def.json @@ -3789,9 +3434,7 @@ msgstr "Distância da linha do piso de suporte" #: 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." +msgid "Distance between the printed support floor lines. This setting is calculated by the Support Floor Density, but can be adjusted separately." msgstr "A distância entre as linhas do piso de suporte impressas. Esta definição é calculada através da Densidade do piso de suporte, mas pode ser ajustada em separado." #: fdmprinter.def.json @@ -3801,10 +3444,8 @@ msgstr "Padrão da interface de suporte" #: fdmprinter.def.json msgctxt "support_interface_pattern description" -msgid "" -"The pattern with which the interface of the support with the model is " -"printed." -msgstr "O padrão com o qual a interface de suporte do modelo é impressa." +msgid "The pattern with which the interface of the support with the model is printed." +msgstr "O padrão geométrico com que a interface do suporte com o modelo, é impressa." #: fdmprinter.def.json msgctxt "support_interface_pattern option lines" @@ -3839,12 +3480,12 @@ msgstr "Ziguezague" #: fdmprinter.def.json msgctxt "support_roof_pattern label" msgid "Support Roof Pattern" -msgstr "Padrão do teto de suporte" +msgstr "Padrão do tecto de suporte" #: fdmprinter.def.json msgctxt "support_roof_pattern description" msgid "The pattern with which the roofs of the support are printed." -msgstr "O padrão com que os tetos do suporte são impressos." +msgstr "O padrão geométrico com que os tectos do suporte são impressos." #: fdmprinter.def.json msgctxt "support_roof_pattern option lines" @@ -3876,15 +3517,18 @@ msgctxt "support_roof_pattern option zigzag" msgid "Zig Zag" msgstr "Ziguezague" +# rever! +# piso? chão? base? #: fdmprinter.def.json msgctxt "support_bottom_pattern label" msgid "Support Floor Pattern" -msgstr "Padrão do piso de suporte" +msgstr "Padrão Chão Suporte" +# pisos? #: fdmprinter.def.json msgctxt "support_bottom_pattern description" msgid "The pattern with which the floors of the support are printed." -msgstr "O padrão com que os pisos do suporte são impressos." +msgstr "O padrão geométrico com que os chãos do suporte são impressos." #: fdmprinter.def.json msgctxt "support_bottom_pattern option lines" @@ -3923,11 +3567,8 @@ msgstr "Utilizar torres" #: 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 "Utiliza torres especializadas para suportar pequenas áreas de saliências. Estas torres têm um diâmetro maior do que a região que suportam. Junto às saliências, o diâmetro das torres diminui, formando um teto." +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 "Utiliza torres especializadas para suportar pequenas áreas de saliências. Estas torres têm um diâmetro maior do que a região que suportam. Junto às saliências, o diâmetro das torres diminui, formando um tecto." #: fdmprinter.def.json msgctxt "support_tower_diameter label" @@ -3946,100 +3587,86 @@ msgstr "Diâmetro mínimo" #: 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." +msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower." msgstr "O diâmetro mínimo nas direções X/Y de uma pequena área que deverá ser suportada por uma torre de suporte especializada." #: fdmprinter.def.json msgctxt "support_tower_roof_angle label" msgid "Tower Roof Angle" -msgstr "Ângulo do teto da torre" +msgstr "Ângulo do tecto da torre" #: 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 "O ângulo do topo de uma torre. Um valor mais elevado resulta em tetos de torre pontiagudos, enquanto um valor mais reduzido resulta em tetos de torre achatados." +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 "O ângulo do topo de uma torre. Um valor mais elevado resulta em tectos de torre pontiagudos, enquanto um valor mais reduzido resulta em tectos de torre achatados." #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" -msgstr "Aderência à placa de construção" +msgstr "Aderência" #: fdmprinter.def.json msgctxt "platform_adhesion description" msgid "Adhesion" -msgstr "Aderência" +msgstr "Aderência à Base de Construção" #: fdmprinter.def.json msgctxt "prime_blob_enable label" msgid "Enable Prime Blob" -msgstr "Ativar blob de preparação" +msgstr "\"Blob\" de Preparação" +# rever! +# borrão? +# antes de começar a impressão? #: 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 "Preparar ou não o filamento com um blob antes da impressão. Ativar esta definição irá assegurar que a extrusora terá material pronto no bocal antes da impressão. A opção Imprimir borda ou contorno também pode atuar como purga, caso esse em que desativar esta definição permite ganhar algum tempo." +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 "Preparar, ou não, o filamento com um \"blob\" (borrão) antes da impressão. Ativar esta definição irá assegurar que o extrusor terá material disponível no nozzle antes da impressão. A opção de Imprimir Aba ou Contorno também podem actuar como preparação do filamento, e nesses casos, desativar esta definição permite poupar algum tempo." #: fdmprinter.def.json msgctxt "extruder_prime_pos_x label" msgid "Extruder Prime X Position" -msgstr "Posição X de preparação da extrusora" +msgstr "Posição X Preparação Extrusor" #: 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 "A coordenada X da posição de preparação do bocal ao iniciar a impressão." +msgid "The X coordinate of the position where the nozzle primes at the start of printing." +msgstr "A coordenada X da posição onde o é feita a preparação do nozzle no inicio da impressão." #: fdmprinter.def.json msgctxt "extruder_prime_pos_y label" msgid "Extruder Prime Y Position" -msgstr "Posição Y de preparação da extrusora" +msgstr "Posição Y Preparação Extrusor" #: 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 "A coordenada Y da posição de preparação do bocal ao iniciar a impressão." +msgid "The Y coordinate of the position where the nozzle primes at the start of printing." +msgstr "A coordenada Y da posição onde o é feita a preparação do nozzle no inicio da impressão." #: fdmprinter.def.json msgctxt "adhesion_type label" msgid "Build Plate Adhesion Type" -msgstr "Tipo de aderência à placa de construção" +msgstr "Modos de Aderência" #: 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 "Diferentes opções que ajudam a melhorar a purga da extrusão e a aderência à placa de construção. A borda acrescenta uma área plana de camada única em torno da base do modelo para evitar a deformação. A base reticular acrescenta uma grelha espessa com um teto por baixo do modelo. O contorno é uma linha impressa à volta do modelo, mas que não está ligada ao modelo." +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 "Diferentes modos que ajudam a melhorar a aderência à base de construção, e também fazer uma melhor preparação inicial da extrusão. Contorno (Skirt) imprime uma linha paralela ao perímetro do modelo. \r Aba (Brim) acrescenta uma única camada em torno da base do modelo para prevenir empenos ou deformações na parte inferior dos modelos. Raft adiciona uma plataforma, composta por uma grelha espessa e um tecto, entre o modelo e a base de impressão." #: fdmprinter.def.json msgctxt "adhesion_type option skirt" msgid "Skirt" -msgstr "Contorno" +msgstr "Contorno (Skirt)" #: fdmprinter.def.json msgctxt "adhesion_type option brim" msgid "Brim" -msgstr "Borda" +msgstr "Aba (Brim)" #: fdmprinter.def.json msgctxt "adhesion_type option raft" msgid "Raft" -msgstr "Base reticular" +msgstr "Raft" #: fdmprinter.def.json msgctxt "adhesion_type option none" @@ -4049,441 +3676,387 @@ msgstr "Nenhum" #: fdmprinter.def.json msgctxt "adhesion_extruder_nr label" msgid "Build Plate Adhesion Extruder" -msgstr "Extrusora de aderência à placa de construção" +msgstr "Extrusor para Aderência" #: 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 "A máquina de extrusão a ser utilizada para imprimir o contorno/a borda/a base reticular. Esta é utilizada em extrusões múltiplas." +msgid "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion." +msgstr "O núcleo de extrusão utilizado para imprimir o Contorno / Aba / Raft. Definição usada com múltiplos extrusores." #: fdmprinter.def.json msgctxt "skirt_line_count label" msgid "Skirt Line Count" -msgstr "Contagem de linhas de contorno" +msgstr "Número Linhas Contorno" #: 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 "Linhas de contorno múltiplas ajudam a preparar melhor a extrusão para modelos pequenos. Definir a contagem como 0 irá desativar o contorno." +msgid "Multiple skirt lines help to prime your extrusion better for small models. Setting this to 0 will disable the skirt." +msgstr "Varias linhas de contorno ajudam a preparar melhor a extrusão para modelos pequenos. Definir este valor como 0 desactiva o contorno." #: fdmprinter.def.json msgctxt "skirt_gap label" msgid "Skirt Distance" -msgstr "Distância do contorno" +msgstr "Distância Contorno" #: fdmprinter.def.json 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 "A distância horizontal entre o contorno e a primeira camada da impressão.\nEsta é a distância mínima. Linhas de contorno múltiplas irão estender-se para fora desta distância." +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." +msgstr "" +"A distância horizontal entre o contorno e o perímetro exterior da primeira camada da impressão.\n" +"Esta é a distância mínima. Linhas múltiplas de contorno serão impressas para o exterior." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" msgid "Skirt/Brim Minimum Length" -msgstr "Comprimento mínimo do contorno/da borda" +msgstr "Comprimento Mínimo Contorno/Aba" #: 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 "O comprimento mínimo do contorno ou da borda. Se este comprimento não for alcançado em conjunto por todas as linhas de contorno ou borda, serão acrescentadas mais linhas de contorno ou borda até o comprimento mínimo ser alcançado. Nota: Se a contagem de linhas for definida como 0, isto é ignorado." +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 "O comprimento mínimo do Contorno ou da Aba. Se este comprimento não for alcançado pelo conjunto de todas as linhas do Contorno ou da Aba, serão acrescentadas mais linhas ao Contorno ou à Aba até o comprimento mínimo ser alcançado. Nota: Se o valor do Número de Linhas for 0, esta definição é ignorada." #: fdmprinter.def.json msgctxt "brim_width label" msgid "Brim Width" -msgstr "Largura da borda" +msgstr "Largura da Aba" #: 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 "A distância do modelo à linha de borda mais exterior. Uma borda mais larga melhora a aderência à placa de construção, mas também reduz a área de impressão efetiva." +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 "A distância desde o modelo até à linha mais exterior da Aba. Uma Aba mais larga melhora a aderência à base de construção, mas também reduz a área de impressão efetiva." #: fdmprinter.def.json msgctxt "brim_line_count label" msgid "Brim Line Count" -msgstr "Contagem de linhas de borda" +msgstr "Número Linhas da Aba" #: 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 "O número de linhas utilizado para uma borda. Uma maior quantidade de linhas de borda melhora a aderência à placa de construção, mas também reduz a área de impressão efetiva." +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 "O número de linhas utilizado para uma aba. Um maior número de linhas da aba melhora a aderência à base de construção, mas também reduz a área de impressão efetiva." #: fdmprinter.def.json msgctxt "brim_outside_only label" msgid "Brim Only on Outside" -msgstr "Borda apenas no exterior" +msgstr "Aba Apenas no Exterior" #: 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 "Imprime apenas a borda no exterior do modelo. Isto reduz a quantidade de bordas a remover posteriormente, mas não reduz tanto a aderência à base." +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 "Imprimir a aba apenas no exterior do modelo. Isto reduz a quantidade de abas a remover posteriormente, e ao mesmo tempo não reduz assim tanto a aderência à base." #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" -msgstr "Margem adicional da base reticular" +msgstr "Margem Adicional Raft" #: 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 "Se a base reticular for ativada, esta será a área de base reticular adicional em torno do modelo, a qual também receberá uma base reticular. Aumentar esta margem irá criar uma base reticular mais sólida, ao mesmo tempo que irá utilizar mais material e deixar menos área para a impressão." +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 "Se o Raft estiver ativado, esta será a área de raft adicional em torno do modelo que também terá um raft. Aumentar o valor desta margem irá criar um raft mais robusto, mas ao mesmo tempo utiliza mais material e reduz a área disponível para a impressão." #: fdmprinter.def.json msgctxt "raft_smoothing label" msgid "Raft Smoothing" -msgstr "Suavização da base reticular" +msgstr "Suavização Raft" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "" -"This setting controls how much inner corners in the raft outline are " -"rounded. Inward corners are rounded to a semi circle with a radius equal to " -"the value given here. This setting also removes holes in the raft outline " -"which are smaller than such a circle." -msgstr "Esta definição controla o nível de arredondamento dos cantos internos no contorno da base reticular. Os cantos internos são arredondados para um semicírculo com um raio igual ao valor aqui fornecido. Esta definição também remove os orifícios no contorno da base reticular que sejam inferiores a esse semicírculo." +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "Esta definição controla o nível do arredondamento dos cantos internos do contorno do raft. Os cantos internos são arredondados para um semicírculo com um raio igual ao valor aqui fornecido. Esta definição também remove buracos no contorno do raft que sejam menores que esse semicírculo." #: fdmprinter.def.json msgctxt "raft_airgap label" msgid "Raft Air Gap" -msgstr "Folga de ar da base reticular" +msgstr "Caixa de Ar do Raft" #: 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 "A folga entre a camada da base reticular final e a primeira camada do modelo. Apenas a primeira camada é elevada de acordo com este valor para diminuir a ligação entre a camada da base reticular e o modelo. Isto facilita a remoção da base reticular." +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 "A espaço entre a camada final do raft e a primeira camada do modelo. Apenas a primeira camada do modelo é elevada por este valor, para assim reduzir a união entre o raft e o modelo. Isto facilita a remoção do raft." #: fdmprinter.def.json msgctxt "layer_0_z_overlap label" msgid "Initial Layer Z Overlap" -msgstr "Sobreposição Z da camada inicial" +msgstr "Sobreposição Z Camada Inicial" +# O valor da distância com que todos os modelos acima da primeira camada do modelo serão deslocados para baixo. #: 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 "Sobrepõe a primeira e a segunda camadas do modelo na direção Z para compensar o filamento perdido na folga de ar. Todos os modelos acima da primeira camada do modelo serão deslocados para baixo neste valor." +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 "Sobrepõe, na direção Z, a primeira e a segunda camadas do modelo para compensar o filamento perdido na caixa de ar. O valor da distância com que todos os modelos acima da primeira camada do modelo serão deslocados para baixo." #: fdmprinter.def.json msgctxt "raft_surface_layers label" msgid "Raft Top Layers" -msgstr "Camadas superiores da base reticular" +msgstr "Camadas Superiores do Raft" #: 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 "O número de camadas superiores na parte superior da 2.ª camada da base reticular. Estas são camadas totalmente preenchidas onde o modelo é apoiado. Duas camadas resultam numa superfície superior mais uniforme do que uma." +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 "O número de camadas superiores impressas em cima da camada do meio do raft. Estas são as camadas, totalmente preenchidas, onde o modelo assenta. Duas camadas resultam numa superfície superior mais uniforme, do que só uma camada." #: fdmprinter.def.json msgctxt "raft_surface_thickness label" msgid "Raft Top Layer Thickness" -msgstr "Espessura das camada superiores da base reticular" +msgstr "Espessura Camada Superior Raft" #: fdmprinter.def.json msgctxt "raft_surface_thickness description" msgid "Layer thickness of the top raft layers." -msgstr "A espessura das camadas superiores da base reticular." +msgstr "A espessura das camadas superiores do raft." #: fdmprinter.def.json msgctxt "raft_surface_line_width label" msgid "Raft Top Line Width" -msgstr "Largura das linhas superiores da base reticular" +msgstr "Diâmetro Linha Superior do Raft" #: 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 "A largura das linhas na superfície superior da base reticular. Estas podem ser linhas finas para que a parte superior da base reticular fique uniforme." +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 "O diâmetro das linhas da superfície superior do raft. Estas podem ser linhas finas para que a parte superior do raft seja uniforme e liso." #: fdmprinter.def.json msgctxt "raft_surface_line_spacing label" msgid "Raft Top Spacing" -msgstr "Espaçamento superior da base reticular" +msgstr "Espaçamento Superior do Raft" #: 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 "A distância entre as linhas da base reticular para as camadas superiores da base reticular. O espaçamento deve ser igual à largura da linha, para que a superfície seja sólida." +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 "A distância entre linhas nas camadas superiores do raft. O espaçamento deve ser, igual ao Diâmetro da Linha, para que a superfície seja uniforme." #: fdmprinter.def.json msgctxt "raft_interface_thickness label" msgid "Raft Middle Thickness" -msgstr "Espessura média da base reticular" +msgstr "Espessura do Meio do Raft" #: fdmprinter.def.json msgctxt "raft_interface_thickness description" msgid "Layer thickness of the middle raft layer." -msgstr "A espessura da camada média da base reticular." +msgstr "A espessura da camada do meio do raft. (segunda camada)" #: fdmprinter.def.json msgctxt "raft_interface_line_width label" msgid "Raft Middle Line Width" -msgstr "Largura da linha média da base reticular" +msgstr "Diâmetro Linha do Meio do Raft" #: 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 "A largura das linhas na camada média da base reticular. Extrudir mais a segunda camada provoca a aderência das linhas à placa de construção." +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 "O diâmetro das linhas na camada do meio do raft. Extrudir mais a segunda camada provoca a aderência das linhas à base de construção." #: fdmprinter.def.json msgctxt "raft_interface_line_spacing label" msgid "Raft Middle Spacing" -msgstr "Espaçamento médio da base reticular" +msgstr "Espaçamento do Meio do Raft" #: 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 "A distância entre as linhas da base reticular para a camada média da base reticular. O espaçamento médio deve ser bastante amplo, mas suficientemente denso para suportar as camadas superiores da base reticular." +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 "A distância entre linhas na camada do meio do raft. O espaçamento entre as linhas da camada do meio, deve ser grande, mas ao mesmo tempo suficientemente denso para conseguir suportar as camadas superiores do raft." #: fdmprinter.def.json msgctxt "raft_base_thickness label" msgid "Raft Base Thickness" -msgstr "Espessura inferior da base reticular" +msgstr "Espessura da Base do Raft" #: 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 "A espessura da camada inferior da base reticular. Esta deve ser uma camada espessa que adira firmemente à placa de construção da impressora." +msgid "Layer thickness of the base raft layer. This should be a thick layer which sticks firmly to the printer build plate." +msgstr "A espessura da camada inferior (base) do raft. Esta deve ser uma camada espessa para aderir firmemente à base de construção da impressora." #: fdmprinter.def.json msgctxt "raft_base_line_width label" msgid "Raft Base Line Width" -msgstr "Largura da linha inferior da base reticular" +msgstr "Diâmetro Linha Base do Raft" #: 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 "A largura das linhas na camada inferior da base reticular. Estas devem ser linhas espessas para auxiliar na aderência à placa de construção." +msgid "Width of the lines in the base raft layer. These should be thick lines to assist in build plate adhesion." +msgstr "O diâmetro das linhas na camada inferior (base) do raft. Devem ser linhas espessas para auxiliar na aderência à base de construção." #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Line Spacing" -msgstr "Espaçamento da linha da base reticular" +msgstr "Espaçamento Linhas Base Raft" #: 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 "A distância entre as linhas da base reticular para a camada inferior da base reticular. Um espaçamento amplo facilita a remoção da base reticular da placa de construção." +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 "A distância entre linhas na camada inferior (base) do raft. Um maior espaçamento facilita a remoção do raft da base de construção." #: fdmprinter.def.json msgctxt "raft_speed label" msgid "Raft Print Speed" -msgstr "Velocidade de impressão da base reticular" +msgstr "Velocidade Impressão do Raft" #: fdmprinter.def.json msgctxt "raft_speed description" msgid "The speed at which the raft is printed." -msgstr "A velocidade a que a base reticular é impressa." +msgstr "A velocidade a que o raft é impresso." #: fdmprinter.def.json msgctxt "raft_surface_speed label" msgid "Raft Top Print Speed" -msgstr "Velocidade de impressão superior da base reticular" +msgstr "Velocidade do Topo do Raft" #: 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 "A velocidade a que as camadas superiores da base reticular são impressas. Estas devem ser impressas um pouco mais devagar, para que o bocal possa uniformizar lentamente as linhas das superfícies adjacentes." +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 "A velocidade a que as camadas superiores do raft são impressas. Estas devem ser impressas um pouco mais devagar, para que o nozzle possa uniformizar lentamente as linhas adjacentes da superfície." #: fdmprinter.def.json msgctxt "raft_interface_speed label" msgid "Raft Middle Print Speed" -msgstr "Velocidade de impressão média da base reticular" +msgstr "Velocidade do Meio do Raft" #: 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 "A velocidade a que a camada média da base reticular é impressa. Esta deve ser impressa bastante devagar, uma vez que o volume de material que advém do bocal é bastante elevado." +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 "A velocidade a que a camada do meio do raft é impressa. Esta deve ser impressa bastante devagar, uma vez que o volume de material que vai sair pelo nozzle é bastante elevado." #: fdmprinter.def.json msgctxt "raft_base_speed label" msgid "Raft Base Print Speed" -msgstr "Velocidade de impressão inferior da base reticular" +msgstr "Velocidade da Base do Raft" #: 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 "A velocidade a que a camada inferior da base reticular é impressa. Esta deve ser impressa bastante devagar, uma vez que o volume de material que advém do bocal é bastante elevado." +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 "A velocidade a que a camada inferior (base) do raft é impressa. Esta deve ser impressa bastante devagar, uma vez que o volume de material que vai sair pelo nozzle é bastante elevado." #: fdmprinter.def.json msgctxt "raft_acceleration label" msgid "Raft Print Acceleration" -msgstr "Aceleração de impressão da base reticular" +msgstr "Aceleração Impressão do Raft" #: fdmprinter.def.json msgctxt "raft_acceleration description" msgid "The acceleration with which the raft is printed." -msgstr "A aceleração com que a base reticular é impressa." +msgstr "A aceleração com que o raft é impresso." #: fdmprinter.def.json msgctxt "raft_surface_acceleration label" msgid "Raft Top Print Acceleration" -msgstr "Aceleração de impressão superior da base reticular" +msgstr "Aceleração do Topo do Raft" #: fdmprinter.def.json msgctxt "raft_surface_acceleration description" msgid "The acceleration with which the top raft layers are printed." -msgstr "A aceleração com que as camadas superiores da base reticular são impressas." +msgstr "A aceleração com que as camadas superiores do raft são impressas." #: fdmprinter.def.json msgctxt "raft_interface_acceleration label" msgid "Raft Middle Print Acceleration" -msgstr "Aceleração de impressão média da base reticular" +msgstr "Aceleração do Meio do Raft" #: fdmprinter.def.json msgctxt "raft_interface_acceleration description" msgid "The acceleration with which the middle raft layer is printed." -msgstr "A aceleração com que a camada média da base reticular é impressa." +msgstr "A aceleração com que a camada do meio do raft é impressa." #: fdmprinter.def.json msgctxt "raft_base_acceleration label" msgid "Raft Base Print Acceleration" -msgstr "Aceleração de impressão inferior da base reticular" +msgstr "Aceleração da Base do Raft" #: fdmprinter.def.json msgctxt "raft_base_acceleration description" msgid "The acceleration with which the base raft layer is printed." -msgstr "A aceleração com que a camada inferior da base reticular é impressa." +msgstr "A aceleração com que a camada inferior (base) do raft é impressa." #: fdmprinter.def.json msgctxt "raft_jerk label" msgid "Raft Print Jerk" -msgstr "Solavanco de impressão da base reticular" +msgstr "Jerk de impressão do raft" #: fdmprinter.def.json msgctxt "raft_jerk description" msgid "The jerk with which the raft is printed." -msgstr "O solavanco com que a base reticular é impressa." +msgstr "O jerk com que o raft é impresso." #: fdmprinter.def.json msgctxt "raft_surface_jerk label" msgid "Raft Top Print Jerk" -msgstr "Solavanco de impressão superior da base reticular" +msgstr "Jerk de impressão superior do raft" #: fdmprinter.def.json msgctxt "raft_surface_jerk description" msgid "The jerk with which the top raft layers are printed." -msgstr "O solavanco com que as camadas superiores da base reticular são impressas." +msgstr "O jerk com que as camadas superiores do raft são impressas." #: fdmprinter.def.json msgctxt "raft_interface_jerk label" msgid "Raft Middle Print Jerk" -msgstr "Solavanco de impressão média da base reticular" +msgstr "Jerk de impressão do meio do raft" #: fdmprinter.def.json msgctxt "raft_interface_jerk description" msgid "The jerk with which the middle raft layer is printed." -msgstr "O solavanco com que a camada média da base reticular é impressa." +msgstr "O jerk com que a camada do meio do raft é impressa." #: fdmprinter.def.json msgctxt "raft_base_jerk label" msgid "Raft Base Print Jerk" -msgstr "Solavanco de impressão inferior da base reticular" +msgstr "Jerk de impressão inferior do raft" #: fdmprinter.def.json msgctxt "raft_base_jerk description" msgid "The jerk with which the base raft layer is printed." -msgstr "O solavanco com que a camada inferior da base reticular é impressa." +msgstr "O jerk com que a camada da base do raft é impressa." #: fdmprinter.def.json msgctxt "raft_fan_speed label" msgid "Raft Fan Speed" -msgstr "Velocidade da ventoinha da base reticular" +msgstr "Velocidade do ventilador do raft" #: fdmprinter.def.json msgctxt "raft_fan_speed description" msgid "The fan speed for the raft." -msgstr "A velocidade da ventoinha da base reticular." +msgstr "A velocidade do ventilador do raft." #: fdmprinter.def.json msgctxt "raft_surface_fan_speed label" msgid "Raft Top Fan Speed" -msgstr "Velocidade da ventoinha superior da base reticular" +msgstr "Velocidade do ventilador superior do raft" #: fdmprinter.def.json msgctxt "raft_surface_fan_speed description" msgid "The fan speed for the top raft layers." -msgstr "A velocidade da ventoinha das camadas superiores da base reticular." +msgstr "A velocidade do ventilador das camadas superiores do raft." #: fdmprinter.def.json msgctxt "raft_interface_fan_speed label" msgid "Raft Middle Fan Speed" -msgstr "Velocidade da ventoinha média da base reticular" +msgstr "Velocidade do ventilador do meio do raft" #: fdmprinter.def.json msgctxt "raft_interface_fan_speed description" msgid "The fan speed for the middle raft layer." -msgstr "A velocidade da ventoinha da camada média da base reticular." +msgstr "A velocidade do ventilador da camada do meio do raft." #: fdmprinter.def.json msgctxt "raft_base_fan_speed label" msgid "Raft Base Fan Speed" -msgstr "Velocidade da ventoinha inferior da base reticular" +msgstr "Velocidade do ventilador inferior do raft" #: fdmprinter.def.json msgctxt "raft_base_fan_speed description" msgid "The fan speed for the base raft layer." -msgstr "A velocidade da ventoinha da camada inferior da base reticular." +msgstr "A velocidade do ventilador da camada inferior do raft." #: fdmprinter.def.json msgctxt "dual label" msgid "Dual Extrusion" -msgstr "Extrusão dupla" +msgstr "Dupla Extrusão" #: fdmprinter.def.json msgctxt "dual description" msgid "Settings used for printing with multiple extruders." -msgstr "Definições utilizadas para imprimir com várias extrusoras." +msgstr "Definições utilizadas para imprimir com vários extrusores." #: fdmprinter.def.json msgctxt "prime_tower_enable label" @@ -4492,20 +4065,18 @@ msgstr "Ativar torre de preparação" #: 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 "Imprime uma torre próxima da impressão que prepara o material depois de cada substituição do bocal." +msgid "Print a tower next to the print which serves to prime the material after each nozzle switch." +msgstr "Imprime uma torre próxima da impressão que prepara o material depois de cada substituição do nozzle." #: fdmprinter.def.json msgctxt "prime_tower_size label" msgid "Prime Tower Size" -msgstr "Tamanho da torre de preparação" +msgstr "Tamanho Torre de Preparação" #: fdmprinter.def.json msgctxt "prime_tower_size description" msgid "The width of the prime tower." -msgstr "A largura da torre de preparação." +msgstr "O diâmetro da torre de preparação." #: fdmprinter.def.json msgctxt "prime_tower_min_volume label" @@ -4514,9 +4085,7 @@ msgstr "Volume mínimo da torre de preparação" #: 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." +msgid "The minimum volume for each layer of the prime tower in order to purge enough material." msgstr "O volume mínimo para cada camada da torre de preparação para preparar material suficiente." #: fdmprinter.def.json @@ -4526,9 +4095,7 @@ msgstr "Espessura da torre de preparação" #: 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." +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 "A espessura da torre de preparação oca. Uma espessura superior a metade do Volume mínimo da torre de preparação irá resultar numa torre de preparação densa." #: fdmprinter.def.json @@ -4558,89 +4125,85 @@ msgstr "Fluxo da torre de preparação" #: fdmprinter.def.json msgctxt "prime_tower_flow description" -msgid "" -"Flow compensation: the amount of material extruded is multiplied by this " -"value." +msgid "Flow compensation: the amount of material extruded is multiplied by this value." msgstr "Compensação de fluxo: a quantidade de material extrudido é multiplicada por este valor." #: fdmprinter.def.json msgctxt "prime_tower_wipe_enabled label" msgid "Wipe Inactive Nozzle on Prime Tower" -msgstr "Limpar bocal inativo na torre de preparação" +msgstr "Limpar nozzle inativo na torre de preparação" #: 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 "Após a impressão da torre de preparação com um bocal, limpe o material que vazou do bocal para a torre de preparação." +msgid "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower." +msgstr "Após a impressão da torre de preparação com um nozzle, limpe o material que vazou do nozzle para a torre de preparação." +# rever! +# mudança? +# troca? +# substituição? #: fdmprinter.def.json msgctxt "dual_pre_wipe label" msgid "Wipe Nozzle After Switch" -msgstr "Limpar bocal após substituição" +msgstr "Limpar nozzle após mudança" +# rever! +# vazou? vazado? +# escorreu? escorrido? #: 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 "Após a substituição da extrusora, limpe o material que vazou do bocal para a primeira peça impressa. Isto executa um movimento lento de limpeza segura num local onde o material vazado seja menos prejudicial para a qualidade da superfície da sua impressão." +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 "Após a mudança de extrusor, limpar o material que escorreu do nozzle na primeira \"coisa\" impressa. Isto executa um movimento lento de limpeza num local onde o material que tenha escorrido seja menos prejudicial para a qualidade da superfície da sua impressão." #: fdmprinter.def.json msgctxt "prime_tower_purge_volume label" msgid "Prime Tower Purge Volume" -msgstr "Volume de purga da torre de preparação" +msgstr "Volume Purga Torre Preparação" #: fdmprinter.def.json msgctxt "prime_tower_purge_volume description" -msgid "" -"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." -msgstr "Quantidade de filamento a ser purgado ao limpar a torre de preparação. A purga é útil para compensar o filamento perdido por vazamento durante a inatividade do bocal." +msgid "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." +msgstr "Quantidade de filamento a ser purgado ao limpar na torre de preparação. A purga é útil para compensar o filamento perdido por escorrimento durante a inatividade do nozzle." +# rever! #: fdmprinter.def.json msgctxt "ooze_shield_enabled label" msgid "Enable Ooze Shield" -msgstr "Ativar proteção contra vazamentos" +msgstr "Ativar proteção contra escorrimento" #: 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 "Ativa a proteção exterior contra vazamentos. Isto irá criar uma cobertura em torno do modelo que deverá limpar um segundo bocal, caso este se encontre à mesma altura que o primeiro bocal." +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 "Ativa a proteção exterior contra escorrimentos. Isto irá criar um invólucro em torno do modelo que deverá limpar um segundo nozzle, caso este se encontre à mesma altura que o primeiro nozzle." #: fdmprinter.def.json msgctxt "ooze_shield_angle label" msgid "Ooze Shield Angle" -msgstr "Ângulo da proteção contra vazamentos" +msgstr "Ângulo da proteção contra escorrimentos" #: 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 "O ângulo máximo que uma peça da proteção contra vazamentos poderá ter. 0 graus é vertical e 90 graus é horizontal. Um ângulo menor resulta em menos falhas na proteção contra vazamentos, mas mais material." +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 "O ângulo máximo que uma peça da proteção contra escorrimentos poderá ter. 0 graus é vertical e 90 graus é horizontal. Um ângulo menor resulta em menos falhas na proteção contra escorrimentos, mas mais material." #: fdmprinter.def.json msgctxt "ooze_shield_dist label" msgid "Ooze Shield Distance" -msgstr "Distância da proteção contra vazamentos" +msgstr "Distância da proteção contra escorrimentos" #: fdmprinter.def.json msgctxt "ooze_shield_dist description" msgid "Distance of the ooze shield from the print, in the X/Y directions." -msgstr "A distância da proteção contra vazamentos relativamente à impressão nas direções X/Y." +msgstr "A distância da proteção contra escorrimentos relativamente à impressão nas direções X/Y." +# rever! +# correção? reparação? +# correções? reparações? Emendas? +# objectos? mesh? malha? #: fdmprinter.def.json msgctxt "meshfix label" msgid "Mesh Fixes" -msgstr "Correção de malhas" +msgstr "Correção de Objectos (Mesh)" #: fdmprinter.def.json msgctxt "meshfix description" @@ -4650,55 +4213,52 @@ msgstr "correção_categorias" #: fdmprinter.def.json msgctxt "meshfix_union_all label" msgid "Union Overlapping Volumes" -msgstr "União de volumes sobrepostos" +msgstr "Unir Volumes Sobrepostos" #: 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 "Ignora a geometria interna provocada pela sobreposição de volumes numa malha e imprime os volumes como um só. Pode provocar o desaparecimento de cavidades internas indesejadas." +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 "Ignorar a geometria interna provocada pela sobreposição de volumes num objecto e imprime os volumes como um só. Pode provocar o desaparecimento indesejado de cavidades interiores." #: fdmprinter.def.json msgctxt "meshfix_union_all_remove_holes label" msgid "Remove All Holes" -msgstr "Remover todos os orifícios" +msgstr "Remover Todos Buracos" #: 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 "Remove os orifícios em cada camada e mantém apenas a forma exterior. Isto irá ignorar qualquer geometria interna invisível. No entanto, também ignora orifícios de camadas que podem ser vistos por cima ou por baixo." +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 "Remove os buracos em cada camada e mantém apenas a forma exterior. Isto irá ignorar qualquer geometria interna invisível. No entanto, também ignora buracos de camadas que podem ser vistos por cima ou por baixo." +# rever! +# english meaning +# extensiva ou intensiva +# coser extensivamente #: fdmprinter.def.json msgctxt "meshfix_extensive_stitching label" msgid "Extensive Stitching" -msgstr "Costura extensiva" +msgstr "Costura Extensiva" #: 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 "A costura extensiva tenta coser orifícios abertos na malha, ao fechá-los com os polígonos em contacto. Esta opção pode acrescentar bastante tempo de processamento." +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 "A costura extensiva tenta coser buracos abertos na malha, ao fechá-los com os polígonos adjacentes. Esta opção pode acrescentar bastante tempo de processamento." +# rever! +# desconectadas? +# soltas? +# Separadas? #: fdmprinter.def.json msgctxt "meshfix_keep_open_polygons label" msgid "Keep Disconnected Faces" -msgstr "Manter faces desconectadas" +msgstr "Manter Faces Soltas" +# rever! +# english string meaning? #: 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 "Geralmente, o Cura tenta coser orifícios pequenos na malha e remover as peças de uma camada com orifícios grandes. Ativar esta opção conserva as peças que não podem ser cosidas. Esta opção deve ser utilizada como último recurso quando tudo o resto não produz um GCode adequado." +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 "Geralmente, o Cura tenta remendar pequenos buracos na malha e remover partes de uma camada com buracos grandes. Ativar esta opção conserva as peças que não podem ser remendadas. Esta opção deve ser utilizada como último recurso quando tudo o resto não produz um GCode adequado." #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" @@ -4707,23 +4267,20 @@ msgstr "Resolução máxima" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" -msgid "" -"The minimum size of a line segment after slicing. If you increase this, the " -"mesh will have a lower resolution. This may allow the printer to keep up " -"with the speed it has to process g-code and will increase slice speed by " -"removing details of the mesh that it can't process anyway." -msgstr "O tamanho mínimo de um segmento de linha após a segmentação. Se aumentar este tamanho, a malha terá uma resolução inferior. Isto poderá permitir que a impressora mantenha a velocidade existente para processar o g-code e irá aumentar a velocidade de segmentação ao remover os detalhes da malha que não podem ser processados." +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "O tamanho mínimo de um segmento após o seccionamento. Se aumentar este valor, a malha terá uma resolução menor. Isto poderá permitir que a impressora acompanhe a velocidade que tem para processar o g-code e irá aumentar a velocidade de seccionamento ao remover os detalhes da malha que não podem ser processados." +# rever! +# does it apply only to Merged obkects (menu) or individual objects that touch +# merged - combinadas? - fundidas? #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" -msgstr "Sobreposição de malhas fundidas" +msgstr "Sobreposição Malhas Combinadas" #: 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." +msgid "Make meshes which are touching each other overlap a bit. This makes them bond together better." msgstr "Faz com que as malhas em contacto se sobreponham ligeiramente. Isto melhora a sua ligação." #: fdmprinter.def.json @@ -4731,12 +4288,11 @@ msgctxt "carve_multiple_volumes label" msgid "Remove Mesh Intersection" msgstr "Remover interceção de malhas" +# rever! #: 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 "Remove as áreas onde várias malhas se sobrepõem entre si. Isto pode ser utilizado se houver sobreposição de objetos de material duplo fundido." +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 "Remover as áreas onde várias malhas se sobrepõem entre si. Isto pode ser utilizado se houver uma sobreposição dos objetos com diferentes materiais que estejam combinados." #: fdmprinter.def.json msgctxt "alternate_carve_order label" @@ -4745,30 +4301,23 @@ msgstr "Alternar remoção de malha" #: 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." +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 "Altera para os volumes de interceção de malha que pertencerão a cada camada, para que as malhas sobrepostas fiquem entrelaçadas. Desativar esta definição poderá fazer com que uma das malhas obtenha todo o volume na sobreposição, sendo removido das outras malhas." #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "Remover primeiras camadas vazias" +msgstr "Remover Camadas Iniciais Vazias" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" -msgid "" -"Remove empty layers beneath the first printed layer if they are present. " -"Disabling this setting can cause empty first layers if the Slicing Tolerance " -"setting is set to Exclusive or Middle." -msgstr "Remove as camadas vazias por baixo da primeira camada impressa, se existirem. Desativar esta definição pode causar primeiras camadas vazias, se a definição Tolerância de segmentação estiver definida como Exclusivo ou Centro." +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "Remove as camadas vazias por baixo da primeira camada impressa, se existirem. Desativar esta definição pode causar primeiras camadas vazias, se a definição Tolerância de Seccionamento estiver definida como Exclusivo ou Centro." #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" -msgstr "Modos especiais" +msgstr "Modos Especiais" #: fdmprinter.def.json msgctxt "blackmagic description" @@ -4782,13 +4331,8 @@ msgstr "Sequência de impressão" #: 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 "Imprime todos os modelos uma camada de cada vez ou aguarda pela conclusão de um modelo antes de avançar para o seguinte. O modo Individualmente apenas é possível se todos os modelos estiverem separados de tal forma que toda a cabeça de impressão possa mover-se entre eles e todos os modelos estejam abaixo da distância entre o bocal e os eixos X/Y." +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 "Imprime todos os modelos uma camada de cada vez ou aguarda pela conclusão de um modelo antes de avançar para o seguinte. O modo Individualmente apenas é possível se todos os modelos estiverem separados de tal forma que toda a cabeça de impressão possa mover-se entre eles e todos os modelos estejam abaixo da distância entre o nozzle e os eixos X/Y." #: fdmprinter.def.json msgctxt "print_sequence option all_at_once" @@ -4803,28 +4347,28 @@ msgstr "Individualmente" #: fdmprinter.def.json msgctxt "infill_mesh label" msgid "Infill Mesh" -msgstr "Malha de preenchimento" +msgstr "Objecto de Enchimento" +# rever! +# mesh - malha? - objecto? - modelo? #: 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 "Utilize esta malha para modificar o preenchimento de outras malhas com as quais se sobrepõe. Substitui as regiões de preenchimento de outras malhas por regiões para esta malha. É recomendável imprimir apenas uma parede sem revestimento superior/inferior para esta malha." +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 "Utilize este objecto para modificar o enchimento de outros objectos com os quais se sobrepõe. Substitui as regiões de enchimento de outros objectos por regiões deste objecto. É recomendado imprimir este objecto apenas com uma Parede e sem Superfícies Superior/Inferior." #: fdmprinter.def.json msgctxt "infill_mesh_order label" msgid "Infill Mesh Order" -msgstr "Ordem de malhas de preenchimento" +msgstr "Hierarquia Objectos Enchimento" +# rever! +# ordem superior? +# inferior? +# normais? #: 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 "Determina qual a malha de preenchimento que se encontra no interior do preenchimento de outra malha de preenchimento. Uma malha de preenchimento de ordem superior irá modificar o preenchimento das malhas de preenchimento de ordem inferior e das malhas normais." +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 "Determina qual o Objecto de Enchimento que se encontra no interior do enchimento de outro Objecto de Enchimento. Um objecto de enchimento com um nível superior na hierarquia irá modificar o enchimento dos objectos de enchimento em níveis inferiores assim como o enchimento dos objectos normais." #: fdmprinter.def.json msgctxt "cutting_mesh label" @@ -4833,11 +4377,8 @@ msgstr "Malha de corte" #: 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 "Limita o volume desta malha para o interior de outras malhas. Pode utilizar esta opção para fazer com que determinadas áreas de uma malha sejam impressas com diferentes definições e com uma extrusora distinta." +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 "Limita o volume desta malha para o interior de outras malhas. Pode utilizar esta opção para fazer com que determinadas áreas de uma malha sejam impressas com diferentes definições e com um extrusor distinta." #: fdmprinter.def.json msgctxt "mold_enabled label" @@ -4846,10 +4387,8 @@ msgstr "Molde" #: 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 "Imprime modelos como moldes, os quais podem ser fundidos de forma a obter um modelo que se assemelhe aos modelos da placa de construção." +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 "Imprime modelos como moldes, os quais podem ser fundidos de forma a obter um modelo que se assemelhe aos modelos da base de construção." #: fdmprinter.def.json msgctxt "mold_width label" @@ -4858,15 +4397,13 @@ msgstr "Largura mínima do molde" #: fdmprinter.def.json msgctxt "mold_width description" -msgid "" -"The minimal distance between the ouside of the mold and the outside of the " -"model." +msgid "The minimal distance between the ouside of the mold and the outside of the model." msgstr "A distância mínima entre o exterior do molde e o exterior do modelo." #: fdmprinter.def.json msgctxt "mold_roof_height label" msgid "Mold Roof Height" -msgstr "Altura do teto do molde" +msgstr "Altura do tecto do molde" #: fdmprinter.def.json msgctxt "mold_roof_height description" @@ -4880,11 +4417,8 @@ msgstr "Ângulo do molde" #: 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 "O ângulo da saliência das paredes exteriores criadas para o molde. 0° irá tornar a cobertura exterior do molde vertical, enquanto 90° fará com que o exterior do modelo siga o contorno do mesmo." +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 "O ângulo da saliência das paredes exteriores criadas para o molde. 0° irá tornar o invólucro exterior do molde vertical, enquanto 90° fará com que o exterior do modelo siga o contorno do mesmo." #: fdmprinter.def.json msgctxt "support_mesh label" @@ -4893,9 +4427,7 @@ msgstr "Malha de suporte" #: fdmprinter.def.json msgctxt "support_mesh description" -msgid "" -"Use this mesh to specify support areas. This can be used to generate support " -"structure." +msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "Utilize esta malha para especificar áreas de suporte. Esta opção pode ser utilizada para gerar estruturas de suporte." #: fdmprinter.def.json @@ -4905,9 +4437,7 @@ msgstr "Malha de suporte pendente" #: 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." +msgid "Make support everywhere below the support mesh, so that there's no overhang in the support mesh." msgstr "Cria suporte em qualquer local abaixo da malha de suporte, para que não existam saliências na malha de suporte." #: fdmprinter.def.json @@ -4917,9 +4447,7 @@ msgstr "Malha antissaliências" #: 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." +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 "Utilize esta malha para especificar a parte do modelo que não deve ser detetada como saliência. Esta opção pode ser utilizada para remover estruturas de suporte indesejadas." #: fdmprinter.def.json @@ -4929,13 +4457,8 @@ msgstr "Modo de superfície" #: 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 "Trata o modelo apenas como superfície, volume ou volumes com superfícies soltas. O modo de impressão normal imprime apenas volumes delimitados. O modo \"Superfície\" imprime uma única parede que acompanha a superfície da malha sem preenchimento ou revestimento superior/inferior. O modo \"Ambos\" imprime volumes delimitados normalmente e quaisquer polígonos restantes como superfícies." +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 "Trata o modelo apenas como superfície, volume ou volumes com superfícies soltas. O modo de impressão normal imprime apenas volumes delimitados. O modo \"Superfície\" imprime uma única parede que acompanha a superfície da malha sem enchimento ou revestimento superior/inferior. O modo \"Ambos\" imprime volumes delimitados normalmente e quaisquer polígonos restantes como superfícies." #: fdmprinter.def.json msgctxt "magic_mesh_surface_mode option normal" @@ -4955,29 +4478,24 @@ msgstr "Ambos" #: fdmprinter.def.json msgctxt "magic_spiralize label" msgid "Spiralize Outer Contour" -msgstr "Contorno externo em espiral" +msgstr "\"Spiralize\" Contorno Exterior" +# rever! +# um aumento em Z #: 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 "Esta opção uniformiza o movimento Z da extremidade exterior. Isto irá criar um aumento Z constante em toda a impressão. Esta funcionalidade torna um modelo sólido numa única impressão de parede com um fundo sólido. Esta funcionalidade só deve ser ativada quando cada camada contiver apenas uma única peça." +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 "\"Spiralize\" é uma opção que uniformiza o movimento em Z do contorno exterior. Isto irá criar uma elevação em Z, constante, em toda a peça. Esta funcionalidade transforma um modelo sólido numa impressão com uma única parede e com uma base sólida. Esta funcionalidade só deve ser ativada quando cada camada contiver apenas uma única peça." #: fdmprinter.def.json msgctxt "smooth_spiralized_contours label" msgid "Smooth Spiralized Contours" -msgstr "Suavizar contornos em espiral" +msgstr "\"Spiralize\" Suavizar Contornos" #: 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 "Suaviza os contornos em espiral para reduzir a visibilidade da costura Z (a costura Z deve ser praticamente impercetível na impressão, mas continuará a ser visível na visualização da camada). Observe que a suavização tenderá a desfocar pequenos detalhes na superfície." +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 "Suaviza os contornos, criados pelo \"Spiralize\", para reduzir a visibilidade da junta Z (a junta Z deve ser praticamente imperceptível na impressão, mas continuará a ser visível na visualização por camadas). Ter em conta que a suavização tenderá a reduzir/desfocar pequenos detalhes da superfície." #: fdmprinter.def.json msgctxt "relative_extrusion label" @@ -4986,13 +4504,7 @@ msgstr "Extrusão relativa" #: fdmprinter.def.json msgctxt "relative_extrusion description" -msgid "" -"Use relative extrusion rather than absolute extrusion. Using relative E-" -"steps makes for easier post-processing of the Gcode. However, it's not " -"supported by all printers and it may produce very slight deviations in the " -"amount of deposited material compared to absolute E-steps. Irrespective of " -"this setting, the extrusion mode will always be set to absolute before any " -"Gcode script is output." +msgid "Use relative extrusion rather than absolute extrusion. Using relative E-steps makes for easier post-processing of the Gcode. However, it's not supported by all printers and it may produce very slight deviations in the amount of deposited material compared to absolute E-steps. Irrespective of this setting, the extrusion mode will always be set to absolute before any Gcode script is output." msgstr "Utilize a extrusão relativa em vez da extrusão absoluta. A utilização de passos E relativos facilita o pós-processamento do Gcode. Contudo, isto não é compatível com todas as impressoras e poderá produzir ligeiros desvios na quantidade de material depositado em comparação com os passos E absolutos. Independentemente desta definição, o modo de extrusão será sempre definido como absoluto antes da saída de qualquer script Gcode." #: fdmprinter.def.json @@ -5005,32 +4517,39 @@ msgctxt "experimental description" msgid "experimental!" msgstr "experimental!" +# rever! +# ordem de -impressão- das paredes? +# incluir _Impressão_? #: fdmprinter.def.json msgctxt "optimize_wall_printing_order label" msgid "Optimize Wall Printing Order" -msgstr "Otimizar ordem de impressão de paredes" +msgstr "Otimizar Ordem Paredes" #: fdmprinter.def.json msgctxt "optimize_wall_printing_order description" -msgid "" -"Optimize the order in which walls are printed so as to reduce the number of " -"retractions and the distance travelled. Most parts will benefit from this " -"being enabled but some may actually take longer so please compare the print " -"time estimates with and without optimization." -msgstr "Otimiza a ordem na qual as paredes são impressas de forma a reduzir o número de retrações e a distância percorrida. A maioria das peças irá beneficiar da ativação desta opção, embora algumas possam demorar mais tempo, portanto compare as estimativas de tempo de impressão com e sem otimização." +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "Otimizar a ordem pela qual as paredes são impressas de forma a reduzir o número de retrações e a distância percorrida. A maioria das peças irá beneficiar com a ativação desta opção, mas algumas podem na realidade demorar mais tempo, portanto, por favor compare as estimativas do tempo de impressão com e sem otimização." +# rever! +# Is the english string correct? for the label? +# -Break up +# Partir? +# Dividir? +# -chunks +# Partes? +# Pedaços? #: fdmprinter.def.json msgctxt "support_skip_some_zags label" msgid "Break Up Support In Chunks" -msgstr "Separar suporte em blocos" +msgstr "Separar Suportes em Blocos" #: fdmprinter.def.json msgctxt "support_skip_some_zags description" -msgid "" -"Skip some support line connections to make the support structure easier to " -"break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "Ignora algumas ligações de linha de suporte para facilitar a separação da estrutura de suporte. Esta definição é aplicável ao padrão de preenchimento de suporte em ziguezague." +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "Ignorar algumas ligações das linhas de suporte para facilitar a separação da estrutura de suporte. Esta definição é aplicável ao padrão em Ziguezague do enchimento de suporte." +# rever! +# Is the english string correct? for the label? #: fdmprinter.def.json msgctxt "support_skip_zag_per_mm label" msgid "Support Chunk Size" @@ -5038,34 +4557,30 @@ msgstr "Tamanho do bloco de suporte" #: fdmprinter.def.json msgctxt "support_skip_zag_per_mm description" -msgid "" -"Leave out a connection between support lines once every N millimeter to make " -"the support structure easier to break away." -msgstr "Deixa uma ligação entre as linhas de suporte a cada X milímetros para facilitar a separação da estrutura de suporte." +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "Omitir uma ligação entre as linhas de suporte a cada \"x\" milímetros para facilitar a separação da estrutura de suporte." +# rever! +# Is the english string correct? for the label? #: fdmprinter.def.json msgctxt "support_zag_skip_count label" msgid "Support Chunk Line Count" -msgstr "Contagem de linhas do bloco de suporte" +msgstr "Número de linhas do bloco de suporte" #: fdmprinter.def.json msgctxt "support_zag_skip_count description" -msgid "" -"Skip one in every N connection lines to make the support structure easier to " -"break away." -msgstr "Ignora uma em cada X linhas de ligação para facilitar a separação da estrutura de suporte." +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "Ignorar uma em cada \"x\" linhas de ligação para facilitar a separação da estrutura de suporte." #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" -msgstr "Ativar proteção contra correntes de ar" +msgstr "Barreira contra correntes de ar" #: 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 "Isto irá criar uma parede em torno do modelo que retém ar (quente) e o protege contra fluxos de ar exterior. Esta opção é especialmente útil para materiais que se deformam com facilidade." +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 "Isto irá criar uma parede em torno do modelo, que retém o ar (quente) e protege contra correntes de ar externas. Esta opção é especialmente útil para materiais que se deformam com facilidade." #: fdmprinter.def.json msgctxt "draft_shield_dist label" @@ -5084,9 +4599,7 @@ msgstr "Limite de proteção contra correntes de ar" #: 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." +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 "Define a altura da proteção contra correntes de ar. Opte por imprimir a proteção contra correntes de ar com a altura máxima do modelo ou com uma altura limitada." #: fdmprinter.def.json @@ -5106,9 +4619,7 @@ msgstr "Altura da proteção contra correntes de ar" #: fdmprinter.def.json msgctxt "draft_shield_height description" -msgid "" -"Height limitation of the draft shield. Above this height no draft shield " -"will be printed." +msgid "Height limitation of the draft shield. Above this height no draft shield will be printed." msgstr "Limite de altura da proteção contra correntes de ar. Não será impressa qualquer proteção contra correntes de ar acima desta altura." #: fdmprinter.def.json @@ -5118,10 +4629,7 @@ msgstr "Tornar saliência imprimível" #: 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." +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 "Altera a geometria do modelo impresso de forma que seja necessário suporte mínimo. Saliências acentuadas tornar-se-ão saliências rasas. As áreas de saliências irão baixar para se tornarem mais verticais." #: fdmprinter.def.json @@ -5131,24 +4639,20 @@ msgstr "Ângulo máximo do modelo" #: 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 "O ângulo máximo das saliências após se terem tornado imprimíveis. Com um valor de 0°, todas as saliências são substituídas por um modelo ligado à placa de construção e, com um valor de 90°, o modelo não será alterado de forma alguma." +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 "O ângulo máximo das saliências após se terem tornado imprimíveis. Com um valor de 0°, todas as saliências são substituídas por um modelo ligado à base de construção e, com um valor de 90°, o modelo não será alterado de forma alguma." #: fdmprinter.def.json msgctxt "coasting_enable label" msgid "Enable Coasting" msgstr "Ativar desaceleração" +# rever! +# fios soltos? #: 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 "A desaceleração substitui a última parte de um caminho de extrusão por um caminho de deslocamento. O material vazado é utilizado para imprimir a última parte do caminho de extrusão de forma a reduzir os fios soltos." +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\" substitui a última parte de um percurso de extrusão por um percurso de deslocamento. O material que escorreu é utilizado para imprimir a última parte do percurso de extrusão de forma a reduzir os s." #: fdmprinter.def.json msgctxt "coasting_volume label" @@ -5157,10 +4661,8 @@ msgstr "Volume de desaceleração" #: fdmprinter.def.json msgctxt "coasting_volume description" -msgid "" -"The volume otherwise oozed. This value should generally be close to the " -"nozzle diameter cubed." -msgstr "O volume que, caso contrário, vazaria. Geralmente, este valor deve ser próximo ao diâmetro cúbico do bocal." +msgid "The volume otherwise oozed. This value should generally be close to the nozzle diameter cubed." +msgstr "O volume que de outra forma iria escorrer. Geralmente, este valor deve ser próximo ao diâmetro cúbico do nozzle." #: fdmprinter.def.json msgctxt "coasting_min_volume label" @@ -5169,11 +4671,7 @@ msgstr "Volume mínimo antes da desaceleração" #: 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." +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 "O menor volume que um caminho de extrusão deve ter antes de permitir a desaceleração. Para caminhos de extrusão mais curtos, é acumulada menos pressão no tubo Bowden e, como tal, o volume de desaceleração adota uma escala linear. Este valor deve sempre ser superior ao Volume de desaceleração." #: fdmprinter.def.json @@ -5183,24 +4681,18 @@ msgstr "Velocidade de desaceleração" #: 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." +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 "A velocidade de movimento durante a desaceleração, relativa à velocidade do caminho de extrusão. É recomendado um valor ligeiramente abaixo de 100%, uma vez que durante o movimento de desaceleração, a pressão no tubo Bowden diminui." #: fdmprinter.def.json msgctxt "skin_alternate_rotation label" msgid "Alternate Skin Rotation" -msgstr "Alternar rotação do revestimento" +msgstr "Alternar Rotação Revestimento" #: 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 "Alterna a direção na qual as camadas superiores/inferiores são impressas. Geralmente, estas são impressas apenas na diagonal. Esta definição adiciona as direções apenas X e apenas Y." +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 "Alterna a direção na qual as camadas superiores/inferiores são impressas. Geralmente, estas são impressas apenas na diagonal. Esta definição adiciona também as direções só em X e só em Y." #: fdmprinter.def.json msgctxt "cross_infill_pocket_size label" @@ -5209,9 +4701,7 @@ msgstr "Tamanho da bolsa de cruz 3D" #: fdmprinter.def.json msgctxt "cross_infill_pocket_size description" -msgid "" -"The size of pockets at four-way crossings in the cross 3D pattern at heights " -"where the pattern is touching itself." +msgid "The size of pockets at four-way crossings in the cross 3D pattern at heights where the pattern is touching itself." msgstr "O tamanho das bolsas em cruzamentos de quatro vias no padrão de cruz 3D em alturas onde o padrão está em contacto consigo próprio." #: fdmprinter.def.json @@ -5221,60 +4711,47 @@ msgstr "Alternar bolsas de cruz 3D" #: fdmprinter.def.json msgctxt "cross_infill_apply_pockets_alternatingly description" -msgid "" -"Only apply pockets at half of the four-way crossings in the cross 3D pattern " -"and alternate the location of the pockets between heights where the pattern " -"is touching itself." +msgid "Only apply pockets at half of the four-way crossings in the cross 3D pattern and alternate the location of the pockets between heights where the pattern is touching itself." msgstr "Aplica bolsas em apenas metade dos cruzamentos de quatro vias no padrão de cruz 3D e alterna a localização das bolsas entre alturas onde o padrão está em contacto consigo próprio." #: fdmprinter.def.json msgctxt "spaghetti_infill_enabled label" msgid "Spaghetti Infill" -msgstr "Preenchimento em esparguete" +msgstr "Enchimento em esparguete" #: 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 "Imprime o preenchimento de tempos a tempos, para que o filamento encaracole desordenadamente dentro do objeto. Isto reduz o tempo de impressão, mas o comportamento é um pouco imprevisível." +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 "Imprime o enchimento de tempos a tempos, para que o filamento encaracole desordenadamente dentro do objeto. Isto reduz o tempo de impressão, mas o comportamento é um pouco imprevisível." #: fdmprinter.def.json msgctxt "spaghetti_infill_stepped label" msgid "Spaghetti Infill Stepping" -msgstr "Passos de preenchimento em esparguete" +msgstr "Passos de enchimento em esparguete" #: fdmprinter.def.json msgctxt "spaghetti_infill_stepped description" -msgid "" -"Whether to print spaghetti infill in steps or extrude all the infill " -"filament at the end of the print." -msgstr "Imprime o preenchimento em esparguete de forma faseada ou extrude todos os filamentos de preenchimento no final da impressão." +msgid "Whether to print spaghetti infill in steps or extrude all the infill filament at the end of the print." +msgstr "Imprime o enchimento em esparguete de forma faseada ou extrude todos os filamentos de enchimento no final da impressão." #: fdmprinter.def.json msgctxt "spaghetti_max_infill_angle label" msgid "Spaghetti Maximum Infill Angle" -msgstr "Ângulo de preenchimento máximo em esparguete" +msgstr "Ângulo de enchimento máximo em esparguete" #: 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 "O ângulo máximo em relação ao eixo Z do interior da impressão para áreas que devem ser preenchidas posteriormente com o preenchimento em esparguete. A redução deste valor produz mais partes angulares no modelo que deverão ser preenchidas em cada camada." +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 "O ângulo máximo em relação ao eixo Z do interior da impressão para áreas que devem ser preenchidas posteriormente com o enchimento em esparguete. A redução deste valor produz mais partes angulares no modelo que deverão ser preenchidas em cada camada." #: fdmprinter.def.json msgctxt "spaghetti_max_height label" msgid "Spaghetti Infill Maximum Height" -msgstr "Altura máxima de preenchimento em esparguete" +msgstr "Altura máxima de enchimento em esparguete" #: fdmprinter.def.json msgctxt "spaghetti_max_height description" -msgid "" -"The maximum height of inside space which can be combined and filled from the " -"top." +msgid "The maximum height of inside space which can be combined and filled from the top." msgstr "A altura máxima do espaço interior que pode ser combinado e preenchido a partir da parte superior." #: fdmprinter.def.json @@ -5284,9 +4761,8 @@ msgstr "Inserção em esparguete" #: fdmprinter.def.json msgctxt "spaghetti_inset description" -msgid "" -"The offset from the walls from where the spaghetti infill will be printed." -msgstr "O desvio das paredes a partir do qual o preenchimento em esparguete será impresso." +msgid "The offset from the walls from where the spaghetti infill will be printed." +msgstr "O desvio das paredes a partir do qual o enchimento em esparguete será impresso." #: fdmprinter.def.json msgctxt "spaghetti_flow label" @@ -5295,23 +4771,18 @@ msgstr "Fluxo em esparguete" #: 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 "Ajusta a densidade do preenchimento em esparguete. Observe que a Densidade de preenchimento controla apenas o espaçamento entre linhas do padrão de preenchimento e não a quantidade de extrusão para o preenchimento em esparguete." +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 "Ajusta a densidade do enchimento em esparguete. Observe que a Densidade de enchimento controla apenas o espaçamento entre linhas do padrão de enchimento e não a quantidade de extrusão para o enchimento em esparguete." #: fdmprinter.def.json msgctxt "spaghetti_infill_extra_volume label" msgid "Spaghetti Infill Extra Volume" -msgstr "Volume adicional de preenchimento em esparguete" +msgstr "Volume adicional de enchimento em esparguete" #: fdmprinter.def.json msgctxt "spaghetti_infill_extra_volume description" -msgid "" -"A correction term to adjust the total volume being extruded each time when " -"filling spaghetti." -msgstr "Um termo de correção para ajustar o volume total a ser extrudido sempre que for realizado o preenchimento em esparguete." +msgid "A correction term to adjust the total volume being extruded each time when filling spaghetti." +msgstr "Um termo de correção para ajustar o volume total a ser extrudido sempre que for realizado o enchimento em esparguete." #: fdmprinter.def.json msgctxt "support_conical_enabled label" @@ -5320,9 +4791,7 @@ msgstr "Ativar suporte cónico" #: fdmprinter.def.json msgctxt "support_conical_enabled description" -msgid "" -"Experimental feature: Make support areas smaller at the bottom than at the " -"overhang." +msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang." msgstr "Funcionalidade experimental: torna as áreas de suporte mais reduzidas na parte inferior do que na saliência." #: fdmprinter.def.json @@ -5332,11 +4801,7 @@ msgstr "Ângulo do suporte cónico" #: 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." +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 "O ângulo da inclinação do suporte cónico. 0 graus é vertical e 90 graus é horizontal. Ângulos mais reduzidos tornam o suporte mais robusto, mas consomem mais material. Ângulos negativos tornam a base do suporte mais larga do que a parte superior." #: fdmprinter.def.json @@ -5346,57 +4811,47 @@ msgstr "Largura mínima do suporte cónico" #: 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 "A largura mínima para a qual a base da área do suporte cónico é reduzida. Larguras reduzidas podem originar estruturas de suporte instáveis." +msgid "Minimum width to which the base of the conical support area is reduced. Small widths can lead to unstable support structures." +msgstr "O diâmetro mínima para a qual a base da área do suporte cónico é reduzida. Larguras reduzidas podem originar estruturas de suporte instáveis." #: fdmprinter.def.json msgctxt "infill_hollow label" msgid "Hollow Out Objects" -msgstr "Esvaziar objetos" +msgstr "Esvaziar Objetos" #: fdmprinter.def.json msgctxt "infill_hollow description" -msgid "" -"Remove all infill and make the inside of the object eligible for support." -msgstr "Remove todo o preenchimento e torna o interior do objeto elegível para suporte." +msgid "Remove all infill and make the inside of the object eligible for support." +msgstr "Remover todo o enchimento e tornar o interior do objeto elegível para ter suportes." #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_enabled label" msgid "Fuzzy Skin" -msgstr "Revestimento difuso" +msgstr "Revestimento Difuso" #: 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 "Vibra aleatoriamente enquanto imprime a parede externa, para que a superfície apresente um aspeto rugoso e difuso." +msgid "Randomly jitter while printing the outer wall, so that the surface has a rough and fuzzy look." +msgstr "Vibra aleatoriamente enquanto imprime a parede exterior, para que a superfície apresente um aspeto rugoso e difuso." #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_thickness label" msgid "Fuzzy Skin Thickness" -msgstr "Espessura do revestimento difuso" +msgstr "Espessura Revestimento Difuso" #: 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 "A largura dentro da qual deve ser produzida vibração. É recomendado mantê-la abaixo da largura da parede externa, uma vez que as paredes internas não são alteradas." +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 "O diâmetro dentro da qual deve ser produzida vibração. É recomendado mantê-la abaixo do diâmetro da parede exterior, uma vez que as paredes interiores não são alteradas." #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_density label" msgid "Fuzzy Skin Density" -msgstr "Densidade do revestimento difuso" +msgstr "Densidade Revestimento Difuso" #: 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." +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 "A densidade média dos pontos introduzidos em cada polígono numa camada. Observe que os pontos originais do polígono são eliminados, pelo que uma densidade baixa resulta numa redução da resolução." #: fdmprinter.def.json @@ -5406,11 +4861,7 @@ msgstr "Distância do ponto de revestimento difuso" #: 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." +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 "A distância média entre os pontos aleatórios introduzidos em cada segmento de linha. Observe que os pontos originais do polígono são eliminados, pelo que uma suavidade elevada resulta numa redução da resolução. Este valor deve ser superior a metade da Espessura do revestimento difuso." #: fdmprinter.def.json @@ -5421,7 +4872,7 @@ msgstr "Desvio de extrusão máximo de compensação da taxa de fluxo" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "A distância máxima em mm a ser compensada." +msgstr "A distância máxima em milímetros a ser compensada." #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" @@ -5436,40 +4887,31 @@ msgstr "O fator de multiplicação da taxa de fluxo -> translação de distânci #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" -msgstr "Impressão de fios" +msgstr "Impressão em Fios" #: 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 "Imprime apenas a superfície externa com uma estrutura entrelaçada dispersa a partir \"do ar\". Isto é realizado ao imprimir horizontalmente os contornos do modelo em determinados intervalos Z que são ligados através de linhas ascendentes e diagonais descendentes." +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 "Imprime apenas a superfície exterior com uma estrutura entrelaçada dispersa a partir \"do ar\". Isto é realizado ao imprimir horizontalmente os contornos do modelo em determinados intervalos Z que são ligados através de linhas ascendentes e diagonais descendentes." #: fdmprinter.def.json msgctxt "wireframe_height label" msgid "WP Connection Height" -msgstr "Altura de ligação da impressão de fios" +msgstr "Altura de ligação da impressão em fios" #: 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." +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 "A altura das linhas ascendentes e diagonais descendentes entre duas partes horizontais. Isto determina a densidade geral da estrutura de rede. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json msgctxt "wireframe_roof_inset label" msgid "WP Roof Inset Distance" -msgstr "Distância de inserção do teto da impressão de fios" +msgstr "Distância de inserção do tecto da impressão de fios" #: 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." +msgid "The distance covered when making a connection from a roof outline inward. Only applies to Wire Printing." msgstr "A distância percorrida ao efetuar uma ligação a partir de um contorno de telhado interno. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json @@ -5479,10 +4921,8 @@ msgstr "Velocidade da impressão de fios" #: fdmprinter.def.json msgctxt "wireframe_printspeed description" -msgid "" -"Speed at which the nozzle moves when extruding material. Only applies to " -"Wire Printing." -msgstr "Velocidade à qual o bocal se movimenta ao extrudir material. Aplica-se apenas à impressão de fios." +msgid "Speed at which the nozzle moves when extruding material. Only applies to Wire Printing." +msgstr "Velocidade à qual o nozzle se movimenta ao extrudir material. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json msgctxt "wireframe_printspeed_bottom label" @@ -5491,9 +4931,7 @@ msgstr "Velocidade de impressão da parte inferior da impressão de fios" #: 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." +msgid "Speed of printing the first layer, which is the only layer touching the build platform. Only applies to Wire Printing." msgstr "Velocidade de impressão da primeira camada, que é a única camada que entra em contacto com a plataforma de construção. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json @@ -5503,8 +4941,7 @@ msgstr "Velocidade de impressão ascendente da impressão de fios" #: fdmprinter.def.json msgctxt "wireframe_printspeed_up description" -msgid "" -"Speed of printing a line upward 'in thin air'. Only applies to Wire Printing." +msgid "Speed of printing a line upward 'in thin air'. Only applies to Wire Printing." msgstr "A velocidade de impressão de uma linha ascendente \"no ar\". Aplica-se apenas à impressão de fios." #: fdmprinter.def.json @@ -5514,8 +4951,7 @@ msgstr "Velocidade de impressão descendente da impressão de fios" #: fdmprinter.def.json msgctxt "wireframe_printspeed_down description" -msgid "" -"Speed of printing a line diagonally downward. Only applies to Wire Printing." +msgid "Speed of printing a line diagonally downward. Only applies to Wire Printing." msgstr "Velocidade de impressão de uma linha diagonal descendente. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json @@ -5525,9 +4961,7 @@ msgstr "Velocidade de impressão horizontal da impressão de fios" #: fdmprinter.def.json msgctxt "wireframe_printspeed_flat description" -msgid "" -"Speed of printing the horizontal contours of the model. Only applies to Wire " -"Printing." +msgid "Speed of printing the horizontal contours of the model. Only applies to Wire Printing." msgstr "Velocidade de impressão de contornos horizontais do modelo. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json @@ -5537,9 +4971,7 @@ msgstr "Fluxo de impressão de fios" #: 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." +msgid "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing." msgstr "Compensação de fluxo: a quantidade de material extrudido é multiplicada por este valor. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json @@ -5559,8 +4991,7 @@ msgstr "Fluxo plano da impressão de fios" #: fdmprinter.def.json msgctxt "wireframe_flow_flat description" -msgid "" -"Flow compensation when printing flat lines. Only applies to Wire Printing." +msgid "Flow compensation when printing flat lines. Only applies to Wire Printing." msgstr "Compensação de fluxo ao imprimir linhas planas. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json @@ -5570,9 +5001,7 @@ msgstr "Atraso superior da impressão de fios" #: 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." +msgid "Delay time after an upward move, so that the upward line can harden. Only applies to Wire Printing." msgstr "O tempo de atraso após um movimento ascendente, para que a linha ascendente possa endurecer. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json @@ -5592,10 +5021,7 @@ msgstr "Atraso plano da impressão de fios" #: 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." +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 "Tempo de atraso entre dois segmentos horizontais. A introdução desse atraso pode causar melhor aderência às camadas anteriores nos pontos de ligação. No entanto, os atrasos demasiado longos podem causar flacidez. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json @@ -5607,9 +5033,10 @@ msgstr "Facilidade de movimento ascendente da impressão de fios" 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 "A distância de um movimento ascendente que é extrudido a metade da velocidade.\nIsto pode causar melhor aderência às camadas anteriores, sendo que o material nessas camadas não é demasiado aquecido. Aplica-se apenas à impressão de fios." +"This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." +msgstr "" +"A distância de um movimento ascendente que é extrudido a metade da velocidade.\n" +"Isto pode causar melhor aderência às camadas anteriores, sendo que o material nessas camadas não é demasiado aquecido. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5618,10 +5045,7 @@ msgstr "Tamanho do nó da impressão de fios" #: 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." +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 "Cria um pequeno nó no topo de uma linha ascendente, para que a camada horizontal subsequente possa ligar-se com maior facilidade. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json @@ -5631,9 +5055,7 @@ msgstr "Queda da impressão de fios" #: 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." +msgid "Distance with which the material falls down after an upward extrusion. This distance is compensated for. Only applies to Wire Printing." msgstr "Distância à qual o material cai após uma extrusão ascendente. Esta distância é compensada. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json @@ -5643,10 +5065,7 @@ msgstr "Arrastamento da impressão de fios" #: 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." +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 "Distância à qual o material de uma extrusão ascendente é arrastado juntamente com a extrusão diagonal descendente. Esta distância é compensada. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json @@ -5656,14 +5075,7 @@ msgstr "Estratégia de impressão de fios" #: 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." +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 "Estratégia para assegurar que duas camadas consecutivas se ligam a cada ponto de ligação. A retração permite que as linhas ascendentes endureçam na posição correta, mas pode causar a trituração do filamento. É possível fazer um nó no final de uma linha ascendente para aumentar a probabilidade de ligação e para permitir o arrefecimento da linha. No entanto, podem ser necessárias velocidades de impressão reduzidas. Outra estratégia é compensar a flacidez do topo de uma linha ascendente. Porém, as linhas nem sempre cairão conforme previsto." #: fdmprinter.def.json @@ -5688,63 +5100,48 @@ msgstr "Linhas retas descendentes da impressão de fios" #: 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." +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 "A percentagem de uma linha diagonal descendente que é abrangida por uma peça da linha horizontal. Isto pode impedir a flacidez do ponto mais elevado das linhas ascendentes. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json msgctxt "wireframe_roof_fall_down label" msgid "WP Roof Fall Down" -msgstr "Queda do teto da impressão de fios" +msgstr "Queda do tecto da impressão de fios" #: 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 "A distância à qual as linhas horizontais do teto que são impressas \"no ar\" caem ao ser impressas. Esta distância é compensada. Aplica-se apenas à impressão de fios." +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 "A distância à qual as linhas horizontais do tecto que são impressas \"no ar\" caem ao ser impressas. Esta distância é compensada. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json msgctxt "wireframe_roof_drag_along label" msgid "WP Roof Drag Along" -msgstr "Arrastamento do teto da impressão de fios" +msgstr "Arrastamento do tecto da impressão de fios" #: 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 "A distância da parte final de uma linha interna que é arrastada ao regressar ao contorno externo do teto. Esta distância é compensada. Aplica-se apenas à impressão de fios." +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 "A distância da parte final de uma linha interior que é arrastada ao regressar ao contorno externo do tecto. Esta distância é compensada. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json msgctxt "wireframe_roof_outer_delay label" msgid "WP Roof Outer Delay" -msgstr "Atraso externo do teto da impressão de fios" +msgstr "Atraso externo do tecto da impressão de fios" #: 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 "Tempo gasto nos perímetros externos do orifício que se irá transformar em teto. Períodos de tempo mais longos permitem garantir uma melhor ligação. Aplica-se apenas à impressão de fios." +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 "Tempo gasto nos perímetros externos do buraco que se irá transformar em tecto. Períodos de tempo mais longos permitem garantir uma melhor ligação. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json msgctxt "wireframe_nozzle_clearance label" msgid "WP Nozzle Clearance" -msgstr "Espaço do bocal da impressão de fios" +msgstr "Espaço do nozzle da impressão de fios" #: 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 "Distância entre o bocal e as linhas horizontais descendentes. Uma maior folga resulta em linhas horizontais descendentes com um ângulo menos acentuado, o que, por sua vez, resulta em menos ligações ascendentes com a camada seguinte. Aplica-se apenas à impressão de fios." +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 "Distância entre o nozzle e as linhas horizontais descendentes. Uma maior folga resulta em linhas horizontais descendentes com um ângulo menos acentuado, o que, por sua vez, resulta em menos ligações ascendentes com a camada seguinte. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json msgctxt "command_line_settings label" @@ -5753,9 +5150,7 @@ msgstr "Definições de linha de comando" #: fdmprinter.def.json msgctxt "command_line_settings description" -msgid "" -"Settings which are only used if CuraEngine isn't called from the Cura " -"frontend." +msgid "Settings which are only used if CuraEngine isn't called from the Cura frontend." msgstr "Definições que só são utilizadas se o CuraEngine não for ativado a partir do front-end do Cura." #: fdmprinter.def.json @@ -5765,10 +5160,8 @@ msgstr "Centrar objeto" #: 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 "Permite centrar o objeto no centro da plataforma de construção (0,0), em vez de utilizar o sistema de coordenadas no qual o objeto foi guardado." +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 "Permite centrar o objeto no centro da base de construção (0,0), em vez de utilizar o sistema de coordenadas no qual o objeto foi guardado." #: fdmprinter.def.json msgctxt "mesh_position_x label" @@ -5797,18 +5190,15 @@ msgstr "Posição Z da malha" #: 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 "Desvio aplicado ao objeto na direção Z. Com esta opção, é possível realizar o que se costumava designar \"Afundamento de objetos\"." +msgid "Offset applied to the object in the z direction. With this you can perform what was used to be called 'Object Sink'." +msgstr "Desvio aplicado ao objeto na direção Z. Com esta opção, é possível realizar o que se costumava designar como \"Afundamento de objetos\"." #: fdmprinter.def.json msgctxt "mesh_rotation_matrix label" msgid "Mesh Rotation Matrix" -msgstr "Matriz de rotação da malha" +msgstr "Matriz Rotação da Malha" #: fdmprinter.def.json msgctxt "mesh_rotation_matrix description" -msgid "" -"Transformation matrix to be applied to the model when loading it from file." -msgstr "Matriz de transformação a ser aplicada ao modelo ao carregá-lo a partir do ficheiro." +msgid "Transformation matrix to be applied to the model when loading it from file." +msgstr "Matriz de transformação a ser aplicada no modelo ao abrir o ficheiro." From d6182c8c4957ed2380f4077b041633b922b815c9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 24 Jan 2018 13:08:02 +0100 Subject: [PATCH 418/551] Fix extra space in translation The only mistake I found, really. Contributes to issue CURA-4692. --- resources/i18n/pt_PT/cura.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po index 7f22bcacd8..725ecfc175 100644 --- a/resources/i18n/pt_PT/cura.po +++ b/resources/i18n/pt_PT/cura.po @@ -222,7 +222,7 @@ msgctxt "@info:title" msgid "Saving" msgstr "A Guardar" -#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:102 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" @@ -320,7 +320,7 @@ msgstr "Estado da ligação" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" -msgstr " " +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 From 3f7eaaae946e7b2050a2705f47f869803238c515 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 24 Jan 2018 13:09:04 +0100 Subject: [PATCH 419/551] Move HTML tags out of translated text We always want the same HTML tag around it. There's no need to allow the translator to change that. Discovered during issue CURA-4692. --- resources/qml/SidebarHeader.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 3e1e85824a..ebfb0f6aff 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -349,7 +349,7 @@ Column Label { id: materialInfoLabel wrapMode: Text.WordWrap - text: catalog.i18nc("@label", "Check compatibility") + text: "" + catalog.i18nc("@label", "Check compatibility") + "" font: UM.Theme.getFont("default") color: UM.Theme.getColor("text") linkColor: UM.Theme.getColor("text_link") From d1f2d6f45d4dd9877011cef2984f50bb9c553488 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 24 Jan 2018 14:02:44 +0100 Subject: [PATCH 420/551] Fix checking material_used per extruder for analytics - CURA-4858 --- 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 bcdb1bb407..971a324aa2 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -107,7 +107,7 @@ class SliceInfo(Extension): "brand": extruder.material.getMetaData().get("brand", "") } extruder_position = int(extruder.getMetaDataEntry("position", "0")) - if extruder_position in print_information.materialLengths: + if len(print_information.materialLengths) > extruder_position: extruder_dict["material_used"] = print_information.materialLengths[extruder_position] extruder_dict["variant"] = extruder.variant.getName() extruder_dict["nozzle_size"] = extruder.getProperty("machine_nozzle_size", "value") From e38cf957bb6bea841fb8c2439d00bad4c3c835e5 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 24 Jan 2018 16:04:11 +0100 Subject: [PATCH 421/551] CURA-4839 Avoid creating unique names for the extruder instance containers if the strategy is upgrade existing --- cura/Settings/CuraContainerRegistry.py | 9 +++++---- plugins/3MFReader/ThreeMFWorkspaceReader.py | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 5d81188750..41b2c492f0 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -454,8 +454,9 @@ class CuraContainerRegistry(ContainerRegistry): # - override the current machine # - create new for custom quality profile # new_global_quality_changes is the new global quality changes container in this scenario. + # create_new_ids indicates if new unique ids must be created # - def addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id, new_global_quality_changes = None): + def addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id, new_global_quality_changes = None, create_new_ids = True): new_extruder_id = extruder_id extruder_definitions = self.findDefinitionContainers(id = new_extruder_id) @@ -464,7 +465,7 @@ class CuraContainerRegistry(ContainerRegistry): return extruder_definition = extruder_definitions[0] - unique_name = self.uniqueName(machine.getName() + " " + new_extruder_id) + unique_name = self.uniqueName(machine.getName() + " " + new_extruder_id) if create_new_ids else machine.getName() + " " + new_extruder_id extruder_stack = ExtruderStack.ExtruderStack(unique_name) extruder_stack.setName(extruder_definition.getName()) @@ -474,7 +475,7 @@ class CuraContainerRegistry(ContainerRegistry): from cura.CuraApplication import CuraApplication # create a new definition_changes container for the extruder stack - definition_changes_id = self.uniqueName(extruder_stack.getId() + "_settings") + definition_changes_id = self.uniqueName(extruder_stack.getId() + "_settings") if create_new_ids else extruder_stack.getId() + "_settings" definition_changes_name = definition_changes_id definition_changes = InstanceContainer(definition_changes_id) definition_changes.setName(definition_changes_name) @@ -501,7 +502,7 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.setDefinitionChanges(definition_changes) # create empty user changes container otherwise - user_container_id = self.uniqueName(extruder_stack.getId() + "_user") + user_container_id = self.uniqueName(extruder_stack.getId() + "_user") if create_new_ids else extruder_stack.getId() + "_user" user_container_name = user_container_id user_container = InstanceContainer(user_container_id) user_container.setName(user_container_name) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index f1a4caea12..01de4cc2c5 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -721,7 +721,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): stack.setName(global_stack_name_new) container_stacks_added.append(stack) - self._container_registry.addContainer(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"]) @@ -793,13 +793,16 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # If we choose to override a machine but to create a new custom quality profile, the custom quality # profile is not immediately applied to the global_stack, so this fix for single extrusion machines # will use the current custom quality profile on the existing machine. The extra optional argument - # in that function is used in thia case to specify a new global stack quality_changes container so + # in that function is used in this case to specify a new global stack quality_changes container so # the fix can correctly create and copy over the custom quality settings to the newly created extruder. new_global_quality_changes = None if self._resolve_strategies["quality_changes"] == "new" and len(quality_changes_instance_containers) > 0: new_global_quality_changes = quality_changes_instance_containers[0] + + # Depending if the strategy is to create a new or override, the ids must be or not be unique stack = self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder", - new_global_quality_changes) + new_global_quality_changes, + create_new_ids = self._resolve_strategies["machine"] == "new") if new_global_quality_changes is not None: quality_changes_instance_containers.append(stack.qualityChanges) quality_and_definition_changes_instance_containers.append(stack.qualityChanges) @@ -822,6 +825,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._container_registry.removeContainer(container.getId()) return + ## In case there is a new machine and once the extruders are created, the global stack is added to the registry, + # otherwise the accContainers function in CuraContainerRegistry will create an extruder stack and then creating + # useless files + if self._resolve_strategies["machine"] == "new": + self._container_registry.addContainer(global_stack) + # Check quality profiles to make sure that if one stack has the "not supported" quality profile, # all others should have the same. # From 428dfeaed751a07cdeba69930c3a02c2671c0fbc Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 24 Jan 2018 16:08:56 +0100 Subject: [PATCH 422/551] Add combobox popup styling --- resources/qml/Settings/SettingComboBox.qml | 31 ++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml index 63d13ae514..e6ded2c788 100644 --- a/resources/qml/Settings/SettingComboBox.qml +++ b/resources/qml/Settings/SettingComboBox.qml @@ -86,13 +86,34 @@ SettingItem verticalAlignment: Text.AlignVCenter } + popup: Popup { + y: control.height - UM.Theme.getSize("default_lining").height + width: control.width + implicitHeight: contentItem.implicitHeight + padding: UM.Theme.getSize("default_lining").width + + contentItem: ListView { + clip: true + implicitHeight: contentHeight + model: control.popup.visible ? control.delegateModel : null + currentIndex: control.highlightedIndex + + ScrollIndicator.vertical: ScrollIndicator { } + } + + background: Rectangle { + color: UM.Theme.getColor("setting_control") + border.color: UM.Theme.getColor("setting_control_border") + } + } + delegate: ItemDelegate { - width: control.width + width: control.width - 2 * UM.Theme.getSize("default_lining").width height: control.height highlighted: control.highlightedIndex == index - contentItem: Text + contentItem: Label { text: modelData.value color: control.contentItem.color @@ -100,6 +121,12 @@ SettingItem elide: Text.ElideRight verticalAlignment: Text.AlignVCenter } + + background: Rectangle + { + color: parent.highlighted ? UM.Theme.getColor("setting_control_highlight") : "transparent" + border.color: parent.highlighted ? UM.Theme.getColor("setting_control_border_highlight") : "transparent" + } } onActivated: From 4f72f5244745a2abcab26d5f7801bf010d6eb447 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 24 Jan 2018 16:29:24 +0100 Subject: [PATCH 423/551] Reduce minimum value for flow to 0.0001% CuraEngine can handle that. It's not going to extrude anything, but neither is 5% really. Contributes to issue CURA-4506. --- 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 c3aa70af04..10a7b1f1ff 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2027,7 +2027,7 @@ "default_value": 100, "value": "material_flow", "type": "float", - "minimum_value": "5", + "minimum_value": "0.0001", "minimum_value_warning": "50", "maximum_value_warning": "150", "settable_per_mesh": true From 19e74a2d45e29493c8d10eee6840c069bb67b18d Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 24 Jan 2018 16:29:36 +0100 Subject: [PATCH 424/551] Add extruder combobox popup styling --- resources/qml/Settings/SettingExtruder.qml | 61 +++++++++++++++------- 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml index b754c3fd74..9d968664ea 100644 --- a/resources/qml/Settings/SettingExtruder.qml +++ b/resources/qml/Settings/SettingExtruder.qml @@ -108,33 +108,28 @@ SettingItem } } - contentItem: Item + contentItem: Label { - Label - { - id: extruderText + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width + anchors.right: downArrow.left + rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width - anchors.right: swatch.left + text: control.currentText + font: UM.Theme.getFont("default") + color: enabled ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") - text: control.currentText - font: UM.Theme.getFont("default") - color: enabled ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") + elide: Text.ElideLeft + verticalAlignment: Text.AlignVCenter - elide: Text.ElideLeft - verticalAlignment: Text.AlignVCenter - } - - Rectangle + background: Rectangle { id: swatch height: UM.Theme.getSize("setting_control").height / 2 width: height anchors.right: parent.right - anchors.rightMargin: downArrow.width + UM.Theme.getSize("setting_unit_margin").width anchors.verticalCenter: parent.verticalCenter anchors.margins: UM.Theme.getSize("default_margin").width / 4 @@ -146,13 +141,35 @@ SettingItem } } + + popup: Popup { + y: control.height - UM.Theme.getSize("default_lining").height + width: control.width + implicitHeight: contentItem.implicitHeight + padding: UM.Theme.getSize("default_lining").width + + contentItem: ListView { + clip: true + implicitHeight: contentHeight + model: control.popup.visible ? control.delegateModel : null + currentIndex: control.highlightedIndex + + ScrollIndicator.vertical: ScrollIndicator { } + } + + background: Rectangle { + color: UM.Theme.getColor("setting_control") + border.color: UM.Theme.getColor("setting_control_border") + } + } + delegate: ItemDelegate { - width: control.width + width: control.width - 2 * UM.Theme.getSize("default_lining").width height: control.height highlighted: control.highlightedIndex == index - contentItem: Text + contentItem: Label { text: model.name color: UM.Theme.getColor("setting_control_text") @@ -160,6 +177,12 @@ SettingItem elide: Text.ElideRight verticalAlignment: Text.AlignVCenter } + + background: Rectangle + { + color: parent.highlighted ? UM.Theme.getColor("setting_control_highlight") : "transparent" + border.color: parent.highlighted ? UM.Theme.getColor("setting_control_border_highlight") : "transparent" + } } } } From 6480926869e214544cabe32f312e8764a9381d91 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 24 Jan 2018 16:44:15 +0100 Subject: [PATCH 425/551] Add swatches in extruder dropdown --- resources/qml/Settings/SettingExtruder.qml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml index 9d968664ea..b86a69b087 100644 --- a/resources/qml/Settings/SettingExtruder.qml +++ b/resources/qml/Settings/SettingExtruder.qml @@ -141,7 +141,6 @@ SettingItem } } - popup: Popup { y: control.height - UM.Theme.getSize("default_lining").height width: control.width @@ -176,6 +175,24 @@ SettingItem font: UM.Theme.getFont("default") elide: Text.ElideRight verticalAlignment: Text.AlignVCenter + rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width + + background: Rectangle + { + id: swatch + height: UM.Theme.getSize("setting_control").height / 2 + width: height + + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.margins: UM.Theme.getSize("default_margin").width / 4 + + border.width: UM.Theme.getSize("default_lining").width + border.color: enabled ? UM.Theme.getColor("setting_control_border") : UM.Theme.getColor("setting_control_disabled_border") + radius: width / 2 + + color: control.model.getItem(index).color + } } background: Rectangle From 1a56eae1869d833c2cc1d162d959c64014978b56 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 24 Jan 2018 16:46:53 +0100 Subject: [PATCH 426/551] Bring SettingOptionalExtruder up to speed --- .../qml/Settings/SettingOptionalExtruder.qml | 78 ++++++++++++++----- 1 file changed, 59 insertions(+), 19 deletions(-) diff --git a/resources/qml/Settings/SettingOptionalExtruder.qml b/resources/qml/Settings/SettingOptionalExtruder.qml index 3bb2a2f1e0..aaec906b76 100644 --- a/resources/qml/Settings/SettingOptionalExtruder.qml +++ b/resources/qml/Settings/SettingOptionalExtruder.qml @@ -127,33 +127,28 @@ SettingItem } } - contentItem: Item + contentItem: Label { - Label - { - id: extruderText + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width + anchors.right: downArrow.left + rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width - anchors.right: swatch.left + text: control.currentText + font: UM.Theme.getFont("default") + color: enabled ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") - text: control.currentText - font: UM.Theme.getFont("default") - color: enabled ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") + elide: Text.ElideRight + verticalAlignment: Text.AlignVCenter - elide: Text.ElideRight - verticalAlignment: Text.AlignVCenter - } - - Rectangle + background: Rectangle { id: swatch height: UM.Theme.getSize("setting_control").height / 2 width: height anchors.right: parent.right - anchors.rightMargin: downArrow.width + UM.Theme.getSize("setting_unit_margin").width anchors.verticalCenter: parent.verticalCenter anchors.margins: UM.Theme.getSize("default_margin").width / 4 @@ -165,19 +160,64 @@ SettingItem } } + popup: Popup { + y: control.height - UM.Theme.getSize("default_lining").height + width: control.width + implicitHeight: contentItem.implicitHeight + padding: UM.Theme.getSize("default_lining").width + + contentItem: ListView { + clip: true + implicitHeight: contentHeight + model: control.popup.visible ? control.delegateModel : null + currentIndex: control.highlightedIndex + + ScrollIndicator.vertical: ScrollIndicator { } + } + + background: Rectangle { + color: UM.Theme.getColor("setting_control") + border.color: UM.Theme.getColor("setting_control_border") + } + } + delegate: ItemDelegate { - width: control.width + width: control.width - 2 * UM.Theme.getSize("default_lining").width height: control.height highlighted: control.highlightedIndex == index - contentItem: Text + contentItem: Label { text: model.name color: UM.Theme.getColor("setting_control_text") font: UM.Theme.getFont("default") elide: Text.ElideRight verticalAlignment: Text.AlignVCenter + rightPadding: swatch.width + UM.Theme.getSize("setting_unit_margin").width + + background: Rectangle + { + id: swatch + height: UM.Theme.getSize("setting_control").height / 2 + width: height + + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.margins: UM.Theme.getSize("default_margin").width / 4 + + border.width: UM.Theme.getSize("default_lining").width + border.color: enabled ? UM.Theme.getColor("setting_control_border") : UM.Theme.getColor("setting_control_disabled_border") + radius: width / 2 + + color: control.model.getItem(index).color + } + } + + background: Rectangle + { + color: parent.highlighted ? UM.Theme.getColor("setting_control_highlight") : "transparent" + border.color: parent.highlighted ? UM.Theme.getColor("setting_control_border_highlight") : "transparent" } } } From a1adce298e76a8c130fcd10a24aee51b4f051744 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 24 Jan 2018 16:56:53 +0100 Subject: [PATCH 427/551] Add color to "recommended"/"custom" button texts --- resources/qml/Sidebar.qml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index d12515c004..a16894a33f 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -214,6 +214,18 @@ Rectangle horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter elide: Text.ElideRight + color: + { + if(control.pressed) + { + return UM.Theme.getColor("action_button_active_text"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_text"); + } + return UM.Theme.getColor("action_button_text"); + } } } } From bcfac3ace6a4bc53c42f507103e43d6bf92ec39d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 25 Jan 2018 17:14:32 +0100 Subject: [PATCH 428/551] Added very rough implementation for UCP files --- plugins/UCPWriter/UCPWriter.py | 68 ++++++++++++++++++++++++++++++++++ plugins/UCPWriter/__init__.py | 25 +++++++++++++ plugins/UCPWriter/plugin.json | 8 ++++ 3 files changed, 101 insertions(+) create mode 100644 plugins/UCPWriter/UCPWriter.py create mode 100644 plugins/UCPWriter/__init__.py create mode 100644 plugins/UCPWriter/plugin.json diff --git a/plugins/UCPWriter/UCPWriter.py b/plugins/UCPWriter/UCPWriter.py new file mode 100644 index 0000000000..cd858b912a --- /dev/null +++ b/plugins/UCPWriter/UCPWriter.py @@ -0,0 +1,68 @@ +import zipfile + +from io import StringIO + +from UM.Resources import Resources +from UM.Mesh.MeshWriter import MeshWriter +from UM.Logger import Logger +from UM.PluginRegistry import PluginRegistry + +MYPY = False +try: + if not MYPY: + import xml.etree.cElementTree as ET +except ImportError: + Logger.log("w", "Unable to load cElementTree, switching to slower version") + import xml.etree.ElementTree as ET + + +class UCPWriter(MeshWriter): + def __init__(self): + super().__init__() + self._namespaces = { + "content-types": "http://schemas.openxmlformats.org/package/2006/content-types", + "relationships": "http://schemas.openxmlformats.org/package/2006/relationships", + } + + def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode): + self._archive = None # Reset archive + archive = zipfile.ZipFile(stream, "w", compression=zipfile.ZIP_DEFLATED) + + gcode_file = zipfile.ZipInfo("3D/model.gcode") + gcode_file.compress_type = zipfile.ZIP_DEFLATED + + # Create content types file + content_types_file = zipfile.ZipInfo("[Content_Types].xml") + content_types_file.compress_type = zipfile.ZIP_DEFLATED + content_types = ET.Element("Types", xmlns=self._namespaces["content-types"]) + + rels_type = ET.SubElement(content_types, "Default", Extension="rels", + ContentType="application/vnd.openxmlformats-package.relationships+xml") + gcode_type = ET.SubElement(content_types, "Default", Extension="gcode", + ContentType="text/x-gcode") + image_type = ET.SubElement(content_types, "Default", Extension="png", + ContentType="image/png") + + # Create _rels/.rels file + relations_file = zipfile.ZipInfo("_rels/.rels") + relations_file.compress_type = zipfile.ZIP_DEFLATED + relations_element = ET.Element("Relationships", xmlns=self._namespaces["relationships"]) + + thumbnail_relation_element = ET.SubElement(relations_element, "Relationship", Target="/Metadata/thumbnail.png", Id="rel0", + Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") + + model_relation_element = ET.SubElement(relations_element, "Relationship", Target="/3D/model.gcode", + Id="rel1", + Type="http://schemas.ultimaker.org/package/2018/relationships/gcode") + + gcode_string = StringIO() + + PluginRegistry.getInstance().getPluginObject("GCodeWriter").write(gcode_string, None) + + archive.write(Resources.getPath(Resources.Images, "cura-icon.png"), "Metadata/thumbnail.png") + + archive.writestr(gcode_file, gcode_string.getvalue()) + archive.writestr(content_types_file, b' \n' + ET.tostring(content_types)) + archive.writestr(relations_file, b' \n' + ET.tostring(relations_element)) + + archive.close() diff --git a/plugins/UCPWriter/__init__.py b/plugins/UCPWriter/__init__.py new file mode 100644 index 0000000000..24a4856c34 --- /dev/null +++ b/plugins/UCPWriter/__init__.py @@ -0,0 +1,25 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Uranium is released under the terms of the LGPLv3 or higher. + +from . import UCPWriter + +from UM.i18n import i18nCatalog + +i18n_catalog = i18nCatalog("cura") + +def getMetaData(): + return { + "mesh_writer": { + "output": [ + { + "mime_type": "application/x-ucp", + "mode": UCPWriter.UCPWriter.OutputMode.BinaryMode, + "extension": "UCP", + "description": i18n_catalog.i18nc("@item:inlistbox", "UCP File (WIP)") + } + ] + } + } + +def register(app): + return { "mesh_writer": UCPWriter.UCPWriter() } diff --git a/plugins/UCPWriter/plugin.json b/plugins/UCPWriter/plugin.json new file mode 100644 index 0000000000..d1e3ce3d1c --- /dev/null +++ b/plugins/UCPWriter/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "UCP Writer", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Provides support for writing UCP files.", + "api": 4, + "i18n-catalog": "cura" +} From 8c7f8fa1fa8910d633a2b80508714e4da9cbf8d5 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 25 Jan 2018 22:34:28 +0100 Subject: [PATCH 429/551] Fix typo in USBOutputController --- plugins/USBPrinting/USBPrinterOutputController.py | 2 +- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputController.py b/plugins/USBPrinting/USBPrinterOutputController.py index ba45e7b0ca..f189ed5876 100644 --- a/plugins/USBPrinting/USBPrinterOutputController.py +++ b/plugins/USBPrinting/USBPrinterOutputController.py @@ -10,7 +10,7 @@ if MYPY: from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel -class USBPrinterOuptutController(PrinterOutputController): +class USBPrinterOutputController(PrinterOutputController): def __init__(self, output_device): super().__init__(output_device) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index d372b54c38..241c026779 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -12,7 +12,7 @@ from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from .AutoDetectBaudJob import AutoDetectBaudJob -from .USBPrinterOutputController import USBPrinterOuptutController +from .USBPrinterOutputController import USBPrinterOutputController from .avr_isp import stk500v2, intelHex from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty From 6cd64e1ce8d16ce5b3f673a2d6b17d7b39c9519d Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 25 Jan 2018 22:47:48 +0100 Subject: [PATCH 430/551] Two more fixes for typo in USBPrinterOutputController --- plugins/USBPrinting/USBPrinterOutputDevice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 241c026779..b53f502d81 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -237,7 +237,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): container_stack = Application.getInstance().getGlobalContainerStack() num_extruders = container_stack.getProperty("machine_extruder_count", "value") # Ensure that a printer is created. - self._printers = [PrinterOutputModel(output_controller=USBPrinterOuptutController(self), number_of_extruders=num_extruders)] + self._printers = [PrinterOutputModel(output_controller=USBPrinterOutputController(self), number_of_extruders=num_extruders)] self._printers[0].updateName(container_stack.getName()) self.setConnectionState(ConnectionState.connected) self._update_thread.start() @@ -364,7 +364,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): elapsed_time = int(time() - self._print_start_time) print_job = self._printers[0].activePrintJob if print_job is None: - print_job = PrintJobOutputModel(output_controller = USBPrinterOuptutController(self), name= Application.getInstance().getPrintInformation().jobName) + print_job = PrintJobOutputModel(output_controller = USBPrinterOutputController(self), name= Application.getInstance().getPrintInformation().jobName) print_job.updateState("printing") self._printers[0].updateActivePrintJob(print_job) From 600e2abce1545619b3792929af338e179b7a5e19 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 26 Jan 2018 13:25:49 +0100 Subject: [PATCH 431/551] Add basic UFP writer plug-in This already implements most of it. Just the thumbnail must still be gotten and put inside the container. Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 21 +++++++++++++++++++++ plugins/UFPWriter/__init__.py | 25 +++++++++++++++++++++++++ plugins/UFPWriter/plugin.json | 8 ++++++++ 3 files changed, 54 insertions(+) create mode 100644 plugins/UFPWriter/UFPWriter.py create mode 100644 plugins/UFPWriter/__init__.py create mode 100644 plugins/UFPWriter/plugin.json diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py new file mode 100644 index 0000000000..fd51d7645c --- /dev/null +++ b/plugins/UFPWriter/UFPWriter.py @@ -0,0 +1,21 @@ +#Copyright (c) 2018 Ultimaker B.V. +#Cura is released under the terms of the LGPLv3 or higher. + +import charon + +from UM.Mesh.MeshWriter import MeshWriter #The writer we need to implement. +from UM.PluginRegistry import PluginRegistry #To get the g-code writer. + +class UFPWriter(MeshWriter): + def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode): + archive = charon.VirtualFile() + archive.open(stream, charon.OpenMode.WriteOnly) + + #Store the g-code from the scene. + archive.addContentType(extension = "gcode", mime_type = "text/x-gcode") + gcode = archive.getStream("/3D/model.gcode") + PluginRegistry.getInstance().getPluginObject("GCodeWriter").write(gcode, None) + archive.addRelation(target = "/3D/model.gcode", file_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") + + #Store the thumbnail. + #TODO \ No newline at end of file diff --git a/plugins/UFPWriter/__init__.py b/plugins/UFPWriter/__init__.py new file mode 100644 index 0000000000..77f8e81222 --- /dev/null +++ b/plugins/UFPWriter/__init__.py @@ -0,0 +1,25 @@ +#Copyright (c) 2018 Ultimaker B.V. +#Cura is released under the terms of the LGPLv3 or higher. + +from . import UFPWriter +from UM.i18n import i18nCatalog #To translate the file format description. +from UM.Mesh.MeshWriter import MeshWriter #For the binary mode flag. + +i18n_catalog = i18nCatalog("cura") + +def getMetaData(): + return { + "mesh_writer": { + "output": [ + { + "mime_type": "application/x-ufp", + "mode": MeshWriter.OutputMode.BinaryMode, + "extension": "ufp", + "description": i18n_catalog.i18nc("@item:inlistbox", "Ultimaker Format Package") + } + ] + } + } + +def register(app): + return { "mesh_writer": UFPWriter.UFPWriter() } diff --git a/plugins/UFPWriter/plugin.json b/plugins/UFPWriter/plugin.json new file mode 100644 index 0000000000..7d10b89ad4 --- /dev/null +++ b/plugins/UFPWriter/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "UFP Writer", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Provides support for writing Ultimaker Format Packages.", + "api": 4, + "i18n-catalog": "cura" +} \ No newline at end of file From 8a3a3d32daf3fb20507c2dc57690842c4293c11d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 26 Jan 2018 13:34:45 +0100 Subject: [PATCH 432/551] Fix imports to Charon classes Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index fd51d7645c..689e696839 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -1,15 +1,16 @@ #Copyright (c) 2018 Ultimaker B.V. #Cura is released under the terms of the LGPLv3 or higher. -import charon +from charon.VirtualFile import VirtualFile #To open UFP files. +from charon.OpenMode import OpenMode #To indicate that we want to write to UFP files. from UM.Mesh.MeshWriter import MeshWriter #The writer we need to implement. from UM.PluginRegistry import PluginRegistry #To get the g-code writer. class UFPWriter(MeshWriter): def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode): - archive = charon.VirtualFile() - archive.open(stream, charon.OpenMode.WriteOnly) + archive = VirtualFile() + archive.open(stream, OpenMode.WriteOnly) #Store the g-code from the scene. archive.addContentType(extension = "gcode", mime_type = "text/x-gcode") From 8bd351c133e92e25fd650aa618232c639628b2a4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 26 Jan 2018 13:52:20 +0100 Subject: [PATCH 433/551] Add placeholder thumbnail to package This kitten really likes boxes of all kinds: Cardboard and plastic boxes for sure, but also digital boxes such as the UFP. Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 7 ++++++- plugins/UFPWriter/kitten.png | Bin 0 -> 453345 bytes 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 plugins/UFPWriter/kitten.png diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 689e696839..0335230321 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -3,6 +3,7 @@ from charon.VirtualFile import VirtualFile #To open UFP files. from charon.OpenMode import OpenMode #To indicate that we want to write to UFP files. +import os.path #To get the placeholder kitty icon. from UM.Mesh.MeshWriter import MeshWriter #The writer we need to implement. from UM.PluginRegistry import PluginRegistry #To get the g-code writer. @@ -19,4 +20,8 @@ class UFPWriter(MeshWriter): archive.addRelation(target = "/3D/model.gcode", file_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") #Store the thumbnail. - #TODO \ No newline at end of file + #TODO: Generate the thumbnail image. Below is just a placeholder. + archive.addContentType(extension = "png", mime_type = "image/png") + thumbnail = archive.getStream("/Metadata/thumbnail.png") + thumbnail.write(os.path.join(os.path.basename(__file__), "kitten.png")) + archive.addRelation(target = "/Metadata/thumbnail.png", file_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") \ No newline at end of file diff --git a/plugins/UFPWriter/kitten.png b/plugins/UFPWriter/kitten.png new file mode 100644 index 0000000000000000000000000000000000000000..44738f94f058b59e8c1eca66377cfd40a96da246 GIT binary patch literal 453345 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

%;_(G^4M)?PO*h6vWv<0N>7yNFf4N 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%0D2m9MUe*61Be*1?zySvD&iK)3u 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%0AR>45gU_7m(~>knqS*ZY=S5EC=sY+7dapZ3mq zU$lyX5s}Ccwrx?z5K=OR4Rc754Lf6yun7$_qbL%wIr;HcVdmU8v&Lp^1^{|*opp5# z0KkA{QCMS|5SkcT-lr(u`NvPUV-r`Fm&#Uaa4>xG=<(Gn7w_G^Rn_&%%4)CI-&k2& zn43!>w9D>XzxU+nVH8415TkTe>Z1?)} z?M^qOP{(?HacymLb8caQ*&dGuH}Bs0{Ab?!o7=bU?K}&BL7+)AWk^KC{Jfq5o1@XF zN$J1+`7izcUw!-0@$tj$r@#KCpPfj!_hh%_3?QXEVgW#alzDHU049PMM59>ORi3>Y z00U%H2`~UyL{w-HGgjqhjMa2Rzom9gFL;z}3gC;_novHyNp{f)>1dwKV z8gNM5yL_DxP$|Fs1w~OsRUj)Zvd5B6=%X@w{wjP7C&Cl?@C;9y;pmz-y$VFCYV?Fm zfrP47@g(mG2B0A|%7PFO3{XPB6E8<1$<1KN%mzhKF+`eiq$kE?17bA~q;f${5m55W z2#`SyfK?ztM2ZLj6%|avNHEhNFhqk^shL#cR9`r?vDEAB?Cvi0=l{XaeDRw-tG6FK6^eG98V{cgS}md zO~2C{3@4LmGdH&|sj86D+UiQL*IQX#J$L?MT?g;|+R9c{)lC!I?RHVv{pY(+pFV!J zw=)(MBI_HbR`@*?`kiE5qbrz{*ZQ*PZ_0Bu*!5Ab;u`Y_DHP=G`sir_kn1vp* z_DWM#XppT1fYdbO@x+!z3egt6)oQ6|tJN-y!<0-}pvdCVQg?2yIUcloU1yE;u57nR zr0~8#BXtciAs{B<9Epnw5x_7SQp6BK6`E;ig6gzsnh+H*HL*$gR-h8Knof(Bi!mfo zP)v|48*5zFbrYGg-3G`pq7<4M38qaGLNG+c=nF>xF@%)FTkd!_*PCmV?e&d~UazZ2 z)=*g#F+@i7wg84C5diXwA5^`y)|xsrmKYI$0RSwU{E|qLax*|cnJ`JpXH-PWw*(Yb zQ0IN=i*~EUh{waBWnNrb98V{c@yHQxt*?wAt#5Vv%j@fd z@%Z&uZ>+AZ)pZ?HIy`(n93OgTo$u^Dd)A+uJA3XtfbKorww6Fszt>w^T|aZ?+{VV{ za5Q?lyS==$_R1?ahJ(?I*RS8dd#jGhYzc&oF=POs)oPdRwjy@By~HL+aIQ3Ed#=;l zKiGf!y_>)E^FRNs5AN(wrfhsvtufXyMp0)>6Qd%1=baC4ym0aC#?lY(+#A)^+dq2u z=U#imwR-P9_-MXtB^A`%=v4${)Q{5?26P6IP*9+nPIi-+m6LJ3~ZugvGXJHX$lo zH(z$T-ik(4T`b*Jx4pT%nAkjdx;q(-8Mun6=(JCtK3leXE30d(>+98YY7DO|E;?r? zlWK8!rPG}|efqR>c6|L z!CH$*)>`KZVml+7fdZm;4j5x>h{za|BN<)VX$hq1Cg*?Xoou&2Tg#V$a4flQ+)0 zR?&98AU1}mw9XM3L~9HqwaOMcV@lsDTd8gwlWlvbDwK%Us3LoxKryC}LTDO`REHE} zGdwy%0^__bi=u4pJ=p`K<>lq$ql2Q;Sw6Mttv}d(cILu`P&d9+S|*KR4SDOOno>-V zD>eYcfT99Qpel*UBuO!b$z)nr^|)ySsE#qBAW)1cpsJ*#2#9RBiBZ!@dmYeu&(3=5 z*ch^=?6juURAXYMBqA}AwIRh6qd{cEkdjEk1lDrfyM=|tZny7Rt@Tq|&Nu=jVrPs< z008G)j{WAJd?J*TI%N?hil{LR`3930eF}yRAR;qFQAkY0K;H3qH1*!4B!-x+i7_Tg zZC|iAA%?1|rjv;wF3a-S^MjpdPkT%A2KkNGZj7g4`^l4!9^T(vTR$8Q_m2*5yn5q} zPrZ5h%C(#Cz5nNb`tM$U;}h4fy~IQ>T)V1-j~+cDl5W2{npE459$&k5{nGjKKls}p z93LMZ9PI7w?G6XS!u!*wPcO_bHg#RL{Eb&%|NQ4Z|L^|v&z~Rc`J!OZd|(lk&{PuR zLT`R^>vXHzF~;mXd;aYC&NRu^sjbl@eEV!(*y~w_>Vt)=chmMX0IsT{@~_9zYmf~k&tpB76pX_R5IM(DJ7IF zmy4hlwGm8!6HZwvWPv1MjWeZ6RIvbnm{3Ud{SI+1qN0Xgn;s~vnFpJPV@i-O01eF z0jL226_dSRI$Idb3e>7rfi*dRYzEHlEGLuzrlbXOg(`@N@|MG7NkT*j`Tdy>DyWoO z4TKeu$$M&17FGfvQ3OFPl?{SI$_NetGN2lz+imye=kGjtyt}jWscSF%7eD*={+ECL zJKz1m->oe#onBqrnqO=}6C^b$EEdifsA~bkYREd%fFz`rrTMb3MS0Z3!)b%Y+oCY- z_SucirIqEqqvJX>sPWO=yMSTew6|9@KS>K<6*KaOUi}#pQ*?rNtzT#I&(-=IH3)!}os>n#%ifetx;r z=_8SI#oXLtS+=crNaU<@z7Rz3ydW^Kb)MK+W@@>SAnC3Xmj0N}7m_^WIwHopaW)v2|5j>r9f+R7F{k z^{&%uwR+Y&vKX5vDuhlzBc!5qFI~BE`og86Q?9P8I%@#|G!i2bXIzb8B0xkUKqgW| zYpgLGLr@?~R+7Lh(}Bz;FNfK%C=ilBYTH&w0httZSWi8&HAWS@wUfyd5v{dN3`qr& zoZ8xKw>$S9KG@#fo$t=olgX#w{PcwjXAdXS#ih00+}!<#_wU}h8>4*jr+(`C%Qt>> z>sGhhH)ZksaDQWUV|C+HO7(OwobS&s%=h*V50+LpR@ase5B8t$A5JFI!D#sC(c@bm zzQ42kG>IG^9F9lhmtJ~letzDtIe5O0sK%Gh6?v4GUviqH8V``oe19H6Z$Er^XZvZl z+iN@5Gyd$E)8GH#&YU$7Av45~Xc~hcA+eNh|M}qaH(vbq&D(89X#G1M-28{1{1jXJ z&Vz@hC=?-rCIuv8Kx{X!2eZAu1$< zEPq!7&J;COkJwT`)Pz){dgRRZX-Ewa>x|Ho2)TRtr4yb{j`Aqw`v(!o2^I(dkn)Iy zkN`<^2G9xFUZ$ioPKDqMKr!1U&}=@Gfz&{V43GeTA?73eY^j?&WFSZl=HeKzfRZAS zQA`jCO;T(nHHb~4`WszyOslrotVGuj6t%~C+K5f{!vL<-D^#AfgC z==gB|lP_QW*-w4ucmDi8eE8_$a&P|V@bG9fC|FN#toQm0ZR?Ec(PWY@%M7Nf>KUKF zy2N%EVc5j!bULZ4`Gxtlg@yg&!>9YtH`SRIw=ezB0uitNCD15&e)b&XB2NiZR5PE?#?aJef3AWy{v` zsV!;hy^kJjoIh99wKVno>Po63Kr+sOh=yp8G)8CwgR&t(6-G1!NCL^v&!OnvE?v6VNHX3PzUXw?0NN_sc?!WctFnQu1r?^*C&bLgaQO^NdYw*D7G+VS$>cYF z^EXD*>2x%7-YqT8pI+NIJU)7~{rEfI{N|+#=Rf_{TdS*U7cRZfYImAYOA<@iE=#1; zF5N=E+iI8R&Rzc0C*N|V8&5{l@wl$1j%*X+(b3V(_ul#RTc137`smx=e*3eZ|J=sb zslnh#V=7D6D!upKId813rjsCQtn0Pg*6{Ioa!^%wp6(t_t0$xB=dQo9(&>Ki@P4P& z7RfhTP*6jrW$k9Scl+tim9uBUw7z|K&~YA-et7%dFMsBfRN6b+PtY383rA2wy!gQ$kRe{lK6KNQ6dcMyEhDfB_X1 z8-gKf>*IF=P(#=d*lbKYakU1JL}+GnHdN9S;?eN=jq zxVgA+{?z7VGQ9uvaSGwu#fultoqzAi`TDTSJCNoy1Bm5YPWKbU}a@xX=Sb5>8`D=vT=%Jj3Gv3!^Y+8 z6gmN!5C8xm07*naR5Mw_l+B|=nTI+<^&uj29^x7T%Qhy>PEaNzDk(`G=gb0OL?Zc~ zr#U7dDR)a}|7BK$NX);Oh*UM(GzlrMh}qaytAlKIw;zFMGi?;WIv-=IQXGs%5}KYb zTFy5iPC|V+I95jM461H!Z2rP8{c^k0-QC$UY!JZZ&r#Hfb~+`fI%5o5CPsu-w^KUP z934~sy8%cH5F#Q-N?DoPT9}Wqao&xmV^OK=dTDF(_;_r*A%)J;5(9_PsMG7Kf-M{? zkxIMM86O^Ydp#m7+a-n=CsWX5m>^f;MTjuFM#cLvOeYgj0YYR(c2SfhGNd3-rxZe?2ra``E?n%i zJH)WOy4IhY_udxH1LWRDbk^jEGy#>q6o~+$ppZ1D%9)9QVhTizh@vTpAQ3ZRMurhd zN($het(#yC(~0THTLXYW5*w50APUg#cgv!zo2DpR)|$z*e)Z*-2Gjca@zMUl!OqUp z2OoXZYL_p)_~MIKuR348ckBKAXS*NWdLIZcUAnwDzgUfi!@=Rf(ZS>GN83-Ie(?S~ zPq!aV#>2X4KKm12eEsz|eNjy6YBD}v(d4c3Y{ykSoK}O$crdBnz5CIZKl_3j@U3@me)i>;oh$C|>{#a%#H#>8MNr60 zy~#uZIG`-fLqW~RK2BL?Y*Nq+bJjdbLIuov z-&w~DXRNpckRVw_pqXhqqM|A(p$Y?$QXr^FRMBP(k&;t&DoG(`ZW{n11&9IF1Cl}{ zsu7cBP=r{S#ZM9W$IfoZ)FLE+TJ!h#Y~>&zhvU%~UVG&qfB7r_({Fz5`O)*9Z*gLT z#Ey++gV?dC_NXD?s8@Y1ELV9Fmpco^zQztc`^4kpu>VhmGn_;atnd1_&C z|KRzl^;K86yN`Fi_wM`8kH$as>T92P_4P+jw*S>1{y{UIym0w)N^-ov$B z5;3tMW@ZCGnEO-N0;Pn^I)hw*F_zg98PSya-QHPaxT*upROmSS)K!rPR5S2dRgwge zq$(+;lj{PU$QDFJM1}Ga1_TL+Q3X(e0Z~C!NVI6Rjq{K1-SuV1mMsV&*0qF?3?B|h z)p)$p>!WHEJs1uF$vdw}Kk?=#ue|(nyW2fJJf2KzP0=GFs5MqnG)S(r5)vC@tObL; zr8&clNla-GAvFynGNCq65ZPHIih$$8fo-=T$>?Cex4b+UO1l^8SQ7C}`KGJ#=aIzBi!91a3eBoh=w zrAZQ1L(?c|Qq|0%5)nzFDXFrvr7y^^VPlLjXo$IRwzRhJ&M^C;?9R`jwUcTZgNVYg znjm1O8rY8q#aGp=eHRIO8Vh4*BQVU=WwO{-`eQ@_@-hBOFFy1+Mw&V%~v^f~5#Hd7Ai72QAOo~J%VKOIi$r>di9P+s} zD^>tBfFw{>GQvPWsQKxg5GvG$boPUW$bi#q^P*gmMJ6CntHc0YUb&v1_=G5;IcWK@ zD;EhENdP2MNmXYsPf%4QKo&#-LjVbtGTdiY2FQzIOmZ?t$Os?=AW$&G0VFDn7yzI+ z3I62ZL`7hfte_Y+n2A0#HvqKx^dy+mww_4|Kq>-7jZCH>vU8USc$pqJVfxuh{!OBwYFpZ-G}$? zA3VQsYW;K9U-6yZiS%_Q+nr|SwD5^)lYnSeqm*PexcQF3nLe$v&H7-sf(8`Zf>1g zT3SJ-iymI5lwd+B_8hbn%B~@#Uv6k{sz?vCDmIx5j>?)NN4yu|k zn}2lX^F&lab;hKW>JZovAm%C%ClX@2B-=mf(S&MyCWG4keh{w zL;zKoH5AX*E51x>FXVicUwv@n{r4VoZa{I5wf%X`||>ZXzgIg94xa{O2|= zUnam1n*GCL35~{@jdjLa;|zc=92+MI6r}8Rx}A^*#x^PoOH1`=(pg%prq$g1oN<=w&|h0&HW*{O*NaW`L^+>V6fTS>C}ORd zy*jN?6;VNEVG@9YCp(kSG}hKiNwtnqKx3K}>Qah15|L6&5|Sn*w$52&EE{V~-p>=E zL6~c`j5Wp>U`l|#C{j!zh5h02sA*2GZ*`n$IeYoy<<-^oZm(N*yK~FSMcd7k+Jwv& z07Hy9Ho`Qh=7?D zU_2Rn=W`pJiI9naRJEzYY~{c_sis#io-d7ezH|1>nNU>^A8j8T44G817tt32~;|ouxZ459{^hVhExt zNUT3DeC4(k02+jh`uVs^Y?Tyg%mAu9<5-+PP6=|SII55e0M&$oXqEJ1=&6DNxO_E0 za3c2O*NF-#aJH@H%;yQ!C=vof3n8zC4PXLw09FV=g$Wf1Xhd2AIAs(tihv-fM8F7# zllsD`&CkF2>EHSKUyKg+R@6sg zWv<(qPNwa$SnTz0Ki>Yq?K@Gyx7+K>YcHKYcXo4K5w{NxhU4Lx^|j0A&u*+NuWzoe zEG;jutabYf!}0jZ_M`g`?@y~KATKVhtgNkXo!VMhT0*44`~Fnp2@ zu=D(xHQXx8B;s7YkQy?CNSahde(X5_WWqe47g3%m-81i1iSm3;t+guo#>l8BDw;~Co=qXIFf6q^uLwbSd3N8>P^ z4u>NZNvc)dIA`mW2IG;2FyHAGWl^Wth;+RF)Mq}kaq$8wG^5ec;b1Zv#87$T3v0b| zDuOYTtqvf?(9A8)%`eV{ssa%N)RYJyNkUac&;-bYMWKKxMz)k<5`dkgIUr}OPcc5<-K_~K zg#^^ZkU#|?iN+X12$Do|@LwWGQbjVxTW8rAGb3^uHbht!t<}ZlGWW5G-_hE-JA2?p{_44t*oqc`~9-t**JT;*XaIYTy^FVL(eqhNHT`i`g(dg=x>%-xS4>X;Z)9HBU>EkbMeZ96m`Y-;oKYIJ^cf1!w zy+0mTWgY1-Hc9sPp3dg8^^H@Tr%$i0txLNPL(rxGDV-EfCXFB0z80t&uSh?Aw!bzS z4!Y^hC)?-NRs>+;IRGTeq69_y;CS2s{QAq6KltWOri~~Gpk_tAw{!5Pzx{)|2YW}e zf=Ce(u?SF&U<5+DFcrh{EBq#kB8rb;2CRVtwm!so+|q~w5=*racoUtGN?HnMBs*(7 zN$vwWL_s3tmipd*>E(C`#OI%axbcHF-yhMVL`Ww!F?@cWZy`Yvo$hggAc_RpqnNly zKm_0uIecphgP1ud(12FRp&&roc6(1K69@oeF={6TNTHxQNzMW=kPu)2Qj!=!gPbIa7w6_j~!vD?$A?GbJp}*GYp=ia>g%(zKAO*m{r=key3RX_30b1Y(%R$2i9w^uq+q(CbqY7yUUdXwS`SU6Cm z>#6p$0)SfEz)|oLXAv&S8=gBUm^r3AIRu1uJg1_=nT6Ri2O^5yKqM4ErHvpu-v9tc zC^9JkVG)S=Q2?E!^YH|HV~m|IirvElAnm=ISH*O;=w<1t(Q2Be%<|4#Z=ZYNVv^;; zQqO1QeE#&=)4E*r(=5;OG)qmA)QdThN|MCY)%w=vV0lz9>#zyinI=r`xYxZIXltQ)8TSyAjadp3RS80gspgBlogHVa3tT$aFxTFB?*seBH9m@zLqHG@fqe)PNGqFU zRx8p-q?A&m6(aRJ-Ie7v(pDP{NXLuC{&+l|jhhg9{iR_iPsFVZdMksa^DkT+uC6U_ zoa*(uO6#oCP13|#OGM0ph1mzKOw{Z+AB?rkQ5PsWrcnhol2R&!(E5L3S}B$}Necif z5)RsEUUSwgIY)pUb?10$35PO zWULMRFmUt(M|>y8GyI9~7oYQiTNWq+GKj=BassHho&1mxg8+z%{}M!w&^dtkMKpjB zArap?2}l48Kq5ehz70dG03gI7U_ddjYYErN6UCcK06|oyy+c6E5*2_9p(7L!H39-< zfJmYc6@Um$t7dh1>3{gI{^Wo8tG|A9|Mps%i|7hOQM)qe=9vO4Ts`V{=S?$ff+5{W zbwWfsqF$x(Qr7j#a5T#EkMG{TytVbix4sRSJUKkpNY_qnT-(~J>gw_K)1UnEy`O*d z{?XC#%4l_K>ugn3AAR-J@pS&i>#zUz4}SRKOD|1}d0CgMt82Z%uq-NJIeYr_>Gh4% zr#E$CymKs^Bq<^e`u&xqQIe#HWD?s-qfbP&O2x(~MqO82=aV{7J&PDkL>d4CLx`GZ zXixNraS$CeDUJ+-z=Wi=ii^OyEaI&q4y)rL3o#Pgh}j8?fCoUOj8YLEtT<9;nYC7} zsZ(iWCLuzc9v{2;+!aNhXoaki6sm~5^`TkrbXP~qXE)EDT0dpFIT-`YO|f`z@6LmJ zcfd8>G|#g-v#i%Gj;Gz#kqaSD5)sy^mD*XWeOXH5NFg$7MNL_Sx<(>Yq+-@U{1KT{B|sUE>=BkPw6&vjh%4umI)V0fMB7jq_Ay(Ap@( ze!stQYOCL03CuOSpwyx)7FDTjnkG4k?`L*-(7p2Vb=&QAhJ&rMXS=;_Ak4E&5s9!; zN)QwgqGs_(NMwWqp(3R?1P&q3^Qx*?07wW36*})?u{ky_>#7kXtrRK}L5&bZfTamO zGf4=nh)^l-Js@hW>#C}o1^~w6X&roBH??oFBoXHqRXto@{^iep_VLFbACG4b?%(ew z$-O)Gj>d=M>0~|~zwyqS_wL=cWUS3L&z{?U_GHjon$707Zr@%SEf;0|_kaJ>2M_KY z>>bRevoz0!qm@*r!{t>8?tl89|Hqx3y)VD~{JY|p8{^H?dlj$H)(?}wyK@=e) z5Q;_}WnM;<6Rd%>2mq)^3k1+@-kJeXSO|cKbc=9CMoX> zB9b|3Z4eM4Aj$K1ki^g#GytslSp?%UTcHJ<CThG1IO~}2#_PjJ3nT zpx5iBS?WVL7$4V7ooLnT4^opTtr5{^6$00;@xjMbECXoLG4tNmvsnOu6vgv<+v9DS z&%kZDuHEqvGJ-G!j3LgGO=iSD1oq6qyMTa7Yh$%mqyR$e|7r-B1ILSAaE?zBLI9-H z$#*3ZLTD>uM1hep*fe2=gPm=Yrlvbs87!64iSyoZ@ZPiIex7eEFOOE%ri(?IC8PCq zvSxa4Fh4$g`tSiem*;twb}5qTk(#0mO*33wUf(+H>rxXjAOnP^1|LG>P(TQoFmNb~ zMb_`D#1sbyNJ)3JTujGRQRzH&bq$Q!u$v7Aby-+z`op0LTudk3L9f5MQkNCD&|6;# zP2)?d}#;X_Q7~6e**PHgwt+0;gyivVb?g{7`*ZH)j29~7#@rgc-t3@8CuZ5bp;;HV%c3f{Ab(%N}v zlqREt_W&6Wi;OyD0vaS|owXwEplH};{@Mtocg+@fY_V+`azF z^$Qoy4M!sY{^YZd=8MJY&CS!Bn*f}5`eV&_uu--d%skvL92RsUN+9TAdIP@{iErtmoGnk_RJyV%mkp=(wTEh zOQX$|brSsY?l-p{KS?{;o3Fn7?dw-xdEw$)FJHfK_Tox^u+;4i2mRBh))(dCgHJyB z`t*yM*UsRRSDz&!L?GAf`Uf$Kldge&r0gx+pcM}NwU0S(-Z}aG7`M7zx>+uG|#{_nh2B< z76~rCpX50N7eGXubD?Q`@N1V|ob2x}W|Qu4h?-DQ)*nvy4^}od>gik?UC(FzexDm> zvIG$=5<3^ls+lb)vXZnyW5g&@#K0U+HOhdZ?Va6e?drOzook#2gn-~8YQuZ+A%p-3 zMLFL(ck#xXZ!e7o^XX)NZ_j8;K-y?f*vY$_8(TKXiemi5*Pnm#qKxNy&k{mlW@{}124O(tz=#;1`@wsolr{zsQ=2FvB(zC#aD0@d+0M@H zWI8i8sf*(A_M`c17TEPVo#WYbv6$a@`RdgdU+OKd_Iv%o((wG*^QYF=j}8yM{Osmr zIV;BfayWkdjW>K%{D1%Wk4C49*>o|V5BkGL z+mHX^umA0IHhtmzg)^s5z4+qg;c!@1^Lr2OKiGciJm;O%5d|{JBpe_#EC`A)#?Dcx zK+wsu4{zW3{kPtjId|{r{+yW@Qf&gDBB(?N3B9~<{`Adn?q+$00v17-jiyHjhv!dk zcC0=)KF+i;$U0V|00TgSE%YaeVGRTWaRm#A5C~Z?QlL*l`EB+yh!iM-XxmsLnD!_R zO2wLwFhT`@i1B7XfNF5%T8wGR$u#PD`Kx`pBQYQm3d%{I^8^7QC*!JiAgE5r4k!G> zn74nvFo+YbljQ*mk;HUpyKXQsn9?d{K%vA9NR49JHw*>=5UCLX$OtH4kJKQ<_r%Ey zkp)EyF$e=GL_$FTk3_(Ph$KGnIJp1(d%wQ3d+_0{Zw7f1+s6z+1c5{oA*mXKfJU9} zD9JjBwZ>Rwx_Rf!^4jWf(9P0wYpcKh+RIDb-u`_0!kNu)U3y{b^r;JH&ZK!hE*IlP z6#$CGVsd;`H%+2xdC)TodtI9(CNLn-bW!&E!*||z^ZVcZwQEgZ`k~(Sn^U z?f1HxsA-(i1cVG=l(xnofmX^GTQvvb+(yCO}4&Vfc!1U~q(1P;IwuQ<#CN-1rXQQrA@7CY2a*J~WMpkkX*l)7_n&qe%c>xEe$dsrHR$W)9+lghnI;4s}z1_t(F7 z>hu<&IzHUrefG>~L#UV_FrQxESY2ILAm7~n^21wS2&q9gGfIu}&U!Cj?PeEFZ*85w zuyksD>&oTzQybRWB(s5oF-c5@#GIJcI{q)V)-ne~2`os81wl5m_V#^nZ`^qMpZwMj{_gL7axfk@bxA5|Ty=PS-0SvwN%qOd zAKkfoFUzvk_4Sptjq~R(T)lF2b!F||?#|uE4=0n!@nl?91u32N2RbprU`ch9>Lu1A zq&CrlKmX#ZAG~?v_V&|Q*jP5Uo7&okT7m#C>iYVHb6-4uq>NQ87{y5d8sOpn!Mj&p zp1SIAKFd%eh&$=b1_Fz5ttuL*0kA+SViZsiC;*9oLZ&tf)4l^J#{B>c00A}&pq5{J1(CUJ@)L0TGv<>jSrCcS65T4p{$mRy{;DgC*q$^`!Z{2e z6rl{!QUKwkoKORLgrsGBk_99bE3GsYMF>FwC}AR+lL%tY$OJ4X06~Kh3J46WfEckM z(Hs@YLIS4USPLMP2o4y58vre+kpi$|I0*HB{lnkgIo$il&pux=Rx=8TfFKhQb`q_P zj(dQCwOV0Wm%a%ceC=K3>dKV|M~57$Yg?P|fBDUy|NLiFQ+Vf!s(N~K^xl`BfAjcJ z>77jyCE^(r8AS0R+~@ni`lxaLisAtF;!1v7z?6!}dc0@ogjk zT3Zf2?uU)Fh{$MW)45V6l%+I#4tO>?xE?;jnm_Ira)$N5msr>>|JK{1=VMG-~L zS=uqyCP^v+gmCWsxn8f^jHf`Lt>LPcreW8hXRe+2z#@#O$S^>t8m+MMj;xWus1*Cq z=?^?W5E-4`Jbe0WxVls=7R&4FvxCD#)!OE%x8MDa$rC~v@9pgF?kc5)khMy6 za`DW$exBXE{nbBw{PT(UVQ(-^8H0Yk*IB3rAZqb6JJ_e5%Au#a0?n}7nJdTJzA@6Vw&z?T|?)Scjj6eVRFV1Y9dHDFr@zL>YGTGhPe)#ZS zSuFnG5B}3nKfPJZ7I$xdv$VGQ;)|E9P7f!Ox@mNpOp2K_yt=wJoy|V^?88S7?rxsi z%sbtuJG-4h|3CTdAHI10;@vczWmwbg+s8K;FpwCX!kCnR)J;ea7zjv9cXue=AUR?J z(%oIs(xQa4fPjE>Nq5(?|BGjDw>LYE?fPBk`HfHHLhj$TcXeJE1AT^Tc=U{;`#f(6 zq>W}VzDj0pEsnX?{`Y)bBSveAf9XHAW0ZieNalse;;=!fnRFwvHh0GOUkm01kL~7!P4F*gUGIQdFuxP&JHabgKoU?|P%Ze0w14z^Xh;P-Ta(!D2_iv7X$Pcbe zkWWqm&&LG;3FgEmB(cGg$c|YVU7xqur zp0YP`rLv+NZJ@Z!C(J)ts?$_X;~MJyH@w|^=zO%~d+X@o;ZgkGIpB(jh+a~Ze~9qR zQNf_{!oHpHxG#*;WTvSjO4CaIvDc1y(LvN^5cVVYUrfnX3Ws7$`^-YRSH z<>Y}8BbSFR`1RO=9t;{o{H?w1!!+)ilqN_X$}2|&uL48C?@eWg^f@xt+`rgSplZX@ zlcM&2u|<)9K)5}1pjenfF|_f51VfkR^3?fir*J@9N|^qxo{GD~GO@z0U-sg7XUeRl zg^%v*JZ0Z+K(eelx$NhyoVhfRg6u-|#O?hv%C8l;6Ex3)>9V|uFxD{MJJv((UIj$jku z_M2;4zq=@Ch=6?Kq{+OY5iP^f(}vB{7oC(v<8l4Y`Mt{q=YseAyVbcOoxZzOW0Qkx zuj}-J>;|cd`Kc@QLKLbd5%P3jKM-KhSYSr>vOswI)|a@LJ$lKd_G2z?R43f(!H`x5JK)O z;r73@pi8TFwN;<$nXD4#{M9u#`_8r#epJ~Bwv5$&(mwp#esMC8`w$cKxV+qTHd;6k z_hz_|HI9KGRZeSq|L6!Utvqe%2tDn0-`IE<-7nk;7b;`IlV zgMV2o^(D@Oiiv#C$pxiPiHXm}?S%K`u&Ts?yGZv_A;aUfP~eZ?`MCx09F@EeAimn+ zMOR)fj!Q1AFToETZeH7S3$=!K_k%C6jeP80lR@y)BRZv<*dAKAjjyfm6n>SE@rD4u zNR1@pAidVo@=2`PBaNtgx4q6z#IY)3D#hQ*@92R z$(GZ4d1;1$c`Uzz=@W<>p$JA+q_i3Ux58(|#i$czj0U$d)Nbi*Xv^6*e)gm!nYSi| zumfUoZCSp+t9TpSt?hQ!Zha4K%Gkzhs=ZM3s-=m2_`p^&xZGXU{FamFY4sPz94Gk&=mOZbH84P^qDk$u87{eGPmHT{AZcgc_N6`4FT^eVq* zufSQ6P&%x~4_%gman_*y5`=3o$6&0A;XG zp4*|{=q-oXrYUBdxIP}{X2tP~T>tSwZyJB7Wa%#YVX8CxQ}f$UE>Y_7lBpds^+`@v zKCa{W+xgx3p^bmu9#)NQe9}kNf{LW_$4wRt$k1y*g4M@w5_$3f3N+TTIvUHhY>02L z%`Ql7#QJTiV4|3p*0h01b;+67@Q`bQP5R(zqI?qEw2+_prb4Ch^NLbRiBGBS$RG`0 zh7o|t$*H?C+zJE=hCZNl#9*cCl+^)fUkGwJ7ZiN&>|@b zZ?io^tr5xl^B)WCs-m4^&~Y-;*|cKkEjRM4+0o!4MOtE~!8ZR$$$XWSIU z>Ls2YV8`TB*R?28voLROBnJ-q!!TJ`p8U(nPpx+L=;EK%)$8l8iCcE1|8XcD$#4&E zS(%+VI`J#EFE&lgPdm(_7dJsitDy`J|K7B>`#n6qce?qVXwwe2o#G#_pR>H&)G_hj z>qnt`YX&>sOORP@223AajXOH$EX=oguS%y_vG6L|Ign=B`1$!Q`v-6+BsLgq=RBu> z*z`ME^gX{GdPW&|J=R{yQ5ZV+hceuYYbv4t`T)fTkVi`u-*R^rEacM>H)6jA;{N6< z#6*gi-C;uI7Cs=JpwYdQatr*nLL>+MR7K>B!66h_lssU-pxaM4=g3?BF=%|s>phL& zZ)7?YmQr*D12gXuk^lY`lR-=o(H*#vbjXcf_P^E);czL#7px%-efMZWcJkm7y2T=4 zGOT)~IZYH`pt8 zC2A(p^bG{B=g7(9_kCPDiQJ?_1-79Tdk}jx3&+|NNwCuiN>~`cz!u%FF7(@|XQLL@UEYVABZ8{<7 zG&Gqp;s&o~9rsL~nU&Ae=R6f7Dt?D#QTEqTB(0i&?pNYTt5uKT?)E24uqZP(i;!cD zhprxuYwACm;5O2%cn9axs8A6yRH8<5B%C5^xnNJY3}dqvrClM zuIufD4a1V?Uxl{C&7M4qbJwN8MjH3_MQ3Butbm=N+jKV@l<$<9z@I z5_$cND=b0=DVpc4-Xe%<4J?j5Q-S**t8W94MNL;9^{5y@ENJj23C1&?DEZHSWYx)P zfWf`G*y@VKGkDVA9zROvb-F(d{5?3trZb2L&1wFR7SBZJP^{=h7Crv$gVb_~LXKBe z9YetR>gDCSN=g;J&XWJ$=#YQ|?OuMlOVHW0sh#_Je@nG?q+fgFo5-Sbf8M)IoFkjX z$4r;brZY!BYNp~OF!N)1YKA?|BgyE zF+L=Ed_3b0Jbk>|<0zE8StVNP3>45pZ_u18*x%MGnzC!eP<_8C@ZP+iV-*$c?3LR^ z+b~#VjWot?8Y&&8=ESu0NenCQNJ1VvY`%yf{jo{=Ll%t6d~B04o6?y|@jfyA*j}F{bpA%QW}H4 zF1C&VB5li5R7MsIGk#G=enm4Lh5Vj=F%KkD^ObrMb(Uv`QvtM_JKm~6gx70Vt&@uoLf>D7Dn z+?_b;a}5;^TJo9jE6c#;XhBL1obu4#-z;@jiMBFDVexA$6nRE-O}u9CPY%A86kE`b z3tp{q;c$!$Fw^gvHHe{+3hVluB_H=zQ6s9~Lj!6W3j-^rk$Dp?-4$?F+N-y-FJ(l# zu4WGX>9rr05)*|$ux00UE9LEqf#3XC={|k{kw_+faISIC(UP@7^#KHjdn2v2O~Kj@ zG8sVeFN#%T4aTLBT{ZSWhm*-oG28^I*#_c%p6lQBH0>pFY?GRrw2GTx#bN8u;2C-3 z;r)yaXeAoTXdf+sXqJ6;HAOM!f{fYGIg4!swN-pZ&=EkO^W$F?<=N0lg2br zlz@p0tC)=V<8wl<_RV%-Fkqe6H~^ekPtQd_FX`=lH6b&(5qdUu2LS~OgO28Kly}iZ zq;kU?Y#J#s_I0+q6;lj3-S0Q&lXXZvCGUO&hyEESYTfi3kDS~(dlBNep6P8xpYb!T=H`A2I zrXj0U4~HCH`ssZZ^M3E*<)veHwlX23!x?xc+C4*!e@R40FX`_exc4^^hlt)q^2R3U za=G3m%gf7US$|mHqPTz;G=We5oSwmqKB@JVj?EeG!I zkCTK-MF)9ma1VEusD9E}MLJGbOT$wOgFnyqmTJ%)PU=|BL-*t5(PPWgx`{^4)1iz1 z(VL^Lg^9s~fd!3r%9)h0SFgCOaB+-jV~r((4kr>>pC?}ar0VTbNUhQvnk*eyAEq3S zXtT>IgovrVpohF;lFkqkD45r!78n21B60!j=`}-%h0&ax-gysfN9v1sCVLcDaA)I$f0gTqDd^f!N2UY2w-WZObiSR)|aF8rU z^{h<1iZ_J#2^-9d38~|&=3}}2qptG(pA*G9^E7b$^Di!af zK<~+p7*@c~^C&doG~Y<$p&xTTwg6sM>LN%du)g9;0cdng=0)1OJPx03=KL_RaMPi6 zB&bP^UDyfRO4P<_5gCC5VFFSl>Q!c&dreJer3^w?&=_x)OoD7_H1uuqPHFZ&_W7m3Hl zuPmJF)#lR|sIE<{Xdi3*9Dit~bhE&&Vs$c4RG&n;5T(qws3M|Ur&~?T6c+q#pT-oM z*i*uKam|W4ZO#uOCG*!iF3n3sSq~@0(Jt>)34^0>z|Ze(WhH1Wx_)X08a$z0to@O{ z0qZNa0@<_cJa9(6rs6wu#~i^Wv@gnSJ>d&`rD|8lAfm}3P4Bg-k{MPhapc>#He*=| zXB~DlQX`@_j}6&P7ysF`aM5g-_}?=~T(3-Vv&)1Os-$FF6ojVxEL;#H>#1`|7&B~8vJ zDHCw&r4Xx|lS=*Dy1BiT6M8G7mm}=fR=$YC;GbqWH#}QYUG0R1dOvP@E%~qiP?bzm zDRt>SIh5>rib<_80tWw=S&E);r_t3GVn_Q&63_M}o=#&b%AWdiAI=6u<65pRX^!$g zfIkK+$`OfGqjT4XDG30lck{R#xmUElgFO(YmTIDoXX8?IRqh`Q4i-o5#@s2Cup8AwZ$@i4%Z4T&?K| zA@!Tsj}pGI!4(`r!wc}UK1#>Z%yM~wz^(WvFJEVzms?D8{DmD{p1B2ew{{D#dwp&0 zcjc|^eRMf&-Nwe9J+Djq$=d2>|DS1_?nbss_rigtU5ZsyvrmqfXtpNpQFgGdgNR9je}#5`vHTDRK!Z?m)Dn(Z{AGpjNq7%ZF=*4Kv7~( zMknQ{^sg5#ng{aJGNklr+Tr&+-#_FmX{bnhdmILlKFEN1Gx(S7Rk`-3T?JdTISA*=ZXAt;DM49RbSH?s z8KD{Bul9oBD>$7}vE~0UVyVcRy(9e(hjr{D(F)BaAy)5yx8J~=7!vOxX1I)i1l#IH z`{*Gm<^ElMb%otMIgq1yb@Nht#}sapj()?Lp>|D$1v3qCs8?O^^Q?C>(XdM(t}J8N z%8N!F>Nd|O; z#mE!dYn>Al96v9x%n`^?%l0^-Q^Vysa)Bjoi{o`XF{{JUFWrr_fHa?t>JR$(j=EZ2R08)}Pl9iRdg2LF$T;8DH{k9eB76j0Lk=h00x;j2K9$FYBq8FGbgaAp_QMU37#Li3_;!{o1Uvuo z9|wlgFD@7vhN3^-K%``LW2i-1Z83>>5X3yD(V^4)fWe8Bb#e(Gj9E_tQJ-Y*v#@w( zVV?vfM&!o_n}#Xles+c8OH0#yYhlL*kYNL%k*1ox-^#sTs>`QL6xeq(bl%VRQA)H1 zJlkV`CsGiD5%KlW8Xi}GB^9ieizNQiG>^dt2I?}|$bWq$3hq-Y0{jQX4(XlmQixm} zgT74{9zHcrQKdX{wja;c4|=L}=|6)hA1Jz{ZSQDw3+0R*Ni2$IsoeT>@l%l`Obpp- z2@wF|8=-@cr7u)JM=i<#1s0o)fO`m$g+dLb%nu#O}~aOUZVw^ z1BpA9BIQHog4xp^?6aR1`9SE01Q1jv_3EzEq#FHC z9t2VCwfy{hi#k$Gd0Xz~TQ#kV0!~aG61!f#y0lrX+6CpNQ>}7^S~P>W8QRm{UlJAV z{|D_yXnmkFl=m?$vun{6!N#&T1Xv>mRJuF0#dNRrLPFejA(+61~Njx|^ z^xK9-2)?0~1N2j_HPR>&-7>1T1R7xU-j1EPdxMkfe|ghN$%PK3ABr!ayIbwT5rTDk z8J?$NNAApUBW({YAUtKWrs7b%?d)+jH>&QTqcWbP+E3v#Yg?w(k7V+xy(kU4Za@1o zcbC^{{rV1x9fis2`ozR`(HAt;9`}+{gc8K&fwKb2UxhVd{3k`^rGUmqISWr1<>%o|zF>w2!#iY%BCvjW?-7>f|D|mBq^zb$F zs_SC@qWh*j=wHcPXZzJ>riH-f|I+Cho*(7vFYmkKu-Dnl%$`*hy7O^UGV$f2w$FUJ zh1B}(osgeDf5ZxgQ&&5EwpmnJdbb$(kMQ&1@yL*z^OT?89fSDNpvdC#Q_oe8W% zk7;2-v?d=RiVR<02YhP8i|Mvnk8PW-#{Hr&`ELeD8@+A&8j}NP3 zVS!IOFZW=ArLjnY-@(IQ0nvGPF#Lk6y8?g}#q7Kp0tK^AO9;f{YTa2n>kyo*axoz_ zZeJ1qjfo5-2W6Y!{l+@q|_4F zNM2CAEM#*`6KBNm3C@55K#(|73=%e&v-HYJ_tU{F8XE9kBD0u%vXB=}n}aH~B*$4V z!USOUE>RO}AmcQCp_j=(;&Db}3;86qFb*b#`9Td0P0eI$`mIGNuWzuJ5-?cLy36-; zzcNx4XK^fV!NLE*+w00(@J+D_O3r3BWi~a1!Xv;iY5hhF*F9w}Y67s9xZ#zAk`En)kBl~nKOQ0ZF8W>(a#{{m=v}|B)DsXCDz#IJZE0oMN z>;T;TZ#3xB#Y#N6+3>?8QOew_D`C$%&VVUQc_s23@lk3Cdpt;;MyAE=wMu>-yh#c zQ3*G`!sw?`6VQ%nc0wwfDIx3ds>^(TuTLd;=*C_%wyh#!^#lq98_uOhmP;7N$Hng_oZk&z1~N-TFT( zY0bA}G|S|sNSfvNCID5y-kwMWo?PZ;>6J*~ySvkYO>*msA78k?F6XEnQ9l2c0<61#I(Fvcml=Ak}`V9~I^( zQY;20D}27x;*s$$vz3``1RtXoW=LHR4O2Fu7_k#LEHEaE*kC+ctyv5;%T^-B2-~zf zt0lK|B3Fs*MhVB-+PBDCch zw~I;o-Tff)QoO5uIyvg{e%M;R-`{>ZibI$AOFVvkf0_IAc=fa=)GhpT|1LMkgWrTO zItv1}fWt`458IX0#uu97?8$NKnECOj zq$GY!CXhx}A(W&N@(mB5ZiLZWE|^zs|I8F%^!=iU5r+|I85})Sm}>kkEX|)Ap+j2q zyDhvIgIp=q8za6Es7!|Y4PM6J6vv)oskd`zu6c}9Ql*EV9+8Ycsm1L^>5X`DM{TH?UZt^ zF8gd|GrDE!eRcZ^>g($I9Sy_@9cdFAN0}kaEiIHV_;Evaa;%fEeT}*)0RWn1-({8U zvm0|YWdC$)^-`F( zKrj{=D_R+Giv>`2_TT-jkJOXcvAOe!LmXciCGV zQ*r44X8hHy;4P~ij0sW1|7uV2K`Jzu#SRs0pHwCx4u+OpT?Y{#@>*X*LfZ4*>07J;I{ea=H2$YKqazexbUvwK8i{#RY*|bmC z6#o$mSL%P886wTTize2|p?USpf+U5#eB*_2NZVk@O9D6W1Px{Z?o)h!@&ji}f08V< zbP|^*mebTe13gYiQ(%yd+u6?GswMBTE^X~aFLL?m@$oURo3r~QbJ_dpN1Wh{+_sI)HtT?i z|LsnP{=Sn-*ZXZ@cNHph>ywbfGU4nSJ?FT%Pu6Ezd$jLW&N|%1465j#Gl+|b{go7c z+=!`_47gr785|tE**w{Bl*o-_xxfFR8hGB2+v$3D`E*_yBu0-yD@ZG)CjJ*kf%oe% zYEOkiOV^1)-G0;=stl4&U@B!o%R+5N*i`jJQ!SAyTSM6{K;wSy1sh|GzLZ=v*!Tsb z?+%^zU`P27FI&Ohtb#gkF!zab6aMe_drkWsfDYDHeqH{Hm6J;h>?>H$bI{dvs^|7Lwqk_@uz7SC4 zXHvGn(g=(KzU=?gIEr4iO-%G~FQE_o?)yzgk!%$kg!L~5PMddXhFmr-Pa7_(ITEM& zW3kkPZ@ApR1vGQ^+^wdpTM`4(KeO}%ObdKf=UaM#ghPBbR7@^3rFIiLsW1w*~GFw zYi(x5ceEh8&}-AEM!V^jD!e5Je1P@+1WXF$-?&>w^6K-+MkD-}hS1>AR?H=+*vwX2Dk?HMefe zP5Vi()~Nkrva{*pf~s?vFLe_!qpNc{G_s|R;aRAc2wh>PGKWN=AMxzA$31s~T2KD8 zV8-#&3Vjup(u&XV#4{8CCcJ8w0Q_v-Bt2q$(*$y-Jy~*KM)Rmq{|pY0zra?6s=bW6*W3B)A}y|POI#9Z_EcH4i^K|ljzY&%fP3=ZlUXm zxW~0b)o$(#lz zlLeQj0Q|0>^=&mRUM;GsD(Dw&g6r!F;CQC>&O<#a`VRyCgw->KN(hXH5ABeU+54Hk zIbv=vxu)eBYvFqogSf$>TixZb471^9@@LF7G1XW1hbV`hh+&S zzQ}w;1wNgh{(bEbCiW3S1g>pL3`K;~6ph3vEHI7LD`Zz5Isq_o*}OrO-zwl)rvcRY z%KaXiq2Go+Kl%lu^H;IbpWk^NS32+3WC3bJQ%yS8yggB>is|=E@fdlH8Y;#POaSI< zZY6*bCP3MfSWf7A$S-AXwSSl$Q)=YnG zf3@4DA`S4=>m0y0(zMFS?`3S%D>^3PY*p&J-!rxpt#V>}%iNPS!Z|E>J@=j!HTFb& z@<-u1Cg7cfurW3=-U?bG+ShqWepha~H)S;D^BlI0j%J_q7nDm%{<&I;!zmm+nJ?49 zpv`s84xSNVdiSQ)ux1w`Ymq+JIXYTB@w1*-%fhjnE!IbH7+oK-#bkOIz1WRiS-~D$ za`sjL=^e$`4>gZ}MNAq2p_m$;Dl9F1qnbLrbGg-jI9B7b0O@q&@~xH6^?&U9QOkg? z(ptNET#38gGq9u%-YqfG9&RJB!&Fi#_gv{KjONu&h%7vrIYjl$`)Y6OpRU?kbaZ83 zMa;Ch_mU=~L!=?}ADQi5h4HJ1^$)ysSqx%zWf%TF?!K!Z`2>sC zd!dxy=3JYqQbHeBgo2J`9Qb~hDZg^E5ESxjajqKU{#yOAq90ihPXmennHGYiLCDUf zHM0GnVmvwOh!m6uQ^9WYl!r+e5eJHW(iNHlyx0YZenNl*-K}Mpwd~B;ZsiTn1X%c2G94U?sE!++hrsfp5)Tc@)$v&q%u2th=1l9q0(hl} zsRDyho%fj-W}hXQH2jC*Mmn^a1a}a!ExVfaJf#zLapK+Ke71HuYQVkhcazExgh-*B zniEAIwfel?=jX?cX!NnJ3q@rz+J+8dy^D->-)j}+UJlstclGr57t0;rEottLjVRPH z4oI#NP3KPGZ44fs(P^SYSih@Ind-~Re%0`osvW;)0R4?1C$P$*dYO62%=_s`1~Fj~ zpS{Q7r~P)9LxS1Bi*xi(TJmOdeIPgB=6YE%HCRROo3=IDImz03RoILcRVK*%K%hb zHP{p7r_&#-CO?w{sNqpqOh)DJekf1kX%olmO2GpZV@uiq#-pWeHle{~!~$WwSSiHe z-(KQ|C^wj3P`ox7!6$x^kK8M$`5r7isJ$#jMzV4|doy0SkIxQO8;Db(JqV*CiHgd= z7x}q3GjH2w$faF5qHEe9fu0q7ZKj?f#50r>>?$SMV;rY{Yb|i5yd~_>UHW(Ba^SQ) z_xEcxmZ*C8PCS(||KfjgH;Q+-uP8&gSE#dqE#gQ0KBbi; z_gl+o#$$5jHAU{k2p{B#4y_klv8D(K0&9$J5lP;KFgYF`PAj|lx`H4$4>_`*c&{Nq zo(L#dT>#Jji0J7jG!c(qAZhMaXelrIIas+ps8=0cP?3kh%KRBwQ6EwU%_~F7T^L)$ zLqc2x>>WFA0ZTGUs2X_1ia4<}q%4CfwD}cc2Lp(DLu{gj06Qk}z@V<0fGrXEAPWaQ zA#}O3qY?WrAWJMqQ{_i zk;1mFq0OD^U>oKfud>20tln~(3PxMDT8GV#r4Yo`0z1O_VYqJ(vtoGpB@j^&%I}0K zOXvx(N9d%L;+D=y_hUUqUOxL39R^ugnRstzIHaevRf(gTLzm4!DJw{aFC^zs{cqm( zyi=(A;`*GE!`EZc|7O!>)@Auqn9r7V;_%bM@)Ls-t*58w;or6#$|;b!4! zm;qhRHtXzveDR}UaN~AsX3$Xu+wCKOO`Za%1+xe*0RL6|=X?kOip$j4Y6j@buv@zG6=$Q!sciFpAXAwaAxI<&#BEXDvNqa zikUx>Yp7wegXx>F-@nvjM_SS#wAkVS{K+{^_EWe_IQ8aA$c3<$7ym}m@iHJ(M$THK z)S_k=(1)Uux-^a38WDR5v)QnJHqMojBKlkvC9R!JPN(0k_3$6fo5)~4$X@9Fi0NlA z%E=wyqCAtG`aKLG`;c|TQi&cq*33QiEH7tfW^U)@Ey{N1tpv-oyRfh_zo9C?@DYsN z0Qr{(No~F*uJ6>L7}8QoZw$;|3-irTG1{6tpo} zHs;b9-h`F$06&jWoDH69EMN=3%9@(lhB%Op6^F%3FqR731_d8kELmol1}Zr1;x2uZ z>(eKS#9_YSD*J9uJv%)usA&}@ixnMehN|4|;eUt6J{=N!`D?W@y$ioqsE;-SgZhHv zxq1PhXpevw6OR88zkxA|-anX%2^$5IfYU07dQnH^A!6}hxHgQuA=m)L-3=;zd9^mG z&#Kf_>JERb6s!6X)&da&ds;@%8J=Uj08lqanc@K=ZE&`y8rXj~)%wSm!BfCJjQS;J z=|nN7W5e7gK_|{GVl+;%YoyN;;VtRAcqh|${-`Z+2n#}|OyP-N*ENJrMOayJG z>$ixs*W_Qa8(y-`HxmSFYLOT4WNw#^g#&M6Sa*9T2=uDgQx&%x&qnbtpNl|r9 z$vjAiDfe*6bbZAhjQjHfIyzdHkau}dCaLyY)AOy3%DREYA2g`Zbz4a~Gpbnv6y<~z z-@^{=2^~;nO-)=sYe1J9xVi@3&V`Pvmc~4-cHbS{`3TdyL{MGE5ei(J)n1*_)-JaP zJuR99ULW3dzZMY>JTq8cT39%l=sv#BUR-D~N;hf$;MQ2TSRoP6(XIQ+dAX~zwQHK= zj+mdDFDjbr%~}~)kd(i&q6nfgY z>b|0_?KtZT-E?Jke7fB}db}B5_PH4w4Z3*K?d9clHGqCdWaZ9tUMZmpfTrZ|Nq0BO zUB2)NX)^UJ5)5$uoA<#t)4Tsc5o(y(C76I%(=f{sW`rXgG>w7FjtQwK>*w&`2J%(N z;^!H5oU`YB1|&#tf9$pod&viU1_+T-3uB8HY|$yQImmef3NzJw0R_w_Q7fLg5`X-} zoVr3(mxv>|M_#s)Jiso?LB1Is{v1H1AoW5qgh*jPg85sKOa$Pcf*vnB06IiFq@8sv^@FJML z);h7oIRJ_nuKEsY1e;CpYc2Fr@vTYCwKq4kE;77SBQx1@cCm2llzcyCJhp{XN=bQU zUvG#N)ye5K1A!Lvl81!!Q%(AbGlsHz^1f20{QVnjp@gfhJ|P%^cJx>5p5HgtRNT0? zWvNu4ADgPke7otjh=y?k1@I3cQ-b<9B3PMr{~^$c4kXWJ7+`xW=(ge zS2gbA`Sts{EE^v)Lv73Arnx?M`)rQ82iQ^EjL@6)>IrX-VLS%{``C$D<#me!pquXx zKJ>jj_Is?-Z)(g*E-->ABHpo)jLdM(p;Ajc+j8s%B4dl)Ns=aJw*DgV`Q@DwVyqMG zsXo7x5hTN1G_}RSWMbl}Onf0M8MAwl?m$};k);$3U2^!$SJDT^pDbz@C3VYaWL}{3 z&{L2G35NAEJ=ur-x{wEiDO9PO^I;R@^V;hInTPXD#%!ia;~1FP{{v2Y7zs=}e((|O z)NLAd>~ainlmW@h1;S|F@8tskM+|l(ll~ijJ zCll*$h%`U&P~~LjqI-WKsl(Imu5}sX`07m+`bY1EZPd=mzO_j7r}2}aDJ_XrVGm-I zTHNZyv2~2z3U`vya+WG$<|sUpK9X0JoBpluWtWZ!bd-l>J^ei;s0a&ogYJi)ehYnV z75qED^xVaf{yE)!U(jtOH$&iqs7v78CZ#ca9dr_dL-YwfzH)PKb@?35paN5L7>$?P zTP0{>KA6zc(PtTL`7Ci)4e$4C?pro#M5xbs`LHO(%7>}Tf;vE0UwV!6fr?QhG#`_s zdh`x!2_*d7j|)vYgnl+W-4F#mEur>Gr{>suA>TzAf*v13Yg=aCJe{`$?e%Ys&Gl{g zcfq5I&4}2L*wgNOl8PUODhB|{p$RQ&T*?hT#(ozBWKDpu&m{=?Z+Jz|joztawPRAUb-pa>D-6akKV>NZ!YAU> zxc>xDD?B6NJuzm(k^Uwk4u+5m^y%aBJB3W?2G?f&1VezY^Gl=@UN8|$E9L_7%tP_O z;r0k8V!XUwZfRL_WH}NJ3C2?6b=A=I&1yat0`~7!3Y8m@J@CDH9;cBQ1Z^{lFY-HF&u$O0 zpCiC9ooh1D-PBGoFUQHr{@24l6}r-A0EjRhIqV6ONcP$qEE03u`4W}x7~YvK6pYC` z5dAytNK-Dw85mG5l4nXfI@*D#@-n zO=2m?@Qx~BujDf{f`Ekj*LSr9s|VQf-25RCb{r8=zu#<&%iq6U%|cX!hACF*d*1EY zL2+8l{b{P!z}e#?SR)qoKub)@i#9#9@+PA14Q>;|aPuIzPZxQw(C#+TqL#0xK5 zZ~8E`n5Gf;gb{$gq)-9h@J!p=F)0qhxXD(D2fhw}oH8-6bk>yP2RybL1Fn%(2kuz4LCaNhGukFYPRse;;p&RG-2I^Qxoz6Q({A50gO=uI`fODdR#Fco zv@t;je#~v=S$-*0FoV>a?J{jYI*Z`(fNi z-6yCS9HzCu^-Xd>Fw)1v_fS)qBTbihke4T)7wK3fW6cwW=r8&fTW1Lj`%_el`p@Qc zgenG+#oRCOf_c8YK-zv11o3++-U~X9bMIKKly&pO?w5lh>=lZa$8QVACGL+Gy@Hk^ zN}L_)_GQvkSxTqg%1Woo0zy_!L&#jW{-)=Q3Pm`~<&|1_UePZ5p7|}CEYH`Eu^~WO z>T)b{=)V<t;(=h5QYizEwe+qb=t4wssAUf-ZWlnQd`2y( zUMeOU7Ol}ULxey6j+&FXnmSNHd4g}4lU9}q#$aAaW5CTwW<@OXCBoQuHGKAH`G~x; zUQ$d<_=BS=>$dUtn3fy{Cr2@_?Qk?z^CIvm)1~9F=kDlvu1U&6mq`tprB0z0;N&tM zlcTgnIi>gOt2q5pjmy&f+|C8wSVQ&daVGbYpR>)CzsS?|iXBLKHk{BG6G8^>%P%>% z2qlI%MNT3}lcTD53(g1EOM~tnafF(M9%qAY2bO(ymIhSga_Dl;vmVxtca{UscV=d` zy6;1m(YGfCaqkU_pIORCiA=7kq+K;Iz8nubY&UwktgSLZ;q5=Dfcr~E&oro~gtt9z zRj@1)Jjfdy9GeD$W8i^a*~a{QNHxKUhvtRx_CXm3ad-;Yit>y(MZ%B!5g{K6o@<3I|9hosPd(D_3 z5e@t~2@nU2|I?D9OAEk1G8SS5bdu8JZE^OpI75%EXsz5TC95H<&^XA!>3Z$Lq5Gr2>RD%NY3N2$&qhO z`GD0!sozhBU zZ8NvI!RPs@Iu!Jb839YRDKTl2GOLeu!%0alpW-yYwuU3j0kN^8dEF-uM*_WT;vq9{ zSn)#&%ynZ78(b|MuEwAC(Jceh+r!iL&H7fdOEaT4mXokA4G6mA4v^+gg5B}HP zMto$TuJsYJVBbWBVy|mK!^`T~!==uP?`NJ){#P^E zp$#z|hW~+c8N}vvP5k`*HSy)1_En!+ZsEjT}B)6OCK!NHWY*~#e%H3^Fgff2<36-`I)dW zkkoel6sU(m9EPWMhVF;c(Sx9~fuQSC)WXwo-)xMPOsn71x@zG44rT4%_N&F&BNLU9 zIIgi+w-9he1Y7G@-O@ZR}0|prBb@~38ATIBl&+coo67M z@7Kp8MMIU?p-RN4)e^O91TkxGTGU=e?b>@st*E_c?d?ZuuiC3NMb%!lYd`tFc)ay0 z+*hvqobx@OPZ7>pRn=I~7}*(geB+F%WN-AZak~@PL@8HO8PRe!832STZW4Zk4if~C z6KDhrLJJx`vp%0}*^`O~L-1tPV3ZvN3kt=)Fas!pcZtU}vp!B-YX`qYm-pR%+tL{^ zEDcIiz|m<(fr`X6dwA=q(}`|rz9Fim%PO-R23gFiHt}koq$^O ziI_#hUKAABGf4P)x%+r|Ie&I{{_OL)+P~i46F#8a*4EbC_bM--aNn*F@qo@>d7f-w+J7`O{t&{zp$h%(@wk)zf8!(kPLu%_0@ zGsQRCr#W&mCQ+yiX)EQdT>c+QsWMg*7HZ~NRQ2M+M*q!XPU)((`3!W2uuNU=NX8)B zs_c!{f!?cZYzua))QCM@$6P$SYS)XB>77~T!566+vZ3JzmSV$UaEGs;}YfP?5fN*_A0=|CLpn{p5QP4${+ zf-nX7HK)ByuG=~LeY@`}(kdz@md0K5qQ5_JXehWC%lygOKQwCpF7&V(Y>eLc!~;1v zI^x_Oy)e>lD${oR?By(+s#RwDunLZxk+pl#kHz#9tn3vU(`sPnO1BF9Fck{P$ z?Vpdz^6$E%ht}&(F|(Dv>%Ev~t!u8@4U$nyU$8Zm^IJL=Ss=h^um}?tO!+qlrvt|T z59hD?Y?v?KnFoWmp)lK`;R^7v8jQhc#-#$jO z5#|7*1P=b3Bp{Ckpkx~XQ2-M}kk*ymvgHxVFW&7Id^x1t0LPKxmofz_I74No5t&2L z-rVgAPv0a|GKr~ER7_6i=e$j_-J(z;149w&C|sh_e_ZWV5x5aGH@+&NHHS?YZ$p*X z#De&#N@A+XEWkuDZE}K~H8=zCsIey|Pa0lIgia$v;j(9Xvd{^1L@ZR$sWFkV<0?-< zBT7g+UHzV+&$>e60tg3m$L;A`Y^8N;@>F~iqev8W0T^6X#i1vP)gvY9lKE`%he}_q zLaNJmu}^`ifXl~9dxxdv<>tm3tZ6paVbOE>&*;V|{53oTLR$UfbgjBw90FD!Kdd^K zEy;F0l-B*pAeN`L89*faN&K98&#CScF` zJGz#q5Bt7cyW;4B3hNCX|WKJu|$g+YD-bog$6V-a^wxw+BR34 zb2%;QP$%x>mFmJjGkA^u`hN9Z9HKK+7?8ph{zc@~MKD`F_1fvf1R-w)W9n7}ndvTI&iL zkdzDi*m=|G<;H#*wQvg}1pL(!l z8F)pS2ZN~3)=+p`Mcd8p-HPw|`LlO#%tx$9+U}>Vvb}V_yFC;xZS+&uK^d7;{N->c zBwY~s3pNZm`kJaym76c-LZ>l99QYxwS5s#%a*D*MzR4nGcnIjfeZc+v_hb(r)9FDQ zQegR28!Sa4MffE(Ar3#JCOSXBeJcBpF(nJ$ssm2C7T3-aMedmZusnmE%!YZ|%8@ES zwv*gbOQ+!nDhihrt*Hydp?J4D(@UtN^i+}eM_DNt7J#Ejpss_IQN^`s%+DzYb|@~r z>|`OW;w#M|<8i0u#Zl}a3N)5DMOR{#rAf>(DOy?tDN|l=rWwhq`0F~%0l{762ALzQ z$O=dH zhRLsGn6-1tI18k8-sC<7NX~Ww{=#tylozuyGn=%N-lUCMLKaZ)5CJ~7iJ{u1!~H`F z&t^=M%hp9^!$iscrPQ-9yY%3R>xJvNB$+Jg^z=7(M%Za+wa`}S#U&(1L`#+|C{JUq6^CAcdZe1Q1Aj^ApCOkGzi!(f!b#VDZPvGkbUEQ!b z4XwZ{^3DC35g)6^NF^jXn29TCwdG_sjQ2u5bCIENy+CfRJ=jMDUQg&nsc$ zidsm^y*LQ7*HM}66^bN{YFWl8NNP$;T?4L{$?0{smLtKt@70lb!(y>^i8cQVgix72!jVrP$H@cr8s)z7v?O&xv{E?9Z+(f*_F{dUbz^znjq zV@ehsgP^h)9qJWUpva1|H$UG}aih-|sjd?6W2`4PhgO@ZGyrxA<<4*-b=p|O4j2}e zEL!tEJ3I51>698Yn0Wh|@$L6Q-QHyytIV(VU2p&U`*)yI(z^TeT(&B!V>?!xtV%*$ zd@A?iMc?1Drpoq{+XKl>)~&7X+8>cy+NXmf>5F%M6*YJn6=|1k_q*NwsS~{&kZbh%}qfX?g zdY~+_);N#kajYkw>#!_qMyi3d1J%VoMB8e8K0C4F80bk0=1h4wRMx*%?b9-<=6vrv-4e&_5r6 zwZ3b-EPg9dJWJDsKDSPR;n+2KDpzcCP5@zbrPZ+&JtDX^v_$aNMUG3=Y>hKBU#I5B z#Qk|H_HG0n=?#@wheA2)AYHW;!Q0NwgB8!sU$y$OAyDyJ6*WDqndK>Y4QwF@MA+4Q z8I(*8fbXtExPUzJ{VU0uJT=oaZQI=b@Mm@VNBDo@Moq(s+O6fbyalkYhSTL=R4!Fj zV^zM4`4Ba)FXi<8K#kYKwW2r9wyoQL?0*Fl@&^Hje-H@-W6bJYHZmMD({WWdT?|IvL$P&T+Nz604h{B`CmDsTHTYVE`K z8Wrr{*vmqqiI^{Byl-`{ag?_|?CIk0Mh{Xx4Ar1-gq|_~=ptq7v$v>&SK5-MR4o57 zrlwDpAWusEL&N};=Y%0U2>(v9YIYW)TXA$QJ8FL9|Cc_G=Xl@wdf{&Ni;9Zh^~H+s z)qFqp>@K%ly`S<5{SR&=v4CX@CC0wbTKVp_=Obd`4)3{gB^XYg8W_Fa>@LOzG#FUe z)T;Jhs3Lx*q!RJe*cG!ky9kZF$j(ycK5G3t*^oY_O8nn|^ZrCi`Krk*1)_AJ*;1gcd~KQ5Q}!Z(ZpwXf zZ9wf$^+We$jsf;?2;6dfpbG|Nn`efxN;Qk@K^arQEnSV#%kY_~AM zUp^2nw_NVBuQC$iC=^SN6BpicT?J2$fU{WSvXvt%oh9Yj1=6%Mzr7gAYp(H(PktrM z>h7*l(IzguVqko;?${nls`83^cJ?}$i@~C|Z=r>x=3FvW%#zFcvV^8u!|pA~ghMf=!BD)$`-FvD53_YiA4#(hddVm2KUyo4TV9Iw||jmn0Rq z^Hc<9OShZoH+OkO6mM++JH5Ei+4k`|T7#}X@00d)0WM~ln0d+maKSJe#xt~heRw;4 zRW`e|w|IVWSoy4Ff~3Sm-0otr+spS6ywb5UxL`doe`_pD!s~X_r;#g4DxNGC{2PJ~ z8z-*?YDSS?#>i`YNosv=!T4J4O9vb;J3;p{p7Tqj=EW%>9;PLJ)n+F-=gok*_}zPX zaMrcX_%(T{e zC_fObQ~a5(!_UyHl(nMKdzKjx&zJjq)hvpOtY7>~ev{>SK0~rx@q`?XrAgV&?^B5o z6FxbTl9G?=2OjAU=l%~XJ(O2}ry~m71g3(jCE3xH8I0%_E;n`l7bIAFTfS`rm({79 zRjj@GHHGw`tA&e?PgIGiVw8M9h5HQUf{48m{dec60KNb6N@>lWR4A#V)09BDd&C~; zZr;}9FD&W8{phZ98E&^7XZD8n%9b4xq5Ky5l+!x{!I$D#Xg%bxaj~q-?RC2E?L@eY zesq__{c$X90msWHZ^|+!xQ$w`FZQa4!|#rdBVF7Z-g6~K_mnHNH)9KPs_6Ny=DbVk zMK>9JkuAhu9%4_A9|5G$un?Gn9;re8^~BLlVCWM&3KQ9dgLjS<`us_t#|*#TzxTO6 z*CnBPk+!yY)Sju`TW*xYPCeB7u>qA=dAU3>v3s@NzbNhP>0+1pTyo~_Z*N&Nqk-y`1Qh|y%>9rBvdyF5AHYrkGT^1Io+f!y}1j`|(n?&MXjyz%_Rm%ef? zJ$niEL=s%_KZ4-7e4;rT`}6)TCI|;n^T)UZ7fcG4eAGu*jH4#cm7oTLZOFib417+= zp4Sh@p;gPiJ)NAR1`g`1h2>Afg$)8bpU;y5S05U~pUSP&! z1W&x&3NR+XnKR{|af-<07x|nBKuRQOoEo4*spZk|6r)T?)Q8EIC>WX4xZ<042FXGV z9fK+2J&YlqQ@6KwB&ZqV+rI}6+s1~53@wKr8$=u|3*jW2Bef2q(u*WB3sb$O(|n@_ zq$VmM1t%;}ZrQ-NIQ5?)lhQKCM8{YfW;m1D7sJ|u$@yt#@v?NmDkI;AWkKCp>bt|$ z^4}2R^yQK1r*iU<{Z5c;KL|d~!~$bUqZm>5oO>(Dx=A|;9PPGz>AP~?CQ%>$PB&%a z~7AdiP2sa|LQfM50blLlH-f!n944MIpq1b12fxTuKT_HTq?s2c9mi zK?uzd%m9H+nRBqZ7>t)o(~9AeLkpO>w(g5&N%To~_T6wen_+Zkz5oEop1?|Jidp^| z9a=l1#lln#U=JN_z7jQkW#FPjkl8&MI+5>EY6FxX^lyzJwL(5)1)Le=MLc&^@FtBwVijXX4c?98{5bX@)%>gOTqJP$S+66GFw*x=5f|=;SJMhfFbwg5;djb! zKS-F#PoN)NR+hM^QKdWP?mLH_-TlsGySIy*w$SWwvRuF17`?>H(xNAUqzsvK&$*K^ zZO=4Ihb)`l0}`6`##S9U*lk6iS$>vqkphpxFKSmfJ5$+F6ED5T z=)m6ba8?-(oa$A5XWdlilmh zYX8fL;Qw_F!beOQfWSVG_X>FcYv!H=eL#ScyDkALfIy8D7mORh1NVoR;MN3O`|&W4 zJ}yYtfgAshWOO%W`ip|`^LFh6f#SSQtR+W84 z`*|LKQ!Q0lg7hC=9M1;Zi?=W+Akm@`5y{5L8%U-D14xCSV_$#XlabA+{FM>`lSjaT znsF|rv{vn+&t#<{a09G`qW$CJLQ>IbUt@BJ(I81iR+FTrDgFooAqo1|iAfY2 z(#CcbC`%wC(!Rr5IVuz@0EQ^M>D8d@-SIj8V=avT;9=}@_4~q|sHV2}#wzx!+v&z$ za`N6{8D?a}Z%XTM%1Tv2!#vapi4r6+5k^%6LMZ`~j<8{Bp3_VX`Oe z%oQbU-#GHB1BlqwHB)=J0&;Z9>%~0P#Jmd1m4Czq;U1yeuCAl^s@fZ)wK?ANzq5C6 zyx){~=yy0X#3WP1G!!&o!|M5<44np-(fN&u2`q^CYUk8Sb;bX3-up=0_reFB&14b* zFN!l|y(#R0dprkpc#{AWq|oN*nF2Cq#_9!jjR0g+myqkSU;AP;h>TgKfFkcVu7Qci zw&UzG`-5?k&hW(i#C|K)EQyEzUQxH-pI3?BbX)n~-qv+rs6>i>{_N~?^7nY%!xXi5 z&KjaeQOL=m;f`5+Sa-b7P1SC{?dATW%Sp9@eRWv0V*w~0X|fFg)hcKA^4PAOm}Rup z$pTz1KDW)0JhDxqF->z-93GZY?*V%l7Ngxq8}7zQ2Ks+~F%!IC!@BM=U}mE$?>{!C zS1udwH*Qe>H}d~kfT5|!{wH3Q*#ElAqvT@V}d(-JjEjvOd}rF0U)NFaVL?ccnJ-F7yI}R0W^meR?oEk9t&#DV$Wdfy|fQEnr>q3}$b8;k^djbZOp&K@# zL#gNP#uuFghhd4jcnXZn6ta}3#X|^yEGRTiK7wfLw>W-?e94Qi()VXP9Im|6bgYw* zC!Dw@WJ=6YuO+lTm40VrN(&*7!O2lm1BWi(={;GA;t-Ba4*@qQz2+Qnmxe1z7T@ae$Shf*70@lV7eDbVewtU}Sy8`lQ^5Avnag6Nl;|7Kf^#oRPvon_E_it?{vCc!n>mga zOzjMnY_h={GdjQ{LfDhHAb1fdKq^7V`M1*3Xm)2)*x+$J`gS|K?P#Ifgs$)2;ieah zW}iP2Y>nj#h`TKTtYDe0*zz)r*_@xWch!stm(Kki3da;=pML%I^4+$3_w_Eu|KG@n z;7Vot-Np5^=Wh78I~Kk9v8pnGIbYjiob&I0^mNY16%6;?Cc$KN<6Ic#y=D1gI3bRntJa z9N>>s76iBhCsaKxM4+mg;UWA%n1NnCPFOVcL;7(eO=?c)XOSjhD+U@FC@FjVO+hh$ za1A&51276ij(9fkFh301mST3?+abho&Gm1_4Z*Geo57xcl{+p*G1V za^^=z7~KeToMik2e$t_)7CR1z5Izy_^3|HV?Ng|1qDE~PedSkeeG#j-d$*8`iRdD6 zBfhd00>*fqnG%SZW^!~(TC#;9dd9%4p0(oX<^*{_*9~a96}2Y5F35i(uNUS72_k{J zN>lfZ6X)|<&TG+``_IL+&87|Jox#rzOniOkpSy>5uQ{}~eg6(=nOHDAGyL;|$V`x< zBEw}y1V$I`&|pCKoMDV=sJHyv?xgkXaN6{)kYEy39iB>>My)JoA;k_PAH<25`0V{g z^@&(1v$UN;q&zAO8c0T)d zKGyGgD6#)&Cl5g!#X=lz;@gbzscU~1d-q=&cOnV)iN6|fZvIF$n>-s*BA+-_$p$R; zqthuSA>8^c^lQnekOI3EYgLwSD=t@oU5fW=BVvq*K#8A;>FH)?eyfd$v^Y!o{kiG> z!1zvLb8UV1tfsD{F{`1glkJ^w2Jz3= z^+sF`Zq_J`QVzq{#_S2T9L{SgX5)%aazO0|QjfswXzY?9BF5y*fL(^8FHVDqk#>Es zrM42(J>Gaj^u)vx_xs|(LM2Op;8vAKy7EfX%|Ygo2+qHYjiHT+o&3in>7`d|y+fz7 zTbL1dh!?|Mx&HTuPH#8ERv*u{`H!b9W6h?`@2z#=#nZM%KkKHui>(J}2$Qa_Pqpg?_63rk~@@`>H^gO+pg-jHF1 z|Lia$mWx_4vm|%!{amB8V883tKl?jVx?9w`O?xxpAwoQy`Po@nA~|E&FaFXublP>$ z6WgZd#pf-Zo=6#qH@Oh*O%a4d{+$V9$L`CJJUt(t$N2(WJ zTDcff>sYrhp8E|?NDNN7c7}k>yO!-z-|I4u=j-81(SVsg1d_9ofv0a1vlAjnYv)5@ z0c-@MNTO(|v{#)peDTpgJb^%T<_953_SYWHEmAIhEljxPcqO%-V&SqYC)0XGOwUMh zC_p&YCKP1M6pU-$4Y%z)Y1)0rU^cZWuI*opkzH3&qapMYfy~g@_W%~=1cGRh+ysy} z5epkYsUx5SkAjeiH=yOQGU!jnEK;B~_Nj6@z840Khs2i`b!INis2QD~)GI_Y?`U$N zgtNx_dzR-&#GxIvm7_XkGWzsYI!SH~E;2hIp2BvU%JzH$GQxJd`r0fi(jWsHJ0||Xnm4sW^dQx`FHrGu> z-ni=M8VspU9r=!}ndKPj1xDvvIChKbWe?on1Tq7{eLcKg>J|+-H6jTDyXKzydbqey z<_Y$(Yrs+K<8V2K@72&jEj1hpGGtO+Zb;%eK$4tYtsrS;5L$ZssscSpi^Jmd9n*S$ zeY#T7bR#|cOxGYJ_bAQs;%wQ9O{np))%M}Y-r=UL%kl4X4`cuP`J?vh-MwvJqWhEI zdG_99c8(v0t$7FB`&Iv3GF?UmR_leg(HZTnsIyyN%^O>pwUMqp`fL9fdru8GnAEDipduG zNueM;J3yc&Z{O#mBq^&3*gBT(5wp(5rMQSrxV#&WO-`=5yzz}tAWf?L{OS5r&HJ-E zo^s{uS786jp#Pr2Tzc+nSd}MZ7#m`IMv39F1=wwJMl?P=-0L<&g0Ex9zY!8>}lY z)0hQj*P>zpvLYXSI9g{Vl+*(R;FwxAGBM^nnt&$uJYr0D)@KU>1jzg>K+D5@`Jf4G zWJxFR278Grx<}<0hpEO)25n#}G0UKhQVc~PP0!NnCnvWoFlI>#2q`Qe^*)^IpG?E; zcE4wN{If#+(I+rkig+Y4D^4zfRguvXOo3VdBY#T3Iq9eOnVlJ_o}%2i4ohX59&m@%b|$|H!U0Y8db+d;XfN-?s- zyeJ-BF5`8Op_QCJPRwsarDThMh7ln-=B8Ro-R11~A*tQy7o}HunKz_FN|B84ywaiH z)&gav3r|2NLVcayBsQp%oUBYPDsKj(3deB1uYJRV8g|{odv_O>7~%HT);;2=+=H7| z2ApxWT7!*H?zL9+#G;l9u{H-n!U1zZ1hf{*_Cv$8q9jeDLJE?wON)hs>w|gB%%LC9 z?iS5@^x0ybTUh63S^o6EP9!I%a#6L)Gv$cx@gon+P+9cE&33nC-RZ9}%aQr+a3m2s zrNuWs;q~&DX1^g~d3x*LW8p<$Ihp3s4D4Z5Bv+Z<5KSANw)^TM4a_oU61Q3nN!3&w z_LxmJzB_e1YQ!`?Q`SfMaqa0(|J?8qxL(_xzKV8i$1cilN!a4^Ka+6cxXjdiaZ_MXWqv{IC5V++Cb-N(g!Fz5n|UGmYq*qX<%%d)j9A z?x@=fyIlB-DBO4P@W{cTz7Y@?bmWnKxVw9}TlDDLiYIXqvwh=UdU|v;X#t6!i(4xO zqqD%FENf@C{BcIh&CU5@_1}cq(OsLEwb@<~Z|E`n+;=6$P=bh&Wj#v&byZnklEvm5 z&!g}flFs02_b?pI1oxFlsO>VnyWwmRT0`+*4a#*|R5Rlol)krE^bIdSKB!nr-L7uCVg|jKsCbs3$KJ@1#KZpd)myXjnLgpB6mIJ1>5&n`v;PU9 zCi@P(tK{L23$+Y&GH!G2Vq;aZzMr}}xh~1x-=FOI_)Zb~?kE-$aqvc!Pu{d~+mj~F zDrT?zBFxhfAy~n_Nv--uuoo(stk8K?j1*hN1~aHVvlK?W_xjagWZNl7_rS=mNfN*(` zd(FFIJok1&5n(}962SZcn6*n0C!~y;K(UP&_lViQ4B*M7N-__kU}J65eca8wiwjnd zC%sVRrO(#c+IL&th;!@)UGg3# zec6cpbpKD_bj!EWe!2eWT8{b&MRIlk=_XNFI;%Q)sbij&^vv0x{;ox-XN-)jYXq4T zOrJJ`rGMiB4R*RHM@2~4qcxt{qe{z)KH;OtG%DGy;opVY=j<={~SE?10*s*hKH>(CbJuf~EoMsFSx} zdEO#kTU|7CUJ>AWuy($8dT>D;h{Mj_ZSnLpG?gLn6kvg(zbjN-tBk!dyhLM z(fzCZyTaYlk5qN@6E>})*Q?lQ;q{*va&pC|*le~Qn^`93=4oMBX>IwQr6tNu1}B2C z&&Kns52#Zvn>h@O<+0TDzvu@@$!qIF+3itKYcs^}gYyjsk2gd&{jm&;95O`?yOWgb zb6M^8YvI%@zQ^-c2PU%(HwTA*wOF>efwJA zbNljPOWSNzRM)=yJI%SeaFR^U`e{Ww`=1lR;TylLTjviOF;n5iW7*<2fA22+&W`&R z{<~ZC==5G=gAt{nRr4sdWXL#w0uy*`)|T$aTc);qs|{knI35M+jKWBe?Ri zD*vFn4_VmaLKIkSi2>ujmeK%uoT#rERX8u@6)p4BnVA|>@xWpMrclyQM1UkS!w;MQ z(tHrp9}g=e9HqjJ2aBL$Q`YlUi&pi|O10O2PhISu$`%-cj0n@;qVX_V{w>BV(Ufzz zVq>o1$4F``CCeCsJKV!J4Lq#7{462(hzcPa1)Z->$+h%cw`Ht)0tQ!@L!Zflp<2L> z)Ef!Pd8X=sKb!KS1ne-d0xnU3Bu@1wqk6!m^L+bv<3C^U;{QlH8$iu>t#r`ftsD+! z7UpJip1X-FZ%Ic=xV{hTWg588P~vP|E%~suuK!`x{5f@TXnnxslxY&w4TiSva+G8pz^e?SWyQts; zmLA(Ja3@!pwf8jAUY_?SCl`Z|%k8!Gmdd2YQOcQS2uo1`1A0_ z=NTwgJj6yteCMdJY0N~&?u7{(6<`M z2g7H;{a3yC{Q6?N0q!JkLnr+#EL=4^>-){w?(MDPLsk2BUt8kb^;&E8{jDtq)7q*G z3&)<`OJ6!^BGUgz+RnwTccu6HKFQm-2z|U<#MY9xxl?`kam@QShZno&?idxe#Wqaa z=hKt)s)cSN;o=JELbSG<;m^~n`O`}k1~E25tM?XrwdG~tAlAYPQZTGu#_3@OIWG+s zA~uu2cg%FDEcuv=W-VxAIBeW=ux@3*tzmnc-%$ODOl9fPaPhhP+Q`VpxCdt0%iANk zq`Z-x@CAy|=X9jW5j&0kf2u>%qPWgy~f1%dCf;e2puefP$d<5q)4%T!1wW5QQrm$SquE=fb>F4V8-HO8^7_CA)ArEOZZBp<=Q1O!9rg zaUh^Af)ktS4f>uM2Sh(RJ=NDXB${eB&e1JM-08s`=zeH|TbPF7LWtq}R79Hz{ zep{J%9Q~p(WYAoJLUxT^i0P6>DQ>46pDM*U6X+@OwBy*X^GO1W!M~~$slQYw!~vwQ z+rpS&O#k`!nobXT!9#YEo<|MKEklt-EkGu-PEjIK@nXhqm}S3@ov=)2(Zn zG%&rz-V4-@M#Ye1?N-}eCy>9->E?#l&E8Sl&Hl7!?$6+j+fLIN^p{ZK!lF;1{7Ej# zQxr4o8XZ8Gfemc6C~C8Ex=*eNmrJD;U>Ap(_P11eut{;$n6BHR-jZx9tX} zMyQL7dUS_no!|NIH_~Z zyp?P|f3HRa!i2s&%3~``NllIC-3G?92}0`prEpot#(nMIJPQNlFx*|uu7ot&V^rQ9 z^yegL%ml$M?l-S(n=p1Bi`@=Qi%aL>(zMb|EB#;}B}t*9%tVdApTTu?a%0*4=U5@i zgP?!wFNg8%-eV^Q&BxzJoQN0;a0^7=axN891jw*+Pev2Ti^P{mba2scoRI9EI4(u7x{@r$1XSZx~Gq;3E=8Wl`vxHDEc|+7@tP z=~;JSiKRx&`L&n-+z9ns@?pbsJ)24b`r+w-H-KoRoPaFvRLesaMu_DoW0tB0nz-`vHS zZu!3X5?Vu0@GP9#!viCIWA4_&{yYKHmHXyBgM0GLqi8)dlFZnyn_QChxo|9{Qd^n- zLr?)uVBxdAQSU#vut!}H)RZs>f2>@$kqwla3rVh3h zzp|n4{WK%>=#Oz7!m)L`2N*yYNC}Oz#2I9Lx=Dv5&EPO~9n+KrQ1BoEegxqP&HJ%F zBP!V0Gm+FG2vxIEhFbEH@C5OQXwfW_%Y;}X=^~%tCp`gOd88D*s+7_oil6`kBk&Q> zn1CKGte9lIW*(1UCg`x&f?)d35)78&!+#|QLP69;74A*gnrA_OI@3WQUK1dc6z>N> zl8h~l`tWlzV$G4;2wO??!euwbVx1t4#P<4g+5Tsp$G@$`jqlIqPZ=b{%XUq%CM++P zn)&_3KqRVb(8lfIaZN-3q@tMgo%rqPRhDwrrSZg1ON^YI%5~jN3}B@%6qor?Sjs7w ztYOA;jnqs_)-Dh72)w+1=zcRp()Mkrv{I+PSlMt<%D%}XAx~o=Nyc!Da4*B9NpLpX z|M+Ia5*y6$@=do%=`%1J+4fcHd_2Y;X7r zGm0CoURg5y{_CSa9!MsZ&P&1>72fvD3?yCvCatcPStHDUN#<;d!&S~wk*M+hKb1ed z9ul|LNB0-g>4FG%q)FbggWxq7=cWe*Ru7tF>JksZVJ0NXKMHfgB|u7spjqvD=9h(j z(Gkzy+>M5htYT8!4ZZ(s^}Sm5P)e(xnVF8Jfqe~iNV}dtRVA}kQ;f6HHbl!9y=74e z4CYlNC3GRe9_)3$FmOoSFIupgjaf`|#zN(}nJSx``q-Yn{>g?7QwzvN0UkUq@%|F487=e)L6$S)2#`C`Oab53ZIA71F+2=rPG9|dDUp2eg z*6D9Pn^fKpc2@eJOE_6aITyD;dSWli4E$Ab5!(#Hjl4XN)Bt~7eMIQN2>g+l&t!kr zW=}dU+>|yF1|D^EATL4xt~|J&cxP7O=CR!2=Q?vicj;R!*$Za6fwNTbyR41eY`+fikE62LIiUyNGAYL zM|g6ueC)>)1h_n;j>oB+z)Px@#p9ySmD34|SS=QxLgQ!wfl9c9e*>n>VK7_@AREr} z4^oJM`pqQ@GoO>Ad+L{@q+}dG3Q2ruDpza}n)fP1l8HR{#mg?mPX>H2oC2bP$0j%| zY>EIdd6Wrm2reLq7B`UQ^(P9l2r9*?aP`Q9M5H{I2*IN$7-edtJe=t-pnw#Q2S;lk zkA3aT6(=Af4+r&$!X%GWCQyJ5q}{l-)U6aR#59P2=LDrVo&a#U5TdP_fjl^b-ON06 z#USub%AvA0IkSPX2^GIQSs)?X2N?6llJm?q8Vk9Y2`?&9;q31yh|0gZjWab&$!>q} znb(S?DvohsFJ%4}!}NkN0De|MV!%!&M6}HFMOpv*&Gtlhetsf0_mrMWq{S5dLpX;Y z&+TY$RNwre5gIl{sBKQju5|PBJ6g3X0~QY}l)|dv;3&pEw1$Mcv_x3vVwbS4&*j1F zivP{iVj<&KhmB2W4NUC)_13qg91C+@7f3P&VcOXl zo7$W3j*BGf|FZxZNSsX}cQJUr2ApL~A-S;Om9uGAsVz38)G6-uQ^w|b5S>G%gHgK* zmxbnKH$p+ngyyqwRoUR(PWHp>!-)UQO7r}%j)fBZpE?StA-kh=r%4<0iXu-ZjWmUv z%u6C6N4*EA7%!!z_%`am!V~p_VWmb{vzqJf%HMT^6MUl zOABJ%g`3zkzP5g7#KUd+%92qVjj0qzY3cXY)(ggS-*?&;nqyXVVZ!zT>AG86NU!Gi zfCyOY${}Q+C9gy|;#(yZ$teA|B2p=}9b!q-iPN_oE*ldVU_0+{UNf0VXU61MC1b3Mizg^!drj0zHXVtaYZgJLQ zk6KsPsGwFLBq9VaHx|X#z}eQ`;^~Q*=p*uNq8GsxwJl9|Z(q5TeUty~6$&N;+?PIj zoGnU-CnK+zugDcBtOn~)Ou$Q0i!h;>K@jNI0Ct`i5$$r|@Ih>WsXafEmbDAemtInXYGP598ZjldQpaOXZqs4^`0{hLt4q*Q9^aqS$V8Z9jO#zI#{k9^bjdNFsf^^fKCq(T7m z*ra;Ws7M*n_JQo@J_Npv#ez$XC;@J6@)<)0bFiC;U>T61|S}(?<))&?6puhDYs#lnl ze5FgZPP*C=YsO8ApjbE{KqoCC<+XWVQmCeUlZW8UeEw8Yg9=lS{L1q%zcHZlYwjoA z2^ZLwu$-mm_1ORx%r9ijb&@e^9pkwoHRwIYUQ^AJqZ5VxWKPVLA>{OnNOhlNmFpGG zDuo$}@iQ1~iJ(EA?!&hZ2dRwYYdznHuxlg-ql+daH4_u+W_R(<0O_S3M?JlGL z-y}OU-wj9~##qBM4*3m*2g)nTs1p=uJfrVFUycC`tA1fJA!K}*#$C14$;=e-6_mx^y;4QNX_y<9E3m^7c+s-EhpQ`BSELN*YvY$p1x|FD zMC{j-G+-y0z!DkkY}%Uv&09AQbAsTjS`QU*r0c&<&xPj2d(@pMfKcVRyg!lHvGb)SY35sv zASR$i1}`80i6nu6n4(C{yKD|4b3k?M%7Nen9Oh1cPd~u;-489Es+79N$=bi@EiS}W z+$%qRR=VWEBkd@DIP^Ew0(5}g`p(Tu9|gxj0z*$!Z1R`J-c^c zBA-EPwKu6}#$m^TC##3vI5wR}_u7hk|0nXQTwR}r^a&s>`B)%jGcoK!b6<4!|4fTJoYN>(@P2c{%dYiFAxeF*?c9V0tY29 z$eAhWQ)=sTY{0@jetC+-|3J%XS!hQyBg+RTA^8nD2CrXp@bxX1IU<;2Z)BL?G?Q`sdjGZ+CI*zInxdMsSueX~OHz+4jIx-bb_sz%*tJGAU$$5 ziWdPaB?PPf`bZ1w z3i^a%4nbf03HhH!sR3LG+e$431$D6^VY;c_-sZ{wqv<@u*?ikDo)G?#8lfnvBoQh~ zYlNaokf^;=d#{?UO>2Z2F>2L_QB>84O{r3&cCAvis;FICDT?CFmp7mDA;C91jtQdZFOI4clQSF~G>$h`S68;5-g{c?zIQ>1fIfV! zh2oYei{Jcr`DNnSp=vtPBumNg(2Gy|xs#&<-ofwM`u3|Hs5ScmH7zNF#_?ijm~z8y zmp_z3S(;>Wat_AS45Sjbo?9N2(;kUHZEQSNcLaolyoUW3rN89EvTXN?rCq;1^CjyTFf1iga|UC=j7tBU!WS7jm#Z@3GIaX#fVP7;tJc=E|Ca#ELh7iJdzYx5^g8$OSI3q#Kl10u5Va#AD z`y0Ptw#3RNErV3Ldhs3U7stVuZqG)gd{ceiD_pEczi&x2%*tyCxEQ!bN$6a}&rIY$ z{T1!09vv7YcW6NWWummAd2O<+hzyl{rYOAFK`VD}-wUA}Rj1ClW}ZGC;D^5Q)wUu) z_UjY1pW?)DRRn6l7wJsTL&;$ap1Cfm z3{<j zT^>3r_XYmhu{kC)z*Xyy4TUT+7BJ&;z>Pd9C!`U9Uu2)`3;wo-)gRG zZVhbMsJz^tWttBDyXA%H}=={Xu}f z8QzZifD&@JZbw4052n9>?|-`6Q*yk49=ynFd)9otb6|65UM}>a$?V4IaofpWtAl}= zx9*DqULM9#YqN>;ztZ%PpM3SGMuhoP$;5D5kgq*dvg;8Yq&tG-3c78_jEzubl{A5s z{bEIg-!z0?$-#1#j%t1e0f7$TB>?_>BW6q)3BaOCXNVG!(gx`g<4Sa{bnA81u@Kl0 z-v(W%35DuHG7wA5O2B8n3MM zTR@_Bmz&y;QHm4#@@&u{j`J010mq@Iz5pn$Z=}B@989a2j0e(ij)X5u){;e+X=KBw zZULNLC!3CEJ`oTBY2|t+EnmJQLWyiQRX*!U34*`z)fOmHQ6|Ruv|(W>h2HYvLXxYY`K_@b5aQO zn=#2)nxyMnmd1DF&>X$FX66uMMGHd?Ygk+ORG-KOwAP#lR6D?j12K=q%L8+JQxR8B zP#mrrW^&v-J3Ku4nik_&g)avIvODK;I!nKT-Lk)P#fusGde*cE$96=IFtsSL#0;BY zh00jy>@=r0Ts7Hi!>MY;R0k(mypL|Fm^c~%M9->yu0tSDC9v8?(`tvc^Nh!=Pg%he zn=BV6zdZRLly}9_s;L$u)yMi#2bNt{CjCr2zkL|*Fv*S!n?RSP5oFEMH`(x&E)$0? zd}`);uu%{HlI+Tj2K;20*dcjas?3=ytATn)E$m2*0(V^{?adQb_%Hf z2_Xv|pN>OXlm7q~CiTAj0HU=j zU0}|+GZ(Y(e4^HPJ?^m6<}y0*IC`nNlpI%78lfP!vee^j6dd*_W;q0HZ6iQ7 z8)~=9_nx_l_z`^Qubvur!*!0ij7{^(3e~kpogNujG7^Ka?T;IC`#N;=>usDlTBa6h z0Cb9et}gXop8-U4^y+s5Aaf*i>_f3*yIYr5VJZV#9}-ZK>7NTLGod3WJ-mimFfh}2 z$V#v4@r{OkD%7z1UkFQ%ybKh|STm}O0T^NcF-~l8)?kxw z%HqTFyHeN2H)`gC<#s5yqWa(v-;<-gyr#MiI&bO@}niWL7)VsVL$geP(Gv7A9V7 zQ1mGH&z$T{RN(G8IvfLbuK(ckLL!pS5$gOtdwiT9R=oU%Y4)irR71J=Vf3W5Q=M?((#af`>joZ}YAst93; zNq#!(>#!bj866sUc`>tDrlGK@aIvJ2d#e0r|6=xhX=yIWvr>-xDD>n=r|oREZHtHZ z_MJPH6wB(r!!@NJyosN_BqsXv%6~Lav#>aGRt+iNJPnYO5Bm43c=VyiGjBF#GX8jR zWnkdY<;V`yGG*ENF?g<`iD+G}hM=v!eFG2$rRS0oMzE~-&GL6Gq0Lsm%04%)l}u-A zuPNoehj4sept(BsyISE7d_($6cEiQu>C+jXX3qc)9dN$pgz0Xv-JTx0yAYwWz`BO& z0gD!6P)@yJu}?Aj^!aw`M0=L_dctX%CXS;e*Lw z3}vdPLl2{Jl%o!F>=Q_;y=~x6dzf#jmnO^?$A#giG5)S4TeWK_8HOmp3ld(t&emL>4V2rgTW8YJNE? zaYM6Uu!{V!dsZR=s5a%>UO|%Wbnj;a?5+7Mft-!cOK8lg@)9B{|n{Oe&*-cJWbI> z2C6LET21}k@hm@UcoWX88Ez(*bi_uAVL0?np%4vi?K#s&4gam>y}GEU*K~(3wH*xngq}mOsZXzkxb9P37owaTzHkT@p ziWXFiwf&jqG- znLa(hR}Y6=o*#=91?DQNCMG71q2Crdj3V~YTD$Y-)uD|FH~h=+&%Dp$r-i#ezt z*)F3rd3kpd$LM>KZdD6@D32||*}0oEQ9uNKN1sg0*mq9054QabSUvFLQ4HZz+(AQb zFZe=#E|a`;CUhDITM(er9t>vA)SuGV(w`EVBj#dZ_2;K8`{!lhhDa@H! zfh+1@kFqd?cjrT3ViE}so(h~@^pA-pbcO(LgEWk4Y9F`+hs%%PkT9iH1aL|UX4VDc z!MdJQ^?<|L{Vrk(6D>6Xob${=t_}r6FjLt(Jyt1<$tQ>_VTLqU+)lL!HgLlI`y6Vl zG5Z3(wDoK0w>LT1+Vfds_l%4}EieCNTxk?6yA9)~4}U1>q6# zsZUIt>{cHM5g~bBh;Fh6Chy+_6bVD2##$OKVd3HS@@Q9twIbWYMEg1&wRQwui7jnz zn2_imR+{qf84^+I0t?*a$#Ys1icNhb6uAHD+5iH?;|-w?hb+|YVE8GlWExhCjwEZ=(ooiIx*Na+t;Mm?D1@F-+ORnD(3srdL8XGsK>8Nd z&8JQDIaW@?F;-MQwI+$_uPt~aa|69}Lj6O`RemaJJ7*M9VSP<1AG#ad?UC6Oih+p@ zFa2FuYF0QuNxb}5b@}IP{@jnJ=XiH6Dli>Xe7@9srbGEj%6G)TeWLVrdBx60pX%VQ z!V)H%#HnhBMI@I2{U^Q>_;Y(A1AyhWXCDF{rAmzFKrRnpW4&Z=RCrs=h#f4SIZH=+ zisqm7Qj4?WGg}xN$o!`#0a?#NJ$*URZ$Gz%UUnXqWmF1{ijHf=m%0d9>)RVtV;vec z*S@5*%hBJxldHULZt>hR(l;fgOx?(Dy1~(6f!kv4hy1gX{nhSl#}-uC2Aba8qOL5y zCThr~x#j7}^qq@~`S(T{4b_8&sgdL)F?bKDAXY_9&mlKhU(D?zmYHtODf%w3RKO9b z1f<9i)vG%f3%{Qfr)-cb`=dzvcOvYrKq%I`sa>o+V_jkhH*Fj}Wa2yT+=cE0Ki7=p zHig8KP#oeft$Fa#)V;?>D6Xh{rsSulB2f_?v*X94Jl|aVv9a-~-@(Tj%csm<4I539 zRzZ4?$q`eP6O(uEmJJoTtK*kD>b1;_D5t`gNS|0m=876kH~Nd-R{(B92DZV?) zYn#4Kqey1g7kmcBcElS74^<`fqJW7898PW9rVp0wI1EmY7A~0bcG^z`b&1`3=ZVIT@!OGdUgm5NK3Pf3+(gTSJM!~^iE;Islt;;$ILh8rsg2B#{Z z7KMa;y^0uHm41*E?=Y+jq9UpSlMSyvLTZ;#S*vQ;098vMq#N}Sx-dGTo@w7jtOSuI zOlVCP{7rN7v#pkrJt%4G4b2;&lfd*jsk3HPeBj~XyccapQtc`tTAQ71;RAj6=RUXt zWdx7M!1@A3U>GGR5S)AsKbUyK`(bE-S($2YN8GGxA zHZy$*VHt{pcg_kqu*ZYfbAJ2!4Z+J``t~_+696p>28Pyn0uhI@DA7{Anr2F!E&iC3 zv-ZznF!uD|kIM&Y7Ja3{y7|XQHmn_k5qqYK__2XPxADD<@DN$$hXSe0$eq1WFopoNGM9*I=PY>zj%@TjvqMQ@fPqOdM#A)R?nN3l4HpZ5gE-r@Cy36wZ{n_a}bKZDAX@sACXJiz8 zVK|Xi=P=$tw_JTMm8O^EHqOvny43_0)8-2!h!v4H@VygFO(j{Cmi4nuA3_5Rzj@}~ zrnGapZH)m(@uMDR-iRryi^;PU)zqFp^DK~w*AYYIsV zhyb(;QGI`I9~?`K27q*hmdjL?4q-H2RMi9?wzRFqzj%-q0XT|??FVprprV*TD4if+ z%oncRl^|V!NtgVZnSAT%(-xz+hJ-Z`-GmY4h@u*IUfyYegFPd#;=EKv%Dh5;(P1Ix#LTx zd5IE7Z8gGy6#noZpD8gUUl8%s<0+*_K{E#L87OcwMV~*B4Z1vkKYy|E1*NY4V>jX4 zIaGQ}nSN%7J*n5`_ARsYw*qQnhz-By4w@xT`(M8-{ zh4a1j=k*?S)7%NY+hlKFI&734ehpggJuKr|K~6Y8YraHqAZ(999#S^-QzS#I8O&Un zO~P-2RFsge!erCu@UGt3U=_Mo3B9isxTt%kkS;O76tM4=nM7*j-WaRh-?h+-VjDTi zdfhYW8%z&u|D9fIQ!%@|@DFV~`@0Yj5RYQ*A*izWI>6ON*$r6_w!-ujEALcgH3&#q zrp4|b9i6z0hets5>%X((6ensWeND!-%w&7xRIr(-Qqg?7Y==tr4?+XbkK}^a=(D>N zYt&J6QepK3v!jr-gI*XG{{nsr!~D=0EAD-uFSsd0bAGgRc6>HV@d)mqxldmne}>h) zZsFxGj3d+ZQqG>GoS?y@GEF53lR`!)4I9!fif$BE5MDA2)_aZXhkF*1RbzkZVMYXp z1R)=STttYRLq!qf`*eWx*ccd9i7FikmgSub(7h%KdaeRgB7&)mOOT){Q~1qDV45OT zI3R;8iDALACUUXz*;Z`8%)0hVP#RQf!%cqpmDMsU@Q4Ap2>=m#^_mlF>94mtll&28$=hvjVTSYuZCG-yCA* zzGhLgh+|#{5$2uzjMlc5)KL)fk_m36E8^NT2Z-uNOhizUZX*%~0JOw%o-h z=N`v1$B!vxEA(Qi*MDhb{@qYnc3hshRml0)^pFds@aQ#e9`~`@ zo(ts;MF;BH(6C1fVM{Xi4^Wbh$sV7qA}v;R8xO>-PXads-xCll|G4dls1uT#-YN2N zXaHrvE*HJD@Xn>#CWl z8Skg`aJ;%jaeqs4vS;WM;!E4z$i444Sg}}fVJ>C^^{!M~EY`^)Hbq|*#i23yYmKuH zP1%LaS+yR3Obx@;Q@0Nv>avy2l&{%LnOia}aTp+!5w+hv5~A(uOm3$6wPf{*MNG5$ zdDpPv0k$9`DTKK8%lb;;GN>cgC2PEUeC5o4x5(y)xm$LniSOoF^cl#x-ooGAJJ@># zl5y~|KwvG03Yj#9j!I1-)(^9-ICFVB2aPt02zL+)=s7Wkse{ zvig|Cp>h0Jy}OYSzGi)5b37^@uC!SWZ*bc$AfppvScI72$z*m;P(e5ZYoDy))H{7k zkdMpJQ3ZgoSLsYo4kFeagMQM71_VeCzjVNMR90SbWfr-bF(II0Z&uw+?_nd=m5=F) zlw|Y{RHnM2hpC4-4DChnd%0lQaBo~5mBI_T!l0uNl3V+KX>Pq(;WS-IyKpZaKsaq7 z6+yQJ09eKP=z%%M0jU^oG9*u-gjTR1W%a{5@e=ABAi|o?6gUjKiFkIgg2u?-yzQ{c zl>dN)y2_c06=|O}3hlg-U?^hOp{Xojs9D|qH9por{mK<>yjt=g3v0RB=*UZf81xqs zm@Qq)-{XKyjekkX+m@4yjYca%D9}-)y{})@tH;dFe!o!I(pP)G^kR}#mFAeC-e*5#oZ?G1CrR`B~Qr)I5KBj`;h@=K^x$61mo+c$*^X|=lu6n`HW|ly3v*&llzSO`)vBE zIS;988Ad2zjg(f)oZEcp$LptaGBb%waT)IsPqK=KTwdvmI{=Aps)`2j4)~!Ezu^;( ztEvh^U|o*u1@noWIdb8qomu+opG>l^j*+IgG`fgT+n~lXK{ea(RHd9X(HFe)Ew4Jw z4eKGW+C+-wq0>W$Hh8bonKHy|KG()kU;<9%hjrXMym4Qd#p`0=A44yLAqP%XmggH8 zZAS#&-JPt%)oCXypKI3*CVM{kzIXZl)%4%uVOd_#kxTt|4x_1#^akla5AGP3Pq@!| ze6RPe^l2!EDCd0bxVS~En@q_d-NRy)-8fv0mT9kWus)iRdU;H%ii8)`rzb-}z*T5( zptc%-gsG@!3ck#K|G4ce;2N_NuSeE+o$mw9;P}2C)1`QkxQ-@B1hxylLeI0f(&E9>@)zH zYU4kQ1PEW*RaT`$2*7W&l#Ee?v#=M?TSGb938wAU!bi{;7HcKk zP)+;*G3u_>IiiXg95zhf16I?cp{IVcn( z;+JU%#Kov7^2eIEoMpK5umbv~a_paBNd=0mnh?P*_^xEF3LDHN7DBWK>i$;M zw`Ufjdd{j&?b-ju#FIk#On9%WCP{I3;4l%h>V3Vykrc$xVz#KK-kg0S5=G zy97t~ThC>sXljZ|G$Xwk19*CEvIG}}*F`n!iky7wO0Sq*tE#NbeO%S#;afB3Hp3=U z+r!rIj}rfM_wso6a_^49zn`QAt+R#Sm1SjjDsRvKpnSfPMITlMCjP$ymk1yYJtZRc06crbx;y&(3C}k9kj9FQ>nRwmu7*x*r00 z?bPu8i>1_|%llAGXGihq&YDUJ4t-jd`2|b4cP4LYqOgEt=OYfFfqMLM4t284PI9UH zOh*$5JNixQ-k~xy#zt=ESnU&Ax63T^n5g!wOSZmjE+gif-)4jR23fp^_=vuBraY(q zn0L-<){<{gG#)qh(D#|_4V`FZ#{0BiJEqBGC9u|eQ!Dcw9)y z{KaschSh;V|9rTPz5hhkg=eAbwJHjldzI&pyN+gi@3DF|{7E5I1Zd?$Oq=jC<@DK0 z3(HRMj_9*l=|I5jwqHStEmxEnR!uDAZ2NAd@8t#W#R5hCYrXeMyZE_x_xSku(Bby! z>B-S)6RHeJr)q9Od4PVKhe!Jx1Cx0b%>r-HC~*6-Q(jQ)D2Lex7QyC#qzXI$fwXmv z=NG^#gNehOY+^+Kt+#biPhv+oUt*!{wajU$DT05-_GZuD5T!eTdnes1PDXdViHUZP zbI#t)Z0i)y98$s{5|u-<1fW!yBJ-ctT+yBAt>OjI1c3Fl==EV+9wfhD1goctZiIjh ztcE}qy#iFP{7WxhgMjfF>pd1MyLBL+%o;g@NC4;dg-gRf@xS~bxNQE%6inv`fKs3; zVFXq|<^m-1@RJ*oLgf*vY+~xN$s9k04kp0QmjzR~OR32DIn3#pSc(7Pt4Z4CNR}%qTVESq*E(|WF;6p;JP(hMc1J{aPiX5H%7qXBN z8(kkejl>J#PWmJ;=026P%Kf~nb9#sZ6KM`o#bPW$(cC)csk<#5KN7#qjTZ6kF?wlk9KjVC#C$}=VoFW6OHBw+7lAj z307BAoXjq>y4cu_y3n2Me%bfa3M~+3^g9A)g4~K zix@EhwGx0@5;~wNzp}*e&_@pHxgPtoIPj?FJEg1sdR%X|d2C{WC3YHd@ zMnf*#I=vwQM~j&OnL)pLf7{lz&hz$t|2kdkq0j1dJAwr3fo_s_zWb4S1i5f*g|`P% z3-gMh_r>!GViUDugJM0sOCdQ?zGH~?&Lz8e&$0T>b*Mqk+K1AtB9p|iQU!U_S}pvS z;KT`8SMBEL+VUO_k~6+yhi3=$PU@|?y0f}i(DAI9;a2p;(yWEaU1f#V%RR9u!MT}Q z4w|V{LH~ehDVTvvx?j|*u|ga zRKL5e%yz|f;q#xDzilGYr&z9=nr{p~>ci%d-l6@*zwsVF6Hu>}<`zjNYtKE)Q`u!I zhKF%UrTJ2E>B~~$LeA#S5}P|a*D-zlMaRFT=_7tF1xOz8)QJH@BpbeMKll6Kv#tCT2eo%ItDrz*&s!D2801!>4VVO^m9{3atj7I zdN@U+Swu2Z0#W3FD+t*!Ptdhzp9)G$qJI8C--(Ohjs>@?(%Qr*=i?KZ|5g2MEeZ>@bG{VhkTO~+O&1F5Rmgv zuJ_NAEd_2yreaIH?tTG^mymjGpY*`tul-10=Z$X?{HmemzIpIvr-a^c(o%V&g7WQj z3!?lXwQ4}?9mrMLPFM`xjjXYY#^$y}F=&d&)S1}eRTgP8wAR__kkjSB{CRWdZ|OhH z_!%w(P*_KkCl|!&iczYAbG+Ruk}f6%KviR7uTP_fYOCfqMkT^kLCnYvFDuI`;!)9Gea%>cp8y~@A_3dKmSq=)w^vjur0ms zSi+L|xWhaX_FcekZ6X9= zF-0A0V*Ci!QJY-WQ4?Ex-j1K=+`&X|b=%BIt+Dh&X`O;5kB2zDAu)iprfoc5=K(sS z^3lL|9fRGQMvWcm5uhlF)QCJj_D5+VVn(oG1y4RP9sBbtuAjYseB7(NC*NalQ8VrK zfxJc{eQ??Im~A=PDxR4!t4bl>rfmCqNS0A0)fCm@Vm)&nNI7cDKR-(?@i5zjbkQ>s zYK6->(k2=lY)Gu%;B0Pxe>@b^_v2wkaQY4AyTsIv=^5sTMf@}n9|UZ)Fp0&Ig-)P3 zlGuNg-DEJh`rZwSS8xhq7!=Pnmio0ggez$9g@%H5^VsJz!B~4YJNM7@dMzrc=;CS} zMJ%Qs3chlD4J0Zk=t6}C&{DD-@J#48QsF+1A}J7Ra2O4mK;&R`!YGM^71$2CHU3Bx zg4$w97@BI3afcePfr4@VdU^(&D8^j_}5WK1x^#BLd)c7Q~ zw1^KpIIu#%fE)x67lthinePShftkaRA^E ztIQiWV2rK-6+()UA+4wJD}03GWf^&MeDy*)h=MUMK7Ra0r}y*aLgyJo%OKs|K%uSa z@4xATwG1O)y{N#QUeBESaP}S%wNDzVPgJn4EUa}@?)`Oru``x#O}8Ld_Aw;LEqC{R zX3Lj73UdJmveVRlVKgdwwmTPMgdgu->Fx}*%uIA?}8WTd8A&YPg9*l;1$lvJwgN=P=$YLdSC z>nCa6cy%~#w;#fKzO_lN%xdy5BAQR8)u&G(Y1Ycg#;ymjQO@hQX^JrM;Vaw9)bYgh z=H^UqXD)Gy)M?{iWBIzKb1TonVn`k$c-<~8eCkhUDiqe;MB)1r;rW@^<%JD+XqOLzLqu|M450_DTnjk=T zW`f2U&u&rY(Jb{gHN0xZ6lY}NMAFsO|IWL^vpdH%F}t+1v}62m=)7}j-G>Sw<;Yds zxzHYQcXIODwY$yE2)mgE$+Verso7Pk3b-D{Qr9GMOV9dkM-x~HJ6Yy#A!*-Od21Al z=^+)OG=|m0h)DdvR*qyugt4&`_y9L8b{&aS&(icDiPqVo!jNg-)4ajcpYIeDJM%a) zQ5o!g>TM9d<)k3Lvzt&1UHL7#mC!5mx1qehw#lUGZkh(m8>Bv45;9yh7L>9Y7?KkW z*P<-?$q|saE)cQsAvVK!mY?|taAo-xh!G4h1sKZ>XoC&KScU{;%;dtJ>MGU>e#kdt zqq>p4@+5a$zciKkYPovsdd$1P*3>(&_Xj&-$B$BK@~69=s_Z;q>yHt>lE%n}Znp*Z zeS6NFmYo;+>Vs>l-N&S5dT9aR%X!V)W`yM7Z+F8!t|D15FI0tt7$?SaIJh67ej{SD?vc5&Fb^-IZ15IwKK^ zf&>_Q&7s!zgn_L@j10*V?s_A`b;Mxzqd7e>SE=3$!G;hpf5IIHQ_XnJdyV|d_5%wj z6_*fOSU&BZBODR@-1KM$~dp(I$O%DC%&8dm*Cx4 zof9XY%k*5D{`qn1?pa3~Dr#5$<71=Ql|y_A$H&Rks1WmtNh6AIJ5DaYMKim*^Egi- zyZG6CnSwcTdymz0YdVY~5T`zfJ99-F#PcM@OQJr@4FL#U2xdh(H7rf? zR2N4|Y#mJY^|fKP|V#)3fAJ_x&G5UJE)N zI<|k2clG)+?wbaNxLNMvWH!r|kHLqlbpzQ>KhQH}1I`IWlnYv+b==o#X1wbQ7KeLJ zNselz)eSxk-raundRl{9v9_NaR`d(|`g%zGsf^>Y0}*TD^%1o!gj|J(CI?py+_c~b zy{pu4J$2ckt3ucTrd}J;YQKrob_iEW2YJ&`mHwafi%vNY(rVzv5Jkg1=xlE8?Hwy+ zQhWYLGg+79^&nd)B7zkk27CEkn2Oqd_GaD{^HP_v<$vonfOrn5TsT!V8AfYJlZ9cy z7{Vg-Khr@wh;%@87%+iwTfvpxSiSP05LgB9NX%Z%?-n!UHH0I-JNcPk*zKi9nCGd^ zd;K3C7-96jQIM{I&lH^!sr;=jS$=V^<5F)P4=~=HKgCxhnSeyQRM!M=S66Gg8|pdJ zMe6{RKr(1r!B3Pa!50;bu5j|r->T&rMGlqk{nUcP3i}E9vdMy?KocbHH8-&`u1Rpg z3-sENj`0l`hq)Z?7T9L{=d0djIZq@lB zNa3&?KWlJbV%#kqi4g@BHVG9rXHUzVKN(yScy=o3>4}SojtM@xILf}8*c?3X6WlCK zUtB-~G>K@@j@*!IV|V<{d3C#G$O-7$x<05qo7uOA^~UEWVxjy3LM{dsaDCKFYoNk-CLw24$pj%zx+0m)nFkqnPHSs zG$FO!-Oc7rgm-Zip&6HAlI+HWTqX=-d!|G+&NqoMT{rAZ#o^749*+M0@8Pi#q;E=B zWBA{GG`_8mGFAT^lL?41Rz+rXu<(Pg^5xyM8tIXGj;K?W&ea~QH5Tbbt>~wh9nNmM zL*)zOt*0R@Z*y$piCj2M8==UN0#%{!?`EATST8MbJUUHNxWlH!_=OCc0i$@lU1wM_ z!9gfXV;xDXzVwKzeB9)5_E%bynlAf$>P-n!&nI;8Zw_U1pUnp6iL#aMr(+EkS#Bh8 zHN&6LXZO9mpM_Sv{rL2xd&wh|JMl~2e4$+UVyf40B)|Gt<;1ngFP2Dy_0APafwlkk zLvq%(&bisI-Z-jAvc0d1iU>8K*Bt*o#W7{*WevpM31eo)fDyr0&l)UzgL$trzSd_; z_R_;EBmAxiPys-zeTz<(k`fV7ARrb?ikADpBvcDZUP8aYo593;ahO5LO4xZ-{iA#$@{z)dGshS@VT|OZFY;4Ixnavm2>?V=i&FysZM^Ex zO>HlyC>plpBj!j!s)A3LBzpQ1%6I@B7YpIw2K=W&C`Fi2=7s=H8Y*GaPf)P+QzdRi z=42=HX98Dlf9Lr9ptkPeb#;DViK5Cbprny!Ubp_~-e}A~C1VZTD(Ltue$GJ7I|$0G z`%cCB+_0*?Dx`HeKkyFeluSkYtB(%@GZ6m!ZVKl?CR5?hTX`WD&Y@iDdRi-@uNrzgMT;nqh-m-!yF16qD6P)PvhMMH+tEWE zRvp_rVO1iZ#=p5b1u+jhhR%o!s)=OiH+eV{-XeQo2wL((5=j?ON_v~(or_h1+7#&bFH~Qni|b~|1V&)#tDUpa z{LJtI)Z3zMtSwkyowloCH`Yk6C&`-%BPrQg&XwIK*!^z%9$gK=`8ErJX70vO@EDsQ z91;`1grZe^XTxnfrp?cZVBzy(rGsnA&}lr%GXJJ4R!as?s$ik}yk8 z%nvDQ|M|+{G5LAuPQI4hS4GBuulc=c%i)#=e?FjcVN^S#-9Sl3hqDq8jlGe-f+3`x&tFp|?5Ox8D zl<);}8xCdRhunYPn36IhJ$897_D3N4wfC0_lto|D@^5i44MjJt8^tQJ_$(gw!c{q417-uXP7L^|JAs4BV+OZX-*RC9t6Lg#y z;(x43SoH<79d%ZPi+ziX3mX(sSyMU6y!drRwkq`OJ-D)=`DL3ni`!1NgXH^l);q9D zhB{vyYW(C2&B$vD09Mz=74y?Q5_0=N5>WIB5Q-FoqQwSxsH(l)N@e#pl?iEvHc<~E zK!lP-BW_WgD%e9{2>f5hpO*cB=&t~iW`QNdcGk3G3e5xji6FpB_Oe#(t{!sJXi(jJKeb_r) zY3(fe(>9o}N^|~$Nq1NIucwh_usLy6i;5Pe!4&X8f&MPybBL z2i-Wc%(`ftpEI|r**ia9T4=o4aOfqGuq2vW`8c;N;6e>N)Y*C7*|}{a&BFKE$6W`+ zuhr%8QA)xsn}&sRIj2|5LDJQ3>ASYJ-R*8-Q^SK)F@76yNkI zwWp&0TZSslynDz>2NW}-z)iNZ9%_6hE9Zt+lPAL0rteK^2)-@U2kYVO=z|{>rBcFG zpeA>WqTb!hRRSwX=SGeAb=dSjR1Z8G*kpRYn`>o3fk?Eqo$W2@DCFw5&g_K#yNF&0 zklpGzw-J3_&~Pu8vDt!WEKbK#ZA^}bCt>}axw|E$Ip1b~qy5^ssll!Y#lSFDV1icE zWXOyR{9sH8EHk&V^hhtmP13BkZl6~2EkuQDoFu;`G4MO16a!SQrHEdM>y0FJUlUg_ zhEj>KC;|D%UP`drAC^0D1yeYJMzA9~lo?i)X6#%od|!4$~PUQld* zC#JMGR8KQFz+KgM7VWh7MX5QkBMeFi6X(jx7=0#xMKieNsOP%1p5Cpre&@`j!Oe6< z%oP&6M(;s4JqHZ#&dl*z%zo*rb2Qcwm;|NCr&LbS>H>t2P}sxe(yA9OhmBje3Kd7G zz)I$v{X1zu9}mYCK2paP{uReK%(#9)^yypblGozmuu>a6QCwZB$aT?VJM){?W7B3#3}|S7)Ke4Kus*A1~JzE~ZyjpVkBFdOLOdm+_2R z^omsD>9)v{Tu{XkPZh0zvSHz(Ch9=zvnpHAt*Wy;*KlJe4M_%@!{16zo`VR?b(|$a ze9PuVa7lL!%}!FmyToJO*2@bW6Ui43;Lh1Q)e53?V&ZzEDR_nRKL^+D$mbP}9WD5A zFuF8-Xl!l#$jZo{SiC?W24)GW^1-9}G&=*bium+>IAwdJ*2LqfQ$%|?xNMJ<`AI9z z;IJVWdQ@MkdJ4;|s0g_0YDd4Fq>ZEkIP?p45V@6pifS3SWkZ+H31N}S97Ut_L{!97 zPh}w=Ov>HZ_uQ{71NJ%w$4u2b1u(wWtSq~dn%NlRnNy@TP}2SESHjW=+M@quQA%v6 zAo?8xwP>{3!A^CeSOV(B66kG?wlWZ`h%UanJ4gMq+p)!@yglB;zd2aU<1C#yyT~b7 z;bNif{O{=(lj5qj6UUauAUWdu#i(i#G-=G*MS2s>>9y?#2X5{6y z1+;!_k%MuqYHZ!V7fL_Wx_Cn#rEn?a7k63ct#q%WPHQ zy~y0i<1z{*j>dXjX3raKQ70e2{~JSM`>dPUg*FVO|8^o6{(4vf|JVVB0ZCFT7`?n7 z^BH{&A}z!T{!tp^(*B4lHObWqUXWt*cE=iUy%a{YdPY@1V&OyK03iK*00v&ZfUEdK#cgjlA2#9A7cy3(#^kHx7je+-l^_y9Gs%uhy z)KXCDqrj>!Nx&2W99zbS(C3q+1$7DZtZixuomkDc-tcm)gD&FQ9yO~fO1YnX?p`g^ zu?#twzBV6nu`+&Iux)DR7*i8t;f9b%hK55=2rq^!y1oAntWV|^!nzKy^SlKv*K=L- zx0e>FbF!Z}F7hevZ=aK2u4S7szf z87gtJ*jdlw_UVETVzpddvl~Ep;oioOlk~lEg85z?S23de#S*d@od=8JJWS{Zt@}$! zT4eq;t(ma()D$5u4i_8DtxS$E2T~DkEa86uMM1j0!(kYY!!+G)ANGgCYO#9x{22mH zsWeT*qB&0`k9Qy5-rs$gj=R77`QO;`*I#^j`{Bbs{r5k-dHuu1dU138LI|%eFPE!L zhC&R)GEO76vDqv?{pyR0XU_`I)z$SUpL}|Gb)8H03Xwj_)q34GZP7v!-07kKi{-L! zS|TQqRHoB3jyWgQHbi3fYZW1uQpTLek|WEe>!U~k3&bIWKoW?}>RV#~U5Is<$6VRn zL^R_{0C%u^1N0jRFEr zU?&7b;F>=*ag-V0k&w|M002h9!89WT1O+$(j)(=Ipb0`W^6)G%W-~+(0|RJ)B9fvm zt+Mc*XpRQtVmhE1Om*yN?AcYs0H9#%8hzEwf!E*tZE%^5p3v}EJ9>%105#2IdG)(# zwe*`}<#$wVnY=C-D+{hRCRT!Gsn`XF{@4CYa=wpNdnVf~84(fyYc=7|?Fxf_L!Au^onCx7%K<)?L?)( zOX>T5zkk^69;WFeA}QyTMq$b&kK+`Z*!PR3X%JLZ567dB0O*ub*Y;5wKofSk*dIUv zM5Ze6Awo`Rv0QjKKoxktce%YMsrox6MDC$tmfdk5gjoa(nC0AVbXEe@6cJKNK6RL; zWCk&W5M#=v3vno!05jO68d!|zloJsJiAgmT-43Tk*D-M}Ma_tCNTX`bTG}R-tbmzw_U`shI6$%e@wnS=LCeLWzgVtz!!Qg(bZx$<8HUgt_Pd{6|9Co` zVrWa&hr7pL-n@DH=9e*@_79Im6Ehd1Qi^df34qW@`^n1}S2s7nVYOVZmz%EZ7G1ko zE{a)7DN0;)ecyG9e$jSakl;a?;yp{m2GDm4Rv^H>>)IHdZr{Yl?XQNWrhpJx=zQ#` zJl&d5F+Tv}Y$t^3IRvkPa-fS9^n5^&$e|Q`*dK}c)0^i-%lTbUqa{Bt^i_694 z-+z98wON1p{Mk58UDtPQL&$-H5P@kVu7!FC1kh9PCaGu`09yk>aO_%wikEkvBSTH$ z)L4oeB*6k=aBl@xu0b#jVB*3-tr~D^`o+KNivf&O%s) zD$lJk&f*{>K{f+YojX~8fzCGzoTJg;IR*2l!7@<{(MmoYPE#rgH4rx3nAve0?~jL4 zO5Zk%#qz3OHb}?uxIONf;Q4yJ=o%*KLX1riq(D^db%f{D|JfBEJ0-Q96GIe^ZM#6CqS@J*W=2TG)E84kODPcx z0)!CSrWsCSQ3XV15~N~^L@bhvB9gNtRSR(dvy@VZQ8=ht3_-Pc3xyN$h{!|YDJKBz zn%30DX#nORjj&`>BpmbDhLC{4g$0AjEJy>0rI;`e;~0qzbe~61YeGQPQyOn~4{g&n zEQ~ayl5+<0&xnG7DiMdAb=h@{NQ8F}4}brk|MR%tfBxyGs^zfXt=CI36DB0?V*CE> z`~B{?SS(}Pkq8)XA07_--IS*xr)f&7k(Vi@Ax)F%sKtmPhuFlv@7L=!$6#R097KF1+l0ou>iyXY#BB)f zORL2uE-WMa?AIUU3YIbOsf_oq62il73rMGNI1Zy3v`y%m77)Pl&2nvOKfizfFTec! z%XWLW+yDC0SO3R%zy7e@{(Sr4v+HZcvfCZaOiKo$Y?@2ST247R)h2;Wpjr(G!90yJtWro^>*SL@yG z;opAvS3vyct6zl}Pp6Y=8OGE7?VHfZv*#~X%k?-+$I~HAX}P=z5}7H4(6>uMnbIU8 z$Wg1C+%o}2#M3k(k_aJU$(fl6832QXl+!p(Kt#d@AS6k12!epQ6lP92i+G(MnOdH5 z8yXT;FaZOs(zC-E!B-z)GaSb;HjRPpPe;G{ELZF8>BMMi<$kx{^y@(rk%)u>mNa*< z@fjS6q@s%$cf%o>mQKNaHk~(vYUihAB;G#sN`vn$lz`c8w4&o5gy4 z`G5VxKm4cv^dGZ?4Czr6l)&eLJL-)-;4{{Q{{Po(zks~7*}kN^CSKm6sZ zPhRW~$GiQ$pr%rCDcfn7RGBcF3XrO*WjjfJ5cCqnIz{dPY2YdI^bb z4sn`UBxXgdwT1v@?8rwm9~dXJ8f&V9VC3uH{w>T~8`#;3idIX3DOA$4#TpAj0H|SN zs3uXWE+Zgyd8ha{tX4=;^L+2q%-YzKQMHvFnAm^6iYx&1+I2uf0?}$>Qm_LOyMS+= z0>f$kHm-oV!)~BLX5xNvAO&E9;@{oK5EKje7XW}^_EU-P%v@#$tj4$U}AKz{91^%CTBy+3WnCVaqN&2ok?hki&@6&WV z4Z9d+y;&2BDQvfoYOq{vHk(a|l5=|h?&q9GAR4D>u~@OhlqV4?s;A-9hK5+ojDmb@ zT_y64JTQZtClOK0v55#+v>2%WI3tghlo*41Y|t=+diR*KeEo*utmzQKaX1-(8ipW% zSilH57Y$7~jYo-rk#f#Jv@aTnCB(7h5E@X(B{5(VW6qNSm}#-ngm@Y!M4B|8h9M9W zK`LoDod9vl<#aqu(=Z&S$L-@d9E9*N4!^v6ySsashAA`+5qqjHVgVuuVHlH{F;U88(u^S%!(1$>rjmuL@)$(|u@GT(NSaUxQL5<}l$d?B zVxp|->GfpA2Z+^JjO1~A1fMh6Jd;8~o>DHFh2_J;RtcH-@o;>5|L|eIyWKq;PbWs~ z+VI))>)*b7dC|8F`18ZV-~a2MOw0fI-M8Dr_P_n<$5+p;5n(@$KopP!X)4(-$}Tx| z#2&US-ZACQORy6GYP|qQGen#a*=%BCvk0631}Fus1yX<`njuC7MVkl#NDMNdA|^0b zj|%}JkU|E?s)Fc#%7Sn*Q-s#x>;`}|5R7Otqtd9h`<>~%;HHuS=aFx9y!)n-Ktt7g z5fORy+uvz5X%m6#GwI*oitBB2} z&kP7YtWX2;pG!U-@Q@W(ltS$}EC`G&fM5z}1z{u*H8BJ4y+ja101Rhur-33L=K;q= zXVP3fmDiLmLeOeKrAnNu{w4Uh(11LaT}}4qUI7id2V2GSdtIF0ko-zZijcFa z6@-qt4>8675`c(^N=~^HMN`u;<^6CR%5bwpVr#F{hJ%9Gu&Gkj! zF$*Iy5g-s5vp0i1jo{}+8)i}U93jE_?o?@xpw8OxBT&TC!}V7r33M2c+lXxLfvB_m zkIR$C@gyRvi8;om>z2sUcNd6!|M)z6Y+YzS@z2qyKGhfDM;V8ZCo6uydU$Bl_Z*>G+k_4LW&_u2tinw zP$Y;j5_@Z7Ee3y55e@t?X8_k=4a@>F*6TQOl{@CM3RbshZOAnv;#87Qcsw3&AGd0@ z>6Tjbr@Q;_-@p6u{fE~dZg+=+KA{0^Hz|G>fK?d z*%}FAIBJ1ej?PsPb^N0R&wcs`6Tr}-8G~l3w!;iYfFnXO?SUDwpdnHV)K-BD$dD@y z(hPmHP%Y#Ln81!`j2HkFiZ4@Et>kk@2S7$^fCJ2cwRDqQh z4#U2a%z^|j{^s{+WQYP5%(U9&fyk{YShUVG4G2-yNb90k6p?CqphE3x$6E73C<=vY z`-rEs2%kXpehmNUe2tmlh}r-~Wp%GUp#l|G`_HjnqYQ=STL>Wr05S4sL=e=}cg2A) zK?z715dkw|3#>i~0V4#4+K!2yRB#6oQiEt(RsNa%R+mnn4A+a;Jjn$lng=`eYM?$> zcuG=<0eg#;$CaaalDnuWssvg0{Y}5PT5X!;svsS68L~||@5c1Y;qW+|7Hzobx+a7d zmlt1LU$45JnL?B(L9x;@E60uSf64v%pR4WvSK1B&nUShixo^HIo>d_~I~cm|HIM%5 z&;Y?h;$D>CkUb)10l-{xE+t6p+CH|;l=5P^T5T>bHkV!BO=)bJw(k~ZdOV#}wdA~5 zEEkJ)-}gD^-R^O<=+&|Ti%1Zh>Zrg#6$l+z%_IgoOoIU+Q#L4Sv1xK~umCb~UOaa@$gD8&X`EscoRC^no2DI73L)m41IuKZ5g81D z#!>{q42M#ZDWb&?Q_jUyi#8kzl*3_<0A1JRqK9$xY<@1elV-a=><;_=Y5(l{*<2Zac@%8*<@cWnIcF9QBBVHs(=??vh!BtC^lrcV`CTpIu*l{_NSq;Z(qoyq zfH7baC$E73XvNtRA!N7P&uM!fEsg|*VXh`LCMq>Mh8;kuNiRc#7Rb-L-kC*U0Z8Uj z-Ws&6NJsG9;(R6tLy14C2ug_`EHZ5@A9 z3>+aAAesp~bN8f2zWfaBeY;j;#^`qeRs@4-9?C`_P)k(X2OAIsOQ@(OECp0%%_SND z*oexGmPSN?Xr_n*0{H;ez`e9Wf}mXuLSup=fCAbW8j#P{y_|v1R+o8RY5?F!azHK0 zGv(q54gsL5h0cQ+D?E3o&0kad2WlSJ{{|r9mV-sighI^1CX9vxAcP&mI>s-a-+cS& zXWxGI#g{KXd2xC9?CR#TtLMwOTy)*1mzU2kFS<4ckya!`&tW!gY+@7=U;obv(8s;Z zPwLx8li}ibYM&FhsP8}$ml3I^Q35Vl>0o$hgzyIq$ zOuPLb{_B7F$3Of(i*CilfBeJ$_fP-w-(Nm|{^I7@Zol6hPT#+Nol5BztLM+22f^d% z(DaLLeKAdWxokiG;)@s0ULwD#SsAh=dtc4b5Y|j`~qIVGF~oO)w#%<(%EP zg+&oy(o$yOGUpUf#&IN;Q_7PXQFy-CJX>%2rp<=0A0PMQc-i-s%Rm3=hht8vKqlL1 z{QH0V_tm2P%_pBe9!{#-$Cxw^XPD+}%$mh74zdF9MOO8sP!82U_@no8}upg<2Y~zx%zR*WR98 zB1niC%#A&DV(3O8LIhw#A~1s%AQ6rTqGZ+5rA8n?#g}_TG-4kmKA9ek36%iR#N4du zMG7c@+05Yu6FG~c@)at>xk7mW0F^v#W(jCOhzfxy6J`K0P_(vIoU5VtwsIqErW_%j)wbCkiB3S&8oGAS9;hm0g`70$ zK}*TGlr&ChKb#&=H}(ilpau@;VP+Xjhk z+Y3`MTC6svc{uLx?%wSW$K`V6tu<}GTy)EllNHO^ja{In2n&LndG!2;SM?H%iHoVJ zib%2gQe-W;6ecESLMSB@lL3~Z#F9#xQWoZ{>bpG?Yf&W=mQqRqBMDO}O^i@1Yhgsq zxsaqX6`cs_I8KPTA5TJv0Arefu$YbGK!ky%jm_hJzui7w^a}$GL2fRu1BcCOHJwf` zZmz88>9D>3@b;U}e^rXUeD%p;fBNBv?*ZkDuYV=d{P7Qe%sKU4JM0e2#VQh{JnZ*d zY1)3X0p#WK5-nv*W46WBMnV{l10k?T6GGp$%-qJ-O7^@CBKXxUNKix)7G^Yvu_2~q z-+R=ioZ;w~$RU-m|8P}sey7Na%Hq%PzRW-l8nGupH_`8`> z?wa;AO~W*HA$S?2T3L2+-83NBh4x`Qol?44ZC+kqzx(k1n3I|HA{Wd4ZhO>RE|#lM zU|&WBj2wz(0Gu?50R!#OCPE?#MlF(p`+3mU<++^8qG6*H&<0=Q2zn4fM6d~=Q%9Ip z)1w(6Gg)a25Gex!z(i(91u^)+im;%w6f7aCn+d@j3`cg}CF`mv^D3k`)2Kc6iA4Y# z;Ak+iu_0)MGPvx4h`jvGe{l0Y8UcDx3#}?NNHZ~p{9vy$Thd1}NDAl}QLF|Ta=FHr zSp#AsMXkLAK95C1Fo7qFeR0v>Aq3>8HUAgTxzgl(pk}~vzKHlrl@JlEK>&jj0s#sb z0Vt3n5L&B5hKfWs1Jb}-D2(f=_>9P?JM|gwd8WdBGzXaRI8ZH61O$k==7jNFy)viB zW|odOj;Sd@7H_{nQYdDw=S^k~u$u}DdD;%AciU|vxM-Wu$n%T!<)UBp?XvB=rtxNN zVF^q=YM;GybhbvFw}E-$3x6#E@vL}Oqt^K^{OCG#hGu^(|NqZIf4v9I^dv)|%142j zM~6UQsv$-nRxvY^Xvv4uz7#bB;m~z$jNO!TPI<9hhY&<$yWM5gi_7bW``i2bH)=T* zy}5o)EM`R{wy`y|obxnI5~6#_MFc<{`sU}*qUy89VuhIjY@DY063zcr&5D|c1c}2m z=2Ajz%pjKn>{)7KmZ@X~EY6%k%vyvPk&e^Uh6V{!Q5G&))szWOxd>BAdCG-}6f~<2 zoS5Fy#~gB4A0=X*k9Zaw@NX`15es-rQV? z$kolWRo@m%Lpt_t{Or}2r!npK`%?1l?YragkjkX0$P8wEx9GaATdWLG+J;54LQ19S znqfHJKRg^xr^E3;fW&f4#8YDOB^%BL=-GV$ zbp}wcs(?;y0R(i0t}qjjf~hJP5TL5MQ?qCxAOy=PCoOK~zTfTdcH7(Sc6U4(;_)=5 zQrZ|+ZPSNnX1V0eqPxCW-)?upA*Jlr)w{#aG;J0uAiUjecjE~y4@I?TFj9gMl#!xA zsUKTIfM94?T`sMH5-CDK1H=JL4JO2*Ced7zMCV;Mz1& zS1=!80)V198Tl;K`n8lm1&M$%0vTqngT?Cc7Gm|nMX&)a01A1k6V4$~UVrx=46IQD z1Xd)ng6^T5smtEeV8E^j0UDVX+!z=^nVUpBp9MxRy9?{KR8P-{px{Y_;`@^ahRJ)r zJW`Bc(8n$M@=WWCq*L|fr(>^2n0w08Uz3)H9|w+6Dk=95*cO!#d`X4IRngG z+d5~!&WjsVfLay4>hD>@2H=MJb9T&ayd#+bL_;)nvrSc#sK)TTeBOI(fJo6%S+V0r zgfp8VMV3B>Mb~57teSq^wTrgxy6*XM`E0$s=(?-LqHS72jKUIx*vW6m9&MxA)Z+CD z_}4t2GgADcRr_gUn}@yx2#QMQ=|-)rc&fi~Pxi;(>gk(XZR-UmQfs|C0b((o+3r%Z zs+O!EEZ!3lLf0==68La9zI%UbKu{jM>Dfw`G`17BCTy#rBOv8BhaKGE`K(+1qKD6n0`0=N| z0F>RsJIj;iNkl?u_lNDvmoL^=&!=K3Wh)R^LJ%e*!~5++nkI?i;`%uftd@&@**9%_ z8cuE76NO=%&>-h>ad|<+sySI{B{m^e?id0Ah)56-A~Yi+A&x=7?cTHd+*IA4p0zj! z-l-=Dz(|ppf!J+74&n3;C?a7tgW|`3Fa=Q4tTv{Ub0VT#$~cWp+wPCYobvWKym{Q- z?Y6^^Mop#`Ih2$Rr(v7M{ghU*Uw8feap?O#AUzDH{WLx9_wNr6Z4A%*K9AGGanO>i z(mWV`jc~d2-m$#K2I)oG?HFQ{@`tL5va zCZ-Whk=RT!_|^qLAh-~@XqT(5UoV$!+b`N~x#&WSi`cAJ?aSrr%j@fP-?uR++Hn~2 zIJq^BjnoQ)dex4P>4D(?e>V543_z`Wt3UgxC2S@N1e)sNejBVStNOEy;gJ@IENYuo(iOu`lH^$a>J(waf6KOWr`sXo?jpGz! z<5&>|D8-1J++HQBQi=;*Aqc8!&LOb5C!MgU<&>E)rKAYRg2-r^iz4Er8i`Bf?Rbnt zZ4*!9R7xRLLI%NcniPE@n! z-ObBSj?+-kHdmM2#G6;2F4vcv%d4>Hq~+%?US+c~l}J%keLI|QFCE#BnWYZrp&${Ci003&6X0j+BWFL)80p#wJ3nhi<+ux&NP!| zmCiFwAfl3VOw*)=3{x(|ay$)VN+aMYrMLU-4|liQ;{eDabhTP%us3&)_xnS^v})U> z@SooOqF5RhL>;wEV|v`~M##&)4Mtgum=(|j{@FD$oBV_Tn9zVQp-yOxq7b_G1}jyp zp3;qx%!Oz$H6tnjy+Jl(1h;+yPyw9`27(E4W0(OlLeLtza!-k(k(wf$$N*3Y(6n}b z7$P&NJ+cW%0FpV`&x(eqP}rq;bz?dp=n&W_4g= z=I&Rn=R-C`wSwqnkR}GCr1K?%%)rjI7K=q?Kf+0qt zS&m?+?7G@N2B2m|fC*R;MzVu$IC?hDKB1FUBDmkMf5^^Cdrjw}vFyo?W zK3OeaTr6H)Y`)xFy}G`BvD#cO+HCpt?fuUm-tYIvv1A2{5)h@Bq0Z<2CwA`BP31`l zg1@Tqdb0h%M+bTD8bUnV-JI}n-b4sz#;a>URo20okOya;d-Y0@z)aP~`m$*C=}Rqp zVnh)kq;VKy6Bf&Ey;!2DmkDpTk2g0jUcdg!hj+ic`sB;LUs4F`)n?gs$HU&ApuX#O zrvoAghefkUX=-AFz=}DgNmzsfGEFI`lmZh8D}b4|NSLY;QjBp*sa88s9ZzOeVnO0u zyh8@Zl9>e&Jw@y^LnX*+Y9=8t$v6yJEX2r$hIpC=V3b0Hl>Y}`Z_*{%kz8qB5z*m2 z8+;0n0YeTXlT4Ce)vh;vYSH^%_D}CR-PJtBQ_MsX2?Qd-M;qQ#RgqqZK68rzs$zi? z2MD-(m_1XK;ok3-Ql=xc)-u&vl7t}+hj}m1$npKpKecj5dEBlpj?*#cR7(A~fBV;L z^yfeQ>HYVA`XB%L-!3=nH#axsIL(LSuo`~+;jd$opMU;gIv%dBZ(CDln&!hWtWzEy zpB{hu;ZIka)!+WzKL9eseEa(K`f|HkuV39 zEP2TH50B%x8i%p8MusRsm{N$$?7H$m459{*YGer^cm>jvq3i`2Lh4ijpYytF))T&o z3|ebdU&$K*rhSG=a4`ZA*sVfAIL62%WKe^VZN}ByYzQevxg1v8ad59{Ev2@3lZR2{ z-Z$B4qhr&$Ovef*%r0W_K@^O23r!lKW!1vlv%HlHVx znG0&V!rw=S0Fe!yU1l($uahm*`Cw%5X2l4Y~vas4O@&7Ae6U$Nty0TI)2I`@{47^W**V)7|drVgEFv zB<7eylvt}NIEJ`djobA)r!2z6h&jd}4%&0uB+iceFR}{Ge-E6opnvthp8m4-B@2ko zq1`iX4Te{5yqz}hUu?4*6}97hoeZWNg3*-Z10e6ZjxOP@us z5L2m5nCDW4oQc^NkG`i-S0FCw7G_pedBNhkzsyV8C^D7#Fdec)b@MPmTXPG(T0I<& zt+n0Z@%j0Is@D0i&a21A$5y7M?bD~96&O>3*2nw1-@JRbo62AR^yhV6QK9<}KmEsF z|NQjn)5o8G*4A!rZp?JIf6Bx7@#Fn*dLGv+BeGIi?CR!vyS@;T4?q3@s=xis?}Fr< zV;)i(M-dSr5LQD@SvKp-$Z;ITaU9i5L`t16Hd_f{p6Bg$yWVX4z)2|urpQczPiUz? z>_jFZ_Faf|-N;g95ISKCi**P~i)~#)h%UK*c@%Z|WoD|rVux@a%LOJg+f7pxx_@}g zQJxM@KYjf8>EZE*k9Y6yKixe)|Hu8^$ET-J!dF+9o6Yt(+xw>nVcO=^hsWLhv~RU? z)7ex3X}Z(aR4bW61F;an(8!c}{H+oM#D)M+Z}j~^=E0O$8f5gy!mb4(pUo@-XzB>H#S}ngsh}rP0T=EOET_+L zPipr~>gC`6bM?d$MGIXA9ze~DZR0+l>4k7JT6!`TRih;wT)PKAj7<&E1Gu<}$A@(} z=8_cY)aYf^xS%C`5kw3XW;K{xxDtd#{6D6tV zEd(=FH6f5uv(_5bdert%_32PPJn!D$Km6PKpY9%?Z!fRjTwPpUZohr==9|~Ix0hGj z)oP4smGc-=^d{T2mW%W2v~Z)dUpTwE=!?Vt4E6JwObBOAhR?o&dXeRF?i2iVfeG@m zC71JE@e8()m`@lm_b4)h>G|oINv^K0V9e0#tE-sve)p)Pc^ogd7vnH=(lt>^>GkV3 z^Hd+79ssSTo7IL{sx|}4d_2xmj5)`6tVLndG!a8WAaGqU0|2QuB2rK(g_uigW6s@{ zYD=!CnW?{fY(BD3C8pMtnAOy`U$wcc%$|2oAtWW5%VgS`DlxHF53P z)8X)3=firnCdhiVdYm+d7Yz+l!P^Df5sM2sy+drXcJ#eo12Nk{u%^ zVQ~*#M^5?(aA`E%4R^|?bKuLlg4t(F)vplq;(%ODee>q$eEv#N9cd zeE?1Doj98*8537)%w)_>L1e~gOMR_kjm-7_6WOq6cKrT3uvO1tfTOmJflAciiNVOq zN~j(7Q^{I1&vz7sQ?jK|H6~f+Q3mr*J~5x9{imw-1PkJ&3Kt^nLQwc#XcD+F*xy5! zJoytGnR{eC3z_(>!F?7J|MA;z|LNOrUtewCUEf@9x9gn8l!hEb41q<+?bTgYaXMZ9 zXSM$?mcXB#{&r>(KL7o%{_p+udqKtd-}q&?L_LlAGy2pEc@F9|pjVD29V>l%^NM3E zo^L!1?>~NsBHMADQz~U%%xTzKhC9q$%s@t724}lBXSLUt*y>;X(h+3 ztv>A@MR=1ot=87+$B!Scwwu~&W=S#Zrh}(*o(@_+x=|F(a8 zn4X`+%H{gvzy81f&)dr@f32qDJ`Tg>#m$G0KZg*7*{nW1+#Qd{GR@ZN-~Rp&R~J|J z4?k~ST@qz&HtqLUH#fDF-NWO<-Q#+-M&z8*)#eIH6l0D_m4>_`vJiL}SNG3PQz?gO z5(zP;$K7)t#u(F7%B*!2^J*A(hy7-?&M^sd^d0cxj${#SZFk(OF5QvOAAB^*9=qco zDIX}YV^gHd7WzMXb%tI)ook2YqIIsNRn-Plf}|*~FK_N2pPJcvJ%01mTZVmlczQ0A zm8QURDSv%@y1V-{O*5+|!q5Btz8sTDE3L6GLmII$2?~?}&nS*WY{;MhRjR zi^~vz1@nITB(kmx50&|NdW^^O?mVKUgvnJM_j! zy<*xS@g!}DXiHsi$_8c#6BO!@Qa2WO)-f+YdVzRROmx;Co)fK!j9fbpcy&Ye-HbgruOeg}Cv=L`e05x_>l79o2v$CFi8m3AXh@w&heDZ@1 zR5+WOe-20^huHPPSqa#?-bamr%21-P{O@9}^YxjSSu>ck3V4Wd43a~XoL0m7fB(C` z`!C=9<8R--TBV#M#lSI2Od>3iMF^fv-({a?GpJu4+%G`mle+WltUnpt^kn=!DLa3W zc}X6dW&(i4#ZJ1Q#21L(OL}D20rhWlg6N%o3xFwzNC-J5kp$vWOCB$*BF7=+@mQu$ zcX!M|I0y$~*={dtwcY+$<|*V9VhSW<9;Pz6nv)D6CXlsSiKUbx!Xbp#G{kiBIjd`*3B-^R2yZ`Th{P&CP z#c`Si78zp>G3Dd2-rql@INaYonCfo#yx;F1@9wX!x8r7`jo!Sujlx6BBKhj-Hpe&& znZXpK%=5S!W6sCjK1!&j>-9w`wbUAtyt;jp(+HwC46F6};^MNj#zD55EejLTIF4gp z)!JO!wPDAKZ~W4IE7RLaIH~_ zu|cagHSCXv%k9P8)6GE`cdH5f}6& z@JuwBx%Phz4!*qey;@i4vyr*@-^e=Q%b*NBG1}Pxp=GS(d2_rBIkbmV0)zktOnSPX z*@82c?H~VXQ4{qkUD8v|q2J$qvDw&&Ec7-X!DV*c9ZCu!)4twVBE5vr{AB6?YAkSS z>e9OfK}>+>EEl$kEaHSXb%zdBAR3rhyUP|H-APdM;9H_b6pRKlWhjIVWYnldq6VS` zhfQV`*4Xb&)Fp`-{SEcGq=T@3eQ@5{7t4=Mr$%8pI>frI!MR3ZiR&bfsq8x3&P1Bo zn%m-;#++YWUjE^mum6w#^xc2??w@Y9o2gbX$G{LG7sjcJZ~#W=<4`&!5S&5a=$B2v z7p46dy~0@t0M7AhU-S)5g<>KWF~``QTofm#g_jOXf*KZbc89dlsaaXLYp(HtR&6m3 zDGHMb({Y+gYhby&xC$WyJgmpLmi=KTfmz~eSP5|?p+Kb+0A`h$M8a{}H#H_wZ9^W^ zRS13EtwE%zxEmj*$5BujJ5=a#K@OUqv&9HiYd|Hk9a-3D$G`sY>BGmX>znm@UCLDEn(`Q9cH;VO_mtym_xN-?>|Wix z3L!S4)vzv8Awh^iID{N6$mRCR1SK@K9q9A9leI2&R?5h3r5^MxkFW)WAf_gaSGe zC4&(f0fw;1Be{>WM4VtiCI(UBKDlN$3KZ#L=jBvr6=D^HMn;c(XU;pOa+kgJ%-5+jmK(?=C);12q+_I z|5V|{(e12eEDS#4Wq4?&uq2XmDs^tPHq{v8YFxz_LrlaRLM*CHHRr^{F(#iuFf)nF zwWykaf=F%kI8QkwmOu{61F?jr&4a)tgt^SEwZQDM6H{FrN^FJ{m|cDV03ZNKL_t)k zQ~|&|)fyPgJeNvL4~Ja<2L>BTt&YeqZ9YuL$Q(ngwMC)*^Zk0gX|*H6a8<6nP_k%cLRKqQCb;c9bvcz)dPp0w4!{`lj&H}B@T zK0M!FUR~snA0MAK+s*4YuV25tC7{g5ag1-?-f|pw(;*J=_Vq0>uQwNm!*Qzft5>({ z^`;p$Lljx1m|{H4Q%>0oA3lAmRSh-{<7%}UhMZHp*sOC*YKCShC1>if5DP^S0x`2O zwN6OvQx8Me`>APZ+L{V6gM8HI;SEr8KI9^oAkS9fWqo|68n9D{g)eNHx_Fm`DaLp> zPOon+k_0v!%Jg(RKJE8Uhkby)z1Vzxb+s8*i}B33X_@ERYK6)|Gn`tTttwE+8jMJS zp+MDo8oL73#~ALVVy;AC!D1FOhGcgz%VVm3t90Av#~1Y(2C z#AKBu6rpM+AOW&rW~*#M;#m9~;?%0sDc}hpOF+E&=Gc*?M8T*r8G#(u#9RSs8nB%I z>?`vgjA`f%sTaPDtVW3)B#~J1a0a?I+`{!W^Sz+ATg9$ zTWjv(XsxMfl;EQqZxCy(9vEPR7$ZQX6f^Zhtyh`8pkg+)qD=@Os!fGVLTF||q|GIY z)LJ-%V=Z->g$azO{f@1z@;J9v%d~rbUXNP>Yb(<{F_Si{RbveEv}cCSx>;XO``vE$ z{Pb`)?T=CNpZ@gkj~_l3Dqg`pqz|4#%gM?Eda9>} zQyRvVq;PqC9b$ZX-lZ6gjG1x>Fbg59hH;e#f5$_NBI2u^B`OE9v{2nFNfd>dDTn~5 zO`B?6e7yqlFXf3$KG7ELO}zIBAQGn4;YEKyB~=OR9kJWMYXw92+y^t+SAkS z&+p&=^ziue)8oJY@Wc0?K74$7Ca|^n@o?B54$t#kitfv_FQwKd!U8^6^>5PDgs54Y zgc~f7yL^a%agnHOXBWo~EhOy38Vs&Ps=U4gKl1N_t z;h$*9E|i`UXtwAy94F&x;0!KIN-(nq_4I0?4vgSMEy!feWkztOVYe-#&k9Zx1`9;& zLBh1GhMdp|Q^G__Km-Y(02>7}B2^->P)P%@0*h$``!y4YvO$yy9LSigfg9kPmIGUX z=B_)%L>3GYX3khzZdf5wYaj~5)|A*+4p6tCsh_G45^8GX3twM(8kq}VyAbBZW@S(` zHI77W5kOnukW!KuQoI<)+w043Z*HzPt09IcGUjx-T3=sYj5#HVAq0t(W5^*y@zCFn z`f=^=%kuR^asGS+#OKUU`;rXtg(B#eOM)*(M*ZaNITQ4msFZq}+B$1`84mSD{rQgi z#0z*CGzAITl;GJ0o;e2*ks#tDc-2~4GYb*{lMsoiwnkkHtlCtB-O5*M1G7g|0;bxW zapzjXo_qoXk;x6ZK}snhgjy?~&C*JlMWnUn>qjO&Oa~%f=e*nPK&FPd%wlzjc`j|5 zck^+dV~ioyT8_tKV5nAxJwNYa%+s_l$KAu-hl}m1HhX&B|KkF1JH5*sk)oM(6Fd&3@bMq?YEFmy3 z4ugbfK#qZha*ip4z?4#Odl%s}m+mR3jwvRXltsi&7~dYa;){ZKbp2(DHofIbsAWNm>cBj*zOPeyWL$W zO$POSYD6fo ziO`7Epnw1oTs!-~BB(55b$|G~lKfO`^>GN2Tc(T;tOPVzfFJtHzG_Kyjb=uk2haUY zaoL4+-gN6=&(3^N^3+DaAQ%7mod?@uk*@n%yoU>SB&2%I$r3WqlYX@a0-LFI_JE5c z)jFn>mOPxEE7g@n{#t22xOlN2pXB3YgkZgwu%#0BV@wyv87*F`W`5`jQI9ldx8WKU zc3y=QfQhnoL8rqn-R|I8R_Xr5!zUSD2swkgIT#TX^UkR){88=on2 z+?0E!`}81#)A;_g!&?`g$a!;cc2Rs$_5Z3rfQY>ArUfd;^s+AYf3tAO*_If}vpLes zUbyp4dh6&`2C7;Y;y_=VfL$R>U@#F&5D5&#m_n#!RMdo@PIrw6)e6lRfVqy~5=nwG<>?YXgcnq$dHD4o~;?HO^5y6r=M4=aU50;_YWc=#pEt4RXt9nOoy+( z`bts=<2VdMN|AtRI&8O>tIf97IWWC__jMRDgeA(=W_$DMmO@q#Q8?~)`@>E+r*>_Al&^g zSc=$wuiH|Ga1eHUPz=H05vQw_iG=v1uj^kxdm?DJh^mT6AZps0BQ{k{8M#uV_s<4}I!qrD!a5IQh|JQO7Sm=`$cZ_uhKeRcSxo>CCYTACL5vNWI}e5{^#J8S z8o%w}OqNY1LLu@4I&^oFDS-hcZYC9ou#BGL=)kcqLRk(ICS#&Hdk&sYb@`&i1U-^; zzy*dvqtbyvpkUTmoif^Bpa@n10-+KWCId$^05dT_!O@qkQ!cvC8y>{W0yJPIWe=wR zd{p}yV z`R2E`x7V9hPKkt55D~xOI+=|Z%G+Yn?x$?0fp$0ClF9km5l)8Bg*|i@V{k%doB}l2oRkf|PT8eYc=6R~M zF-vRBOsiIH^>}#7X{fDPEiuH_YHh_@(bh~02ogpZ!xY+5O0Ag?9S+YiMP@1U)XXHt zr~UE6`yW>+{r+$M_Wtha_3i7&$GgpH1+x&-e!u_t;p64iHm_Df{QAwiyjiD|La=E* z{O)i5Kq1Bye*5jaJZxIk=iS3R9WPcJBaExndb7=G{L}Y;-W{K>E-u&Gi}iYaxxFM2 z0OK$WtMT!9w_2@JN<>_U*5fF`+tqqIuB&N?F~y*sWXa5a=P@(H2+dkQsI>3$nkvD( zQFGjhw%Q%we!uqnpT-u1kvEDsD z?~jL1PtPAb^wG24h@17DK0u@#ql_sDL0Z$LN}5bZ5CIdb4_F9jM8S-Et%+ph;a?0g zMPZs@Vi4lJ2U7qlh-Sg4z!auT3QIHYFb0_rVgnIX z@~9Rg5@^@As4)XdO1?5767At2P*u+t>lR+$B5Ed5pqch-ja_f*XEeBv5^K-BNRtio4a}SzyweP6*RYvn_4iM8B7$(b3qBr zjWCkH6+!+4FPfu%-x;)n5jtSc7AEL2?}o2@#mOFKY?gvttj62z#X6>^!|pF1-v9jc zz#M=7=H37HH^2Yt`l7V?{inN6hX+%P5`_iCBJg|c-)Kmnb~ihUur{t{fnP`+ove(7pxp{4}gNNic^e1LT!~Lr(y8 z3#oMjJDaB~oy@wbb4WFLTC*w>=4ldP0=p)KS%}D5 zJF-+$m>SC_YGTs`jgudZJG_~ZL=b16Yy-@LiLdH1y2-GBO+ zV_2H}H=C^i7Z;ZjBGgh$DW|#C^_Yj8873hPDTz=Ji6X{6t?hiW7lsm%syary zwpvT^)8DV*+A0~E>jRn0teL{V-3{1f3n4@ii4sn~m{~#~q9_vl9RXN`)U5A#tk$Ng z)oL{*qfH+25P$l350-tIKR)fBkMr~4Xx3IyEJT#{bT~X6j>lGvbj7k6MhQWi&aLgy zm?fDFU|D*cK(yy3AfE&Xv7-4zU*I7mXuuH);iDlCGAtPxuqP#^2(Bcn_ z6Bo@Egx|6*Qtd#k{_A`Zg1?k%MTeSpNwi1)2@Us!S0wGoo1l6)}b+-~cnG z2#d=#7>x^5jF`-0tJu)kGTfMJ;tWr-fOG#Bb^X-BsUY+)96EIb)UThmWTv?NtTQKw zJTfmONh14s`r-NRaXQ{^F24Kr_y75CfA^c~%Tn9(VZWaa&2&3lta8pNq#=oLU=hM8 zvGE*mPdK5hmuxPaQ%>o#qjwn$omv52+J$on#4pSLQ_tbs;M0oPTM#-yC{DKiB~%Y* z!J20s)Mw*G?Z&A(>$e^Om&_PATp&^ z>v~N0_n*cgRc*u!G&X2!wbt!wv)k=sh{yf2w(0Wv=IZ9{e4G!{9Amn9^?F#ZSKDpX zc5!|2>dmWR99HAz)$I)nU#vGN=k>+Kn|EJd+*}T;@$&N3?VESXVSRadbM@--`gH*= zU)@qluWnx-ro;8^)$7;qD$(=)xEcoH@U+{{(=o@e+wJl=n zZJyg)rq-&&m?WAInXN%ad|33#o?|wEXV^?^umBSy5YI$2>8N0W7#fS~)Dy@IjS!3@ zQvwGdfJY++3Yjpk7AEmY*mH);evxSa3~*u&fD=@$?{7adQK@QN0FXZRwUg|^M=Z-H zS%GTq_+s}fxxLpI5XE9RaAuIlxBx&UR9G}F#J+|ZI`5vO$J6)^*oeF^Qw6cHGEA+< zub2sX)!eM7?)qE_ur6c4vIt((Bn(v|GFx@bu=*xG7@dyb2r>58MwPHq@oj7{gYllY zfkrj$wnWTxDKaSKLs`LT?kOwsxS zO$PP`2V{($>i&2D(arke-Sy4YX0uuihuVI)dp_2Z1YcilFE6*d)+EF>)fgp7fSJ|` zlO%jNJg?WAheu_r29T*R4Jm7D){0i94gk;d@#rZhtj)Bw)`l#@Wgb`g6_`9*?BT=h z&FxeRR85r`ZeiH2?Jym;>q|2VDPCM%&82G7am?$>tJ2g=UteF#rw21lDX&(m^?F-d z8^-weSJ%7UZhzQqL%bN*^Kl}HfbNfn*H_m(7j11luB!T)h@JLHfz8a@w2shoV5d_b z3@|IT+M+xTLIwopKw%M#xk%kySjA8#_9l;bK`5%}LWY1kd$D8Jswo@9XRWGQm6?Ya zXMzILG|zLHOKZNIX*T9S4|P4Hn<0OCVvDim{9(60PRCK=Y8-M3x9jmh<*Ck3Rk7Qx zf&?OEq1qa(Ik^C=W)aA$ZW{Mx-s~t-!k|3E8d(Ho!>pu41|`CgOvncH>{LG|VP<*x ztTrH+8Dj>q!8ykS4^Gi03`I7Yq17W1&)hv`R+pRr0?A_Q#hGyL)WQ1))0GZd%`JD z8AM_f7w=LJ6Jau#^h`o%H(oe5s3)oj0TisuTTcn|#)N356akKXE+7P}DP%9(BA}KU)dJyqvpzbG-BjF9o$Lc4?WrdoDtYzU1Jm z)%x$=y!+kjH=E74Nol=Wt;cc5!zB?R zWsqt+PqXPk^)KJ`r9kq{B$j@>cLsn*lB=l!k)!m)kq*J~&j(Zu>QcfX#zmdL(lbd= z<~hb#ty$ARR7)XdbEQk04HhJfX| z97#yEZ8lp~i&3U|F0C=s<#zS%-Mbhv8DdPAw>LSbAq}hbdbL`|JUXO-gXCcxR_k%K zNqGQqPC3M!he0^3)~giLYPDjK?Zw3~3}%*d-dw;}Ll3t$1v)F2fMXN#0 z194BZ5^Wxz1Ak_OnI#zTe3+(cpPrxA<9IByG9_Yby03K%IgdkRo`KyoJx|9{i+~e{ z%p#zj)qShJww|B>6;dWnpa2xFfPulR!YZJ|k<72InW01(6pWN?W{aQ%b`V>@@(Ep@ zXEP|F&}lRRGZat&5$s5IBx*zvh{Olh85VtevVhZOs1Xt^D7DVpT(}XAIP>d@d*Q!O z;>p7Uj&9>+7%Vgf8F5EJvq>Mod~pA- zssN!;gK;3}LijiHbHWtNS_#%5>`pEQtT9x50pa(=QrVmJN3IjhoPfXZ&!{_?d@;}o zL}YB(3vDVZT4OMUL_7NQG>V74BwU+5PoHX|G!Z9^rr7zgFyYZ`#eLqSLJ4=?S*U$kf|;} zzmqt~<9Fb9dA}pgY@q`!*)hF56lM>|^~}5;`Rwh~DVgE3y~4>^Mnnuz0a~pt8hhcX z1o4%*iMD3s+)^_Gv{WJspsUSgt+mt=V>k4gl(0*W>E?>T0*&GxM9*ud6qpW~=Uw?l39DWUVo?YHMbVsSyXC;|P2Drk8N1 zX@!uG8L0-B=@R?=pFq<*H&Zvm2lr{3MWYY`Wua!Z)>f(#F>`kYxYLRlgj#DUMOC?@ zIeN}8i$JZJ0f-<@amabQ8pk2sKOc4<_q(Z#X?%Wuy1Lj3$)S}0_;gol;TSGLs449a zhr@I%Xci=b1M`-1sdZ}YpgNK?vr14jg$OXQ4nkHP>g27 zXt3_}B(nvJbYd_lhK^ln3G7$_&l#Q2){22qjT9OcGob>}ZMmilX)e;~Dh67@PQ8L= zGh>5#jo-|Z3A_NCxJBcmsc@iX9&IKUfBdd8i4mDKI9 zbpQpFj93UgEsq?WHtjS5k+w85yfDb z$FRG)M$DlLT~g~?ipofUBlillF{?u+%s>=Djnpv({cP2fP@%tFzDDnO`vq_4?U62V zS{0r>>k>maHda8!Jp1AZDj*P*$d}{l_cyoO_2y8f``we4!iu>}Py7Aj(|&i@?b~e7 zRgPnj$ed#o@#UNKh3VN4=2SPG3B8sQ{_{Hh3pnU$V8e7uZae$KfPE1s@JmT3*&^vx zAC!T9y`puItZ-|}EVU|0-#?mxSzZQVMuCNbOml^{A!mh|TCL5RrWhT56(u^f zV45Z`aFYZhI!x1;#}I=z3o2jG`BqFj}UjQ}?L(XFeDUYidQyN!89#YD4Z5P{3 z2uWCC9+ePciX3CgMl=rN#dZrr;0QAoNqLYEL?opoA^HYfST>uDs%q2yVSjmf$sjjI z#}EQb2$9S@y*Chx2uaWTC8sc(`Fy2!bby(;5m(q_px|;?ZCYD}S}CQ>r6;Od?~i%m zQ?}Mht-KJVUqqv-WTs8EHct%*B1@y;8f$V7w-Q8IfJ$h6B1j?1dKfO(+g&|~@LzuV z@$UK1R0A`m*pv=adEOt@bj)F!qN+_z57rbY+MI_OVUuYk8z2fxu0S>t<_1%xMleGm z9El7*{fB^}krE=1;Pe3tU?wc;_j7|iXkjA~LCHTnre-^`!FV8ehA^PQqOgLNK*Hk0 z&R`T4IiV85LVz)lssdJs)YY@F$>9s0y#p2y69!w#M<95=P|z_gqTSO)&|n5Lb$bCc z0F~H{PD(VfT91_C{#-DTS+Hi}Q*#iBZ-3||d*p>z6PCrQKU;n@SL$1o2qLxuDzE`B ztS&M#g^|PH`gzsJ3Qa=_R$)*A!=J2!WG}jnq6p0}W z7vu9Zu~}ew%`wIjQW#STL3p8lzLfu;TXxCLwVl5b1Mu0b<^|H@mzEEYW+m z(~5#f%}9hg^4kJ}s=>p2YHesK=eZOLA;t)`;(0IrQV9U7MI}WgtX8X9N>wwpEJ;PD zxu9DVgoIgJk~jf}{UL^+tlQ0Y$g9?rRZ|*EQ&(~+GlOCt(l8$OyDS_+k`UEk!x))! z%o0)>##)baEqPc+VZcNENLUO8Rgu6c+p?50vk(FiX>0x)4&pIqIcHby#u%N?6WKLO z9$(e@*xjE(E*V++GtYE9A0m4pVrH$8p~Bos?d<;3CC!d>gEh6PO<;l8mTIMG^J!+6 z^t2YhOAqa#ZN@}Vf{U|!KG1(8LoxM*sG2F1L81(8A{XY{001BWNklrCU9eurCy4WwU{blu zyt?@dFzQYOdx1Wf0%RPF-AWRJQ<3PHB|zwWX=U>8vqx12=W+9cGt#7%3Ud z5hCmZGU+D?1-SauhwW-a1vG;Kd-Kl`*2n=C3|Iy+m<*xEFkta?5v;Mh%edbIpV=fl zs-EQ}=OLprzbk`C0}~5GjM?+2H26#j9!FBag&D-_VNkW79`7FxI|Eg7-gyH?kgn5(tcS_mUUsZU#N%mWdpFbeabOd*8LW=qV%!fe#AT5ULT2r)}kt40{}m{S%% z7bOy#FgLY0WbzSX5Ec^WQ4%**BJLqv;#e~<5T#4lPtS=rSt22Zz$c%euq&y=A!};2 zHHC%c&;t`X4T}P?v2SPLNKU_6YOAKIt!Zm8ERNqLtb`DJKCK2bZMB&-^m^a-+kp9+ zf#^ll+-cjVBq;%`{#$p z<6)iT>&tBl>Co(GR;@-u6hSjJZE)rr7)YSh1t~t6U?K=Cfru=VMb|he3lNydsK90- z0%bsq8=;!MB#87~mnvR9u`nyZk=^ZO0`w}zO&0yIRq2#nW58o4ndm5H1_4#KEB3HO zC-;zR1)VA(U2AL7!~Up&7C@QOZ~o8!i-;BK(m7G{zt;>BD4Rl<8x+nNzUqBUh}3Z@33R>ar@%|j;z zR$vJ*k^)kL29{PqYQ!^PT}hclp#&I3Q?Lr;;P(qzZm0}1YmTh*I@S!VN_~8!w%D3K zD?b_5u#~>d3@k1NZ_!0#?7kra0=SS7FmT`?1WFX*CQ(3W0dFUjNPQ z&ELLxog^TK%_?1wtDEgQ=Nu#?2~miH{8D<)%$+#(YbougKeFpm8vR1TN6-_WM<0U@uTXvpw_2+W_8x4je`g=3(uu!Yaj~}T2mADEzeX+ z5}BuCYbGM9EeGBmo&hlkYpYhl3`Jlz=GH8PFwN6!bv-HP{nF=HGo0` z)tsc+!X+16l1mDIG#3=EC_)NLdZ-B~RAvkwZf^GO)x(AAeP$k!=uWAE1QH(Z<~H1` z!#UsagEtUzZ{)f6=5FMjVi$RPVU;nA5qcT31i4A zviDliTR;|}F$QVYN@>2dwzdU8?;VQ6vX)C@9_y*l9Z7P46w%Dq=8G*oGB;#q=|wE9 z8Ers`o~|fLAtTtH&gX55#R=oX@o77sTWjiS&Ec><6hwtD0Uw`}e|L;Hi!#_N{ zyOI9v)vH%`x10Fk;o+YjK5_sWTPUP$=rQ_We<8C#7%fHu2LfioMmTVgo&X~@;3OO< zpK#j|VPu1K#L;yKbnpyo5v!F%FR>6cD+Y)7=vslpNQX)(8uFUV1j+_Ga&+N9wp=0@ zk5EW=+2>9MOxjVq!2^laiS%G8WS#+&=7{L&wFT&}fBoCi>7+a^O|zu(sx{-dEc--y z>L)WV9(lf}X(Gocv01oU%Vy7002)eiLXln6EKh-+1-x^B2nK~=>2v^TU9`kq*N;xR zkYf%C9*qI6${U*lF|x|fg>xP7HWHG@kQjSjIb;cr00@QEI*}E4!~H`shaNG6v$17W zyF2O#7tx0z)JH#WW9u=7`WOo95!$>GJ7YDwTiT8J-P&H=t#5A+uWt{p?`{sOEun|) z{4h@UhxM!bm#<&k->mDhwC3%SlXN8*wkrnQ^XWXk#Qa>_wy$gb>m&6?CPmVfA(C2G_ABhvFubV!PX;sd^RV2{l>cZe9tN7}>3v=R?D!U?^2brqDLhpr~aC4iW zF-&q1i?xdgxw~5{=@PlLCGQq<&po)cW=4!i0!8Yiy_s9f{X+~ahgDLH&CS>4#?85S zv!xx@R6-w?bxD+kC;tp1#=5Ne3%Yw-d|lUF_Ecp@XkFK(wPjhBb;;APKnT*(8qKmN zL`A8vwYJ~=eMD$xHdIq9qZy6YX77v$sehUK#URkkD_#fMB8Tk~&__RSTMpim_Op*A zvjZU1yftsjvgA|b?gZTZa5&_ycwO4k8r@scHNjBIi0Y0Kl-k{r00ba$RBCX>ITR&~x=|lSAhaZkH-rl|V=Jm^$H@73kAKrib{rmTy`jd+XU)&gy5kW5I z&1s-1RULdJ%~EIC2@KN_@kFewN10&f00U@NL70IEYL$CHtu55_L@m*BinTDNNBJDEeX#yl1aBj}Ip0fm9+$z5V0kjx(!ujnM=sHe-`_MG!Pbjfqg5q!dguGOdbGI~#mtnsbt` zZ6Yi);>r?#k@+DY4W87B-Q-2ufQn{`%2~)}*UT9Fpv}&7p5F0O9xz3%X4J^bv|t3UhtCqI4lYF$@NEpN5Onn?=JYyA1Pxwdjmzryn*gDWsI zE|>Zjy8h221R{_AdRneRUOxZw%Y|_jnX`YZJraB#=Vd4>48Z>Xl`4@BGA^ql?G`sp zsVkD)f{2{34uxAyu-q({Y?nO+FZ>~rRFaGxpqX4wBB2F!J~s3*NGvqAwncc-ENhtN zOn2-O33!Q!F~)MZHD^d@t(k>%lPoi!Np95WZZ<}2TVIxzJHaxSwxtRW3BbB68BA*i zpA3zGXwXbAVE*S}StM;^?4Z_M(vBEogwYl^0J*%)Q+w|Yot{yGkuHgnsz~T70)tgs%JpSYN-+y}gwAy%cyRLfmaD4jy z>3Gyu+}d0Vk#1OE3lE!h3Xd_C2uNoPnj^FZNIS9KZ=BIC9XL`R(P#h$U|^?Glmmka zqw;REcAR-xB@)4XaC3FUnoQvw(}hs6!(1w2FqJPPaYEQkSjs`CGnbKO$#1y&h%QuM z>RF%$Zd3WTb)@mbSXNXC{&p&t*ARDZ3@KpPOOs zLZHv{ct1O^ji0RwzKn~hR_k(zVqa)|ksvQ#V&Z{65lVC2Uesd1XfkQG23NnJuJudh zz`!oZ%8+hFl>R3d`?MM>CWp@JZ_FBOCT?5BH_TLGlId;Iq%+_Ubx0YroN7`&T6_B1Uxfy`gJV6(PoXixs=B=62 zJ+*_HV91a{I-k$iNIuIl5+Y)0&3DDrg>D4~`shOeAPbk4T}5Go5u-=XPN3c(Mw@(A zpGkCeJn#YGA)t>SI>2iA-B&F{Lkf(TbB4u97WCHp@Lq4yh8OpP%SZq*lq< zM#S-S8r!Kg_|T!XW^Urg^Y&@$H*GyEOCYvB`q0*O9Q_m{A_Ru{;`G)W%~IeY^$J=+ zXD%S8-kt>1D+DG6nd4)WNQ4m1j!o+I=9K`aZ_pz~!w!BUfEHB71y4zKNDge&85+fZ zo?&|Vt$>WH%*B?n_q}TC_pUpecTRwf%`kO;^Q+%#t~4c5T8!Nxc!P`_7M2ELqv!*c zw^k5?yOSp}xG_^8Mp%;p3=@Tv?PrL4ma2V1iAYHvP{^EcvyLQv+5!Z^;R~<<3k(

}n9BvQuN=jZM9S+J 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�i&ws@+MoaQqc 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 Y0a37=4kN6$y8r+H07*qoM6N<$f}CumeE Date: Fri, 26 Jan 2018 14:17:16 +0100 Subject: [PATCH 434/551] Set imported containers to bedirty so they will get saved CURA-4875 --- cura/Settings/ContainerManager.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index eefc109cbc..21fc3f43c0 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -492,6 +492,7 @@ class ContainerManager(QObject): return { "status": "error", "message": "Permission denied when trying to read the file"} container.setName(container_id) + container.setDirty(True) self._container_registry.addContainer(container) From 211f87bf098b575183670ceef7bbf200b66343d0 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 26 Jan 2018 14:59:47 +0100 Subject: [PATCH 435/551] New format and functionality - Browser is combined with plugin settings - Two tabs, one for viewing 3rd party plugins, one for installed - Enable/disable for bundled plugins - Install/Remove/Update for 3rd party plugins --- plugins/PluginBrowser/PluginBrowser.py | 132 ++++--- plugins/PluginBrowser/PluginBrowser.qml | 502 +++++++----------------- plugins/PluginBrowser/PluginEntry.qml | 473 ++++++++++++++++++++++ 3 files changed, 693 insertions(+), 414 deletions(-) create mode 100644 plugins/PluginBrowser/PluginEntry.qml diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index e1862dc06e..f08eb294e8 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -22,6 +22,8 @@ import platform import zipfile import shutil +from cura.CuraApplication import CuraApplication + i18n_catalog = i18nCatalog("cura") # Architecture thoughts: @@ -76,6 +78,11 @@ class PluginBrowser(QObject, Extension): self._plugins_metadata = [] self._plugins_model = None + # Can be 'installed' or 'availble' + self._view = "available" + + self._restart_required = False + self._dialog = None self._restartDialog = None self._download_progress = 0 @@ -112,6 +119,8 @@ class PluginBrowser(QObject, Extension): pluginsMetadataChanged = pyqtSignal() onDownloadProgressChanged = pyqtSignal() onIsDownloadingChanged = pyqtSignal() + restartRequiredChanged = pyqtSignal() + viewChanged = pyqtSignal() @pyqtSlot(result = str) def getLicenseDialogPluginName(self): @@ -245,6 +254,8 @@ class PluginBrowser(QObject, Extension): self.pluginsMetadataChanged.emit() self.openRestartDialog(result["message"]) + self._restart_required = True + self.restartRequiredChanged.emit() # Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Plugin browser"), result["message"]) @pyqtSlot(str) @@ -254,8 +265,23 @@ class PluginBrowser(QObject, Extension): self._newly_uninstalled_plugin_ids.append(result["id"]) self.pluginsMetadataChanged.emit() + self._restart_required = True + self.restartRequiredChanged.emit() + Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Plugin browser"), result["message"]) + @pyqtSlot(str) + def enablePlugin(self, plugin_id): + self._plugin_registry.enablePlugin(plugin_id) + self.pluginsMetadataChanged.emit() + Logger.log("i", "%s was set as 'active'", id) + + @pyqtSlot(str) + def disablePlugin(self, plugin_id): + self._plugin_registry.disablePlugin(plugin_id) + self.pluginsMetadataChanged.emit() + Logger.log("i", "%s was set as 'deactive'", id) + @pyqtProperty(int, notify = onDownloadProgressChanged) def downloadProgress(self): return self._download_progress @@ -287,51 +313,51 @@ class PluginBrowser(QObject, Extension): self.setDownloadProgress(0) self.setIsDownloading(False) - @pyqtProperty(QObject, notify=pluginsMetadataChanged) + @pyqtSlot(str) + def setView(self, view): + self._view = view + self.viewChanged.emit() + self.pluginsMetadataChanged.emit() + @pyqtProperty(QObject, notify=pluginsMetadataChanged) def pluginsModel(self): - self._plugins_model = PluginsModel() - """ - if self._plugins_model is None: - self._plugins_model = PluginsModel() - else: - self._plugins_model.clear() - items = [] - for metadata in self._plugins_metadata: - items.append({ - "name": metadata["label"], - "id": metadata["id"], - "version": metadata["version"], - "short_description": metadata["short_description"], - "author": metadata["author"], - "author_email": "author@gmail.com", - "status": self._checkInstallStatus(metadata["id"]), - "already_installed": self._checkAlreadyInstalled(metadata["id"]), - "file_location": metadata["file_location"], - # "active": self._checkActive(metadata["id"]), - "enabled": True, - "can_upgrade": self._checkCanUpgrade(metadata["id"], metadata["version"]) - }) - self._plugins_model.setItems(items) - """ + print("Updating plugins model...", self._view) + self._plugins_model = PluginsModel(self._view) + # self._plugins_model.update() + + # Check each plugin the registry for matching plugin from server + # metadata, and if found, compare the versions. Higher version sets + # 'can_upgrade' to 'True': + for plugin in self._plugins_model.items: + if self._checkCanUpgrade(plugin["id"], plugin["version"]): + plugin["can_upgrade"] = True + print(self._plugins_metadata) + + for item in self._plugins_metadata: + if item["id"] == plugin["id"]: + plugin["update_url"] = item["file_location"] + print("Updating from", item["file_location"]) + return self._plugins_model + + def _checkCanUpgrade(self, id, version): - plugin_registry = Application.getInstance().getPluginRegistry() - 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 + + # TODO: This could maybe be done more efficiently using a dictionary... + + # Scan plugin server data for plugin with the given id: + for plugin in self._plugins_metadata: + if id == plugin["id"]: + reg_version = Version(version) + new_version = Version(plugin["version"]) + if new_version > reg_version: + Logger.log("i", "%s has an update availible: %s", plugin["id"], plugin["version"]) + return True return False def _checkAlreadyInstalled(self, id): - plugin_registry = PluginRegistry.getInstance() - metadata = plugin_registry.getMetaData(id) + metadata = self._plugin_registry.getMetaData(id) # We already installed this plugin, but the registry just doesn't know it yet. if id in self._newly_installed_plugin_ids: return True @@ -344,24 +370,14 @@ class PluginBrowser(QObject, Extension): return False def _checkInstallStatus(self, plugin_id): - plugin_registry = PluginRegistry.getInstance() - - # If plugin is registered, it's installed: - if plugin_id in plugin_registry._plugins: + if plugin_id in self._plugin_registry.getInstalledPlugins(): return "installed" else: return "uninstalled" def _checkEnabled(self, id): - 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 + if id in self._plugin_registry.getActivePlugins(): + return True return False def _onRequestFinished(self, reply): @@ -384,7 +400,11 @@ class PluginBrowser(QObject, Extension): if reply_url == self._api_url + "plugins": try: json_data = json.loads(bytes(reply.readAll()).decode("utf-8")) + + # Add metadata to the manager: self._plugins_metadata = json_data + print(self._plugins_metadata) + self._plugin_registry.addExternalPlugins(self._plugins_metadata) self.pluginsMetadataChanged.emit() except json.decoder.JSONDecodeError: Logger.log("w", "Received an invalid print job state message: Not valid JSON.") @@ -410,3 +430,15 @@ class PluginBrowser(QObject, Extension): self._network_manager = QNetworkAccessManager() self._network_manager.finished.connect(self._onRequestFinished) self._network_manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) + + @pyqtProperty(bool, notify=restartRequiredChanged) + def restartRequired(self): + return self._restart_required + + @pyqtProperty(str, notify=viewChanged) + def viewing(self): + return self._view + + @pyqtSlot() + def restart(self): + CuraApplication.getInstance().quit() diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 1a606e114b..229d5c1755 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -11,7 +11,7 @@ import QtQuick.Controls.Styles 1.4 import UM 1.1 as UM -UM.Dialog { +Window { id: base title: catalog.i18nc("@title:tab", "Plugins"); @@ -19,109 +19,154 @@ UM.Dialog { height: 640 * screenScaleFactor minimumWidth: 350 * screenScaleFactor minimumHeight: 350 * screenScaleFactor + color: "white" - Column { - // anchors.fill: parent - height: parent.height - width: parent.width - spacing: UM.Theme.getSize("default_margin").height + Item { + id: view + anchors { + fill: parent + leftMargin: UM.Theme.getSize("default_margin").width + rightMargin: UM.Theme.getSize("default_margin").width + topMargin: UM.Theme.getSize("default_margin").height + bottomMargin: UM.Theme.getSize("default_margin").height + } Rectangle { id: topBar width: parent.width - color: "red" - height: 30 - Text { - text: "Search" + color: "transparent" + height: childrenRect.height + + Row { + spacing: 12 + height: childrenRect.height + width: childrenRect.width + anchors.horizontalCenter: parent.horizontalCenter + + Button { + text: "Install" + style: ButtonStyle { + background: Rectangle { + color: "transparent" + implicitWidth: 96 + implicitHeight: 48 + Rectangle { + visible: manager.viewing == "available" ? true : false + color: UM.Theme.getColor("primary") + anchors.bottom: parent.bottom + width: parent.width + height: 3 + } + } + label: Text { + text: control.text + color: UM.Theme.getColor("text") + font { + pixelSize: 15 + } + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + } + onClicked: manager.setView("available") + } + + Button { + text: "Manage" + style: ButtonStyle { + background: Rectangle { + color: "transparent" + implicitWidth: 96 + implicitHeight: 48 + Rectangle { + visible: manager.viewing == "installed" ? true : false + color: UM.Theme.getColor("primary") + anchors.bottom: parent.bottom + width: parent.width + height: 3 + } + } + label: Text { + text: control.text + color: UM.Theme.getColor("text") + font { + pixelSize: 15 + } + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + } + onClicked: manager.setView("installed") + } } } - /* - Item { - id: topBar - height: childrenRect.height; - width: parent.width - - 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 - enabled: !manager.isDownloading - } - } - */ - // Scroll view breaks in QtQuick.Controls 2.x - Label { - text: "Installed Plugins" - } ScrollView { id: installedPluginList width: parent.width - height: 280 - /* - anchors.top: topBar.bottom - anchors.bottom: availiblePluginList.top - anchors.bottomMargin: UM.Theme.getSize("default_margin").height - */ - frameVisible: true + height: 400 + anchors { + top: topBar.bottom + topMargin: UM.Theme.getSize("default_margin").height + bottom: bottomBar.top + bottomMargin: UM.Theme.getSize("default_margin").height + } + + frameVisible: true ListView { id: pluginList - model: manager.pluginsModel - anchors.fill: parent property var activePlugin - delegate: pluginDelegate - } - } - Label { - text: "Availible plugins..." - } - /* - Rectangle { - width: parent.width - color: "red" - height: 200 - Text { - text: "Plugins not installed yet" - } - } - */ + property var filter: "installed" - // Scroll view breaks in QtQuick.Controls 2.x - ScrollView { - id: availiblePluginList - width: parent.width - /* - anchors.top: installedPluginList.bottom - anchors.bottom: bottomBar.top - anchors.bottomMargin: UM.Theme.getSize("default_margin").height - */ - frameVisible: true - height: 180 + anchors.fill: parent - Rectangle { - width: parent.width - color: "red" - height: 1000 + model: manager.pluginsModel + delegate: PluginEntry {} } } Rectangle { id: bottomBar width: parent.width - height: childrenRect.height; - // anchors.bottom: parent.bottom - // anchors.left: parent.left + height: childrenRect.height + color: "transparent" + anchors.bottom: parent.bottom + + Label { + visible: manager.restartRequired + text: "You will need to restart Cura before changes in plugins have effect." + height: 30 + verticalAlignment: Text.AlignVCenter + } + Button { + id: restartChangedButton + text: "Quit Cura" + anchors.right: closeButton.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width + visible: manager.restartRequired + iconName: "dialog-restart" + onClicked: manager.restart() + style: ButtonStyle { + background: Rectangle { + implicitWidth: 96 + implicitHeight: 30 + color: UM.Theme.getColor("primary") + } + label: Text { + verticalAlignment: Text.AlignVCenter + color: "white" + font { + pixelSize: 13 + bold: true + } + text: control.text + horizontalAlignment: Text.AlignHCenter + } + } + } Button { id: closeButton @@ -133,298 +178,27 @@ UM.Dialog { } base.close(); } - anchors.bottom: parent.bottom anchors.right: parent.right - } - } - - Rectangle { - Component { - id: pluginDelegate - - Rectangle { - width: pluginList.width; - height: 102 - color: index % 2 ? UM.Theme.getColor("secondary") : "white" - - // Plugin info - Column { - id: pluginInfo - height: parent.height - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.top: parent.top - anchors.topMargin: UM.Theme.getSize("default_margin").height - anchors.right: authorInfo.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width - - Label { - text: model.name - width: parent.width - height: 24 - wrapMode: Text.WordWrap - verticalAlignment: Text.AlignVCenter - font { - pixelSize: 13 - bold: true - } - // color: model.enabled ? UM.Theme.getColor("text") : UM.Theme.getColor("secondary") - color: UM.Theme.getColor("text") - } - - Label { - text: model.short_description - width: parent.width - height: 72 - wrapMode: Text.WordWrap + style: ButtonStyle { + background: Rectangle { + color: "transparent" + implicitWidth: 96 + implicitHeight: 30 + border { + width: 1 + color: UM.Theme.getColor("lining") } } - - // Author info - Column { - id: authorInfo - width: 192 - height: parent.height - - - anchors.top: parent.top - anchors.topMargin: UM.Theme.getSize("default_margin").height - - anchors.right: pluginActions.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width - - Label { - text: model.author - width: parent.width - height: 24 - wrapMode: Text.WordWrap - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignRight - } - - Label { - text: model.author_email - width: parent.width - height: 72 - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignRight - } - } - - // Plugin actions - Row { - id: pluginActions - width: 180 + UM.Theme.getSize("default_margin").width - height: parent.height - anchors { - top: parent.top - right: parent.right - topMargin: UM.Theme.getSize("default_margin").height - rightMargin: UM.Theme.getSize("default_margin").width - } - layoutDirection: Qt.RightToLeft - spacing: UM.Theme.getSize("default_margin").width - - Rectangle { - id: removeControls - visible: model.already_installed - width: 108 - height: 30 - color: "transparent" - Button { - id: removeButton - text: "Remove" - enabled: { - if ( manager.isDownloading && pluginList.activePlugin == model ) { - return false; - } else { - return true; - } - } - onClicked: { - manager.removePlugin(model.id); - } - style: ButtonStyle { - background: Rectangle { - color: white - implicitWidth: 108 - implicitHeight: 30 - border { - width: 1 - color: "grey" - } - } - label: Text { - verticalAlignment: Text.AlignVCenter - color: "grey" - text: control.text - horizontalAlignment: Text.AlignLeft - } - } - } - Button { - id: removeDropDown - property bool open: false - UM.RecolorImage { - anchors.centerIn: parent - height: 10 - width: 10 - source: UM.Theme.getIcon("arrow_bottom") - color: "grey" - } - enabled: { - if ( model.required || ( manager.isDownloading && pluginList.activePlugin == model )) { - return false; - } else { - return true; - } - } - anchors.right: parent.right - style: ButtonStyle { - background: Rectangle { - color: "transparent" - implicitWidth: 30 - implicitHeight: 30 - } - label: Text { - verticalAlignment: Text.AlignVCenter - color: "grey" - text: control.text - horizontalAlignment: Text.AlignHCenter - } - } - - - - // For the disable option: - // onClicked: pluginList.model.setEnabled(model.id, checked) - - onClicked: { - if ( !removeDropDown.open ) { - removeDropDown.open = true - } - else { - removeDropDown.open = false - } - } - } - - Rectangle { - id: divider - width: 1 - height: parent.height - anchors.right: removeDropDown.left - color: "grey" - } - - Column { - id: options - anchors { - top: removeButton.bottom - left: parent.left - right: parent.right - } - height: childrenRect.height - visible: removeDropDown.open - - Button { - text: "Disable" - height: 30 - width: parent.width - onClicked: { - removeDropDown.open = false - model.setEnabled(model.id, checked) - } - } - } - } - - Button { - id: updateButton - visible: model.already_installed && model.can_upgrade - // visible: model.already_installed - text: { - // If currently downloading: - if ( manager.isDownloading && pluginList.activePlugin == model ) { - return catalog.i18nc( "@action:button", "Cancel" ); - } else { - return catalog.i18nc("@action:button", "Update"); - } - } - style: ButtonStyle { - background: Rectangle { - color: UM.Theme.getColor("primary") - implicitWidth: 72 - implicitHeight: 30 - // radius: 4 - } - label: Text { - verticalAlignment: Text.AlignVCenter - color: "white" - text: control.text - horizontalAlignment: Text.AlignHCenter - } - } - } - Button { - id: installButton - visible: !model.already_installed - text: { - // If currently downloading: - if ( manager.isDownloading && pluginList.activePlugin == model ) { - return catalog.i18nc( "@action:button", "Cancel" ); - } else { - return catalog.i18nc("@action:button", "Install"); - } - } - onClicked: { - if ( manager.isDownloading && pluginList.activePlugin == model ) { - manager.cancelDownload(); - } else { - pluginList.activePlugin = model; - manager.downloadAndInstallPlugin( model.file_location ); - } - } - style: ButtonStyle { - background: Rectangle { - color: UM.Theme.getColor("primary") - implicitWidth: 72 - implicitHeight: 30 - // radius: 4 - } - label: Text { - verticalAlignment: Text.AlignVCenter - color: "white" - text: control.text - horizontalAlignment: Text.AlignHCenter - } - } - } - ProgressBar { - id: progressbar - minimumValue: 0; - maximumValue: 100 - anchors.left: installButton.left - anchors.right: installButton.right - anchors.top: installButton.bottom - anchors.topMargin: 4 - value: manager.isDownloading ? manager.downloadProgress : 0 - visible: manager.isDownloading && pluginList.activePlugin == model - style: ProgressBarStyle { - background: Rectangle { - color: "lightgray" - implicitHeight: 6 - } - progress: Rectangle { - color: UM.Theme.getColor("primary") - } - } - } - + label: Text { + verticalAlignment: Text.AlignVCenter + color: "grey" + text: control.text + horizontalAlignment: Text.AlignHCenter } } } } + UM.I18nCatalog { id: catalog; name: "cura" } Connections { diff --git a/plugins/PluginBrowser/PluginEntry.qml b/plugins/PluginBrowser/PluginEntry.qml new file mode 100644 index 0000000000..d53e839094 --- /dev/null +++ b/plugins/PluginBrowser/PluginEntry.qml @@ -0,0 +1,473 @@ +// Copyright (c) 2017 Ultimaker B.V. +// PluginBrowser is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Dialogs 1.1 +import QtQuick.Window 2.2 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 + +// TODO: Switch to QtQuick.Controls 2.x and remove QtQuick.Controls.Styles + +import UM 1.1 as UM + +Component { + id: pluginDelegate + + Rectangle { + + // Don't show required plugins as they can't be managed anyway: + height: !model.required ? 84 : 0 + visible: !model.required ? true : false + color: "transparent" + anchors { + left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width + } + + + // Bottom border: + Rectangle { + color: UM.Theme.getColor("lining") + width: parent.width + height: 1 + anchors.bottom: parent.bottom + } + + // Plugin info + Column { + id: pluginInfo + + property var color: model.enabled ? UM.Theme.getColor("text") : UM.Theme.getColor("lining") + + // Styling: + height: parent.height + anchors { + left: parent.left + top: parent.top + topMargin: UM.Theme.getSize("default_margin").height + right: authorInfo.left + rightMargin: UM.Theme.getSize("default_margin").width + } + + + Label { + text: model.name + width: parent.width + height: 24 + wrapMode: Text.WordWrap + verticalAlignment: Text.AlignVCenter + font { + pixelSize: 13 + bold: true + } + color: pluginInfo.color + } + + Text { + text: model.description + width: parent.width + height: 36 + clip: true + wrapMode: Text.WordWrap + color: pluginInfo.color + elide: Text.ElideRight + } + } + + // Author info + Column { + id: authorInfo + width: 192 + height: parent.height + anchors { + top: parent.top + topMargin: UM.Theme.getSize("default_margin").height + right: pluginActions.left + rightMargin: UM.Theme.getSize("default_margin").width + } + + Label { + text: ""+model.author+"" + width: parent.width + height: 24 + wrapMode: Text.WordWrap + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + onLinkActivated: Qt.openUrlExternally("mailto:"+model.author_email+"?Subject=Cura: "+model.name+" Plugin") + color: model.enabled ? UM.Theme.getColor("text") : UM.Theme.getColor("lining") + } + } + + // Plugin actions + Row { + id: pluginActions + + width: 96 + height: parent.height + anchors { + top: parent.top + right: parent.right + topMargin: UM.Theme.getSize("default_margin").height + } + layoutDirection: Qt.RightToLeft + spacing: UM.Theme.getSize("default_margin").width + + // For 3rd-Party Plugins: + Button { + id: installButton + text: { + if ( manager.isDownloading && pluginList.activePlugin == model ) { + return catalog.i18nc( "@action:button", "Cancel" ); + } else { + if (model.can_upgrade) { + return catalog.i18nc("@action:button", "Update"); + } + return catalog.i18nc("@action:button", "Install"); + } + } + visible: model.external && ((model.status !== "installed") || model.can_upgrade) + style: ButtonStyle { + background: Rectangle { + implicitWidth: 96 + implicitHeight: 30 + color: "transparent" + border { + width: 1 + color: UM.Theme.getColor("lining") + } + } + label: Label { + text: control.text + color: UM.Theme.getColor("text") + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + } + onClicked: { + if ( manager.isDownloading && pluginList.activePlugin == model ) { + manager.cancelDownload(); + } else { + pluginList.activePlugin = model; + if ( model.can_upgrade ) { + manager.downloadAndInstallPlugin( model.update_url ); + } else { + manager.downloadAndInstallPlugin( model.update_url ); + } + + } + } + } + Button { + id: removeButton + text: "Uninstall" + visible: model.external && model.status == "installed" + enabled: !manager.isDownloading + style: ButtonStyle { + background: Rectangle { + implicitWidth: 96 + implicitHeight: 30 + color: "transparent" + border { + width: 1 + color: UM.Theme.getColor("lining") + } + } + label: Text { + text: control.text + color: UM.Theme.getColor("text") + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + } + onClicked: manager.removePlugin( model.id ) + } + + // For Ultimaker Plugins: + Button { + id: enableButton + text: "Enable" + visible: !model.external && model.enabled == false + style: ButtonStyle { + background: Rectangle { + implicitWidth: 96 + implicitHeight: 30 + color: "transparent" + border { + width: 1 + color: UM.Theme.getColor("lining") + } + } + label: Text { + text: control.text + color: UM.Theme.getColor("text") + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + } + onClicked: { + manager.enablePlugin(model.id); + } + } + Button { + id: disableButton + text: "Disable" + visible: !model.external && model.enabled == true + style: ButtonStyle { + background: Rectangle { + implicitWidth: 96 + implicitHeight: 30 + color: "transparent" + border { + width: 1 + color: UM.Theme.getColor("lining") + } + } + label: Text { + text: control.text + color: UM.Theme.getColor("text") + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + } + onClicked: { + manager.disablePlugin(model.id); + } + } + /* + Rectangle { + id: removeControls + visible: model.status == "installed" && model.enabled + width: 96 + height: 30 + color: "transparent" + Button { + id: removeButton + text: "Disable" + enabled: { + if ( manager.isDownloading && pluginList.activePlugin == model ) { + return false; + } else if ( model.required ) { + return false; + } else { + return true; + } + } + onClicked: { + manager.disablePlugin(model.id); + } + style: ButtonStyle { + background: Rectangle { + color: "white" + implicitWidth: 96 + implicitHeight: 30 + border { + width: 1 + color: UM.Theme.getColor("lining") + } + } + label: Text { + verticalAlignment: Text.AlignVCenter + color: "grey" + text: control.text + horizontalAlignment: Text.AlignLeft + } + } + } + Button { + id: removeDropDown + property bool open: false + UM.RecolorImage { + anchors.centerIn: parent + height: 10 + width: 10 + source: UM.Theme.getIcon("arrow_bottom") + color: "grey" + } + enabled: { + if ( manager.isDownloading && pluginList.activePlugin == model ) { + return false; + } else if ( model.required ) { + return false; + } else { + return true; + } + } + anchors.right: parent.right + style: ButtonStyle { + background: Rectangle { + color: "transparent" + implicitWidth: 30 + implicitHeight: 30 + } + label: Text { + verticalAlignment: Text.AlignVCenter + color: "grey" + text: control.text + horizontalAlignment: Text.AlignHCenter + } + } + + + + // For the disable option: + // onClicked: pluginList.model.setEnabled(model.id, checked) + + onClicked: { + if ( !removeDropDown.open ) { + removeDropDown.open = true + } + else { + removeDropDown.open = false + } + } + } + + Rectangle { + id: divider + width: 1 + height: parent.height + anchors.right: removeDropDown.left + color: UM.Theme.getColor("lining") + } + + Column { + id: options + anchors { + top: removeButton.bottom + left: parent.left + right: parent.right + } + height: childrenRect.height + visible: removeDropDown.open + + Button { + id: disableButton + text: "Remove" + height: 30 + width: parent.width + onClicked: { + removeDropDown.open = false; + manager.removePlugin( model.id ); + } + } + } + } + */ + /* + Button { + id: enableButton + visible: !model.enabled && model.status == "installed" + onClicked: manager.enablePlugin( model.id ); + + text: "Enable" + style: ButtonStyle { + background: Rectangle { + color: "transparent" + implicitWidth: 96 + implicitHeight: 30 + border { + width: 1 + color: UM.Theme.getColor("lining") + } + } + label: Text { + verticalAlignment: Text.AlignVCenter + color: UM.Theme.getColor("text") + text: control.text + horizontalAlignment: Text.AlignHCenter + } + } + } + + Button { + id: updateButton + visible: model.status == "installed" && model.can_upgrade && model.enabled + // visible: model.already_installed + text: { + // If currently downloading: + if ( manager.isDownloading && pluginList.activePlugin == model ) { + return catalog.i18nc( "@action:button", "Cancel" ); + } else { + return catalog.i18nc("@action:button", "Update"); + } + } + style: ButtonStyle { + background: Rectangle { + color: UM.Theme.getColor("primary") + implicitWidth: 96 + implicitHeight: 30 + // radius: 4 + } + label: Text { + verticalAlignment: Text.AlignVCenter + color: "white" + text: control.text + horizontalAlignment: Text.AlignHCenter + } + } + } + Button { + id: externalControls + visible: model.status == "available" ? true : false + text: { + // If currently downloading: + if ( manager.isDownloading && pluginList.activePlugin == model ) { + return catalog.i18nc( "@action:button", "Cancel" ); + } else { + return catalog.i18nc("@action:button", "Install"); + } + } + onClicked: { + if ( manager.isDownloading && pluginList.activePlugin == model ) { + manager.cancelDownload(); + } else { + pluginList.activePlugin = model; + manager.downloadAndInstallPlugin( model.file_location ); + } + } + style: ButtonStyle { + background: Rectangle { + color: "transparent" + implicitWidth: 96 + implicitHeight: 30 + border { + width: 1 + color: UM.Theme.getColor("lining") + } + } + label: Text { + verticalAlignment: Text.AlignVCenter + color: "grey" + text: control.text + horizontalAlignment: Text.AlignHCenter + } + } + } + */ + ProgressBar { + id: progressbar + minimumValue: 0; + maximumValue: 100 + anchors.left: installButton.left + anchors.right: installButton.right + anchors.top: installButton.bottom + anchors.topMargin: 4 + value: manager.isDownloading ? manager.downloadProgress : 0 + visible: manager.isDownloading && pluginList.activePlugin == model + style: ProgressBarStyle { + background: Rectangle { + color: "lightgray" + implicitHeight: 6 + } + progress: Rectangle { + color: UM.Theme.getColor("primary") + } + } + } + + } + } +} From d299786de709d8991096a1dff0fe1024a019b623 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 26 Jan 2018 15:41:39 +0100 Subject: [PATCH 436/551] Convert g-code to bytes before writing it to archive Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 0335230321..1419c5d74c 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -3,6 +3,7 @@ from charon.VirtualFile import VirtualFile #To open UFP files. from charon.OpenMode import OpenMode #To indicate that we want to write to UFP files. +from io import StringIO #For converting g-code to bytes. import os.path #To get the placeholder kitty icon. from UM.Mesh.MeshWriter import MeshWriter #The writer we need to implement. @@ -15,8 +16,10 @@ class UFPWriter(MeshWriter): #Store the g-code from the scene. archive.addContentType(extension = "gcode", mime_type = "text/x-gcode") + gcode_textio = StringIO() #We have to convert the g-code into bytes. + PluginRegistry.getInstance().getPluginObject("GCodeWriter").write(gcode_textio, None) gcode = archive.getStream("/3D/model.gcode") - PluginRegistry.getInstance().getPluginObject("GCodeWriter").write(gcode, None) + gcode.write(gcode_textio.getvalue().encode("UTF-8")) archive.addRelation(target = "/3D/model.gcode", file_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") #Store the thumbnail. From b6c7a0829fefe2df7a460254948140a1d469566b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 26 Jan 2018 15:43:14 +0100 Subject: [PATCH 437/551] Use virtual_path parameter instead of target This parameter was renamed. Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 1419c5d74c..aeae433faf 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -20,11 +20,11 @@ class UFPWriter(MeshWriter): PluginRegistry.getInstance().getPluginObject("GCodeWriter").write(gcode_textio, None) gcode = archive.getStream("/3D/model.gcode") gcode.write(gcode_textio.getvalue().encode("UTF-8")) - archive.addRelation(target = "/3D/model.gcode", file_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") + archive.addRelation(virtual_path = "/3D/model.gcode", file_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") #Store the thumbnail. #TODO: Generate the thumbnail image. Below is just a placeholder. archive.addContentType(extension = "png", mime_type = "image/png") thumbnail = archive.getStream("/Metadata/thumbnail.png") thumbnail.write(os.path.join(os.path.basename(__file__), "kitten.png")) - archive.addRelation(target = "/Metadata/thumbnail.png", file_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") \ No newline at end of file + archive.addRelation(virtual_path = "/Metadata/thumbnail.png", file_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") \ No newline at end of file From 20b903855fdf33dfab33f00c2758a94110577a5f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 26 Jan 2018 16:15:30 +0100 Subject: [PATCH 438/551] Close streams before opening the next Because zipfile can't handle multiple open streams at the same time. Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index aeae433faf..c13fb44be3 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -20,6 +20,7 @@ class UFPWriter(MeshWriter): PluginRegistry.getInstance().getPluginObject("GCodeWriter").write(gcode_textio, None) gcode = archive.getStream("/3D/model.gcode") gcode.write(gcode_textio.getvalue().encode("UTF-8")) + gcode.close() archive.addRelation(virtual_path = "/3D/model.gcode", file_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") #Store the thumbnail. @@ -27,4 +28,5 @@ class UFPWriter(MeshWriter): archive.addContentType(extension = "png", mime_type = "image/png") thumbnail = archive.getStream("/Metadata/thumbnail.png") thumbnail.write(os.path.join(os.path.basename(__file__), "kitten.png")) + thumbnail.close() archive.addRelation(virtual_path = "/Metadata/thumbnail.png", file_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") \ No newline at end of file From e3e8e8b17001eb0dd7e565dd83d6293ecce901f8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 26 Jan 2018 16:21:01 +0100 Subject: [PATCH 439/551] Fix opening kitty file Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index c13fb44be3..a48a6a794e 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -27,6 +27,6 @@ class UFPWriter(MeshWriter): #TODO: Generate the thumbnail image. Below is just a placeholder. archive.addContentType(extension = "png", mime_type = "image/png") thumbnail = archive.getStream("/Metadata/thumbnail.png") - thumbnail.write(os.path.join(os.path.basename(__file__), "kitten.png")) + thumbnail.write(open(os.path.join(os.path.dirname(__file__), "kitten.png"), "rb").read()) thumbnail.close() archive.addRelation(virtual_path = "/Metadata/thumbnail.png", file_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") \ No newline at end of file From 6f833051f847faeadadf9b589c265a0b501929e0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 26 Jan 2018 16:28:34 +0100 Subject: [PATCH 440/551] Close archive after writing It gets flushed then and everything. Contributes to issue CURA-4972. --- plugins/UFPWriter/UFPWriter.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index a48a6a794e..06c3cce14e 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -29,4 +29,6 @@ class UFPWriter(MeshWriter): thumbnail = archive.getStream("/Metadata/thumbnail.png") thumbnail.write(open(os.path.join(os.path.dirname(__file__), "kitten.png"), "rb").read()) thumbnail.close() - archive.addRelation(virtual_path = "/Metadata/thumbnail.png", file_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") \ No newline at end of file + archive.addRelation(virtual_path = "/Metadata/thumbnail.png", file_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") + + archive.close() \ No newline at end of file From 757f83fad2b81977ba13abe89a308b653f6fb88f Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 26 Jan 2018 17:06:36 +0100 Subject: [PATCH 441/551] Change download source `update_url` is used only for updaitng plugins (when `file_location` refers to a place on the hard drive). --- plugins/PluginBrowser/PluginBrowser.py | 1 - plugins/PluginBrowser/PluginEntry.qml | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index f08eb294e8..23c1bafe61 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -336,7 +336,6 @@ class PluginBrowser(QObject, Extension): for item in self._plugins_metadata: if item["id"] == plugin["id"]: plugin["update_url"] = item["file_location"] - print("Updating from", item["file_location"]) return self._plugins_model diff --git a/plugins/PluginBrowser/PluginEntry.qml b/plugins/PluginBrowser/PluginEntry.qml index d53e839094..85fc0b91b8 100644 --- a/plugins/PluginBrowser/PluginEntry.qml +++ b/plugins/PluginBrowser/PluginEntry.qml @@ -64,6 +64,7 @@ Component { bold: true } color: pluginInfo.color + } Text { @@ -154,7 +155,7 @@ Component { if ( model.can_upgrade ) { manager.downloadAndInstallPlugin( model.update_url ); } else { - manager.downloadAndInstallPlugin( model.update_url ); + manager.downloadAndInstallPlugin( model.file_location ); } } From a40d13b50e3b0f3f2028515a1910f68ac27ecc8b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 29 Jan 2018 09:50:12 +0100 Subject: [PATCH 442/551] Update translation templates for Cura 3.2 Contributes to issue CURA-4883. --- resources/i18n/cura.pot | 1553 ++++++++++++++--------- resources/i18n/fdmextruder.def.json.pot | 6 +- resources/i18n/fdmprinter.def.json.pot | 488 ++++--- 3 files changed, 1314 insertions(+), 733 deletions(-) diff --git a/resources/i18n/cura.pot b/resources/i18n/cura.pot index be6613ebf5..08d81f0b00 100644 --- a/resources/i18n/cura.pot +++ b/resources/i18n/cura.pot @@ -1,12 +1,12 @@ # Cura -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: Cura 3.1\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "" @@ -55,12 +55,11 @@ msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -100,7 +99,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "" @@ -115,80 +114,85 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "" "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "" "Unable to start a new job because the printer does not support usb printing." msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -232,11 +236,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "" @@ -286,7 +290,7 @@ msgid "Removable Drive" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "" @@ -406,37 +410,37 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "" @@ -444,12 +448,12 @@ msgid "" "performed on the printer." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 msgctxt "@label" msgid "" "There is a mismatch between the configuration or calibration of the printer " @@ -457,65 +461,65 @@ msgid "" "that are inserted in your printer." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "" "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "" "The PrintCores and/or materials on your printer differ from those within " @@ -544,80 +548,84 @@ msgid "" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "" "{printer_name} is reserved to print '{job_name}'. Please change the " "printer's configuration to match the job, for it to start printing." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "" "Unable to send new print job: this 3D printer is not (yet) set up to host a " "group of connected Ultimaker 3 printers." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "" "@info Don't translate {machine_name}, since it gets replaced by a printer " @@ -627,74 +635,118 @@ msgid "" "update the firmware on your printer." msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" msgid "" -"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!" +"SolidWorks reported errors, while opening your file. We recommend to solve " +"these issues inside SolidWorks itself." msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content " +"again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only " +"support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That " +"means that either SolidWorks is not installed or you don't own an valid " +"license. Please make sure that running SolidWorks itself works without " +"issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than " +"Windows. This plugin will only work on Windows with SolidWorks installed, " +"including an valid license. Please install this plugin on a Windows machine " +"with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" +msgid "Layer view" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "" -"Cura collects anonymised slicing statistics. You can disable this in the " -"preferences." +msgid "Cura collects anonymized usage statistics." msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 @@ -704,7 +756,27 @@ msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "" +"Allow Cura to send anonymized usage statistics to help prioritize future " +"improvements to Cura. Some of your preferences and settings are sent, the " +"Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "" +"Don't allow Cura to send anonymized usage statistics. You can enable it " +"again in the preferences." msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 @@ -712,6 +784,18 @@ msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -743,23 +827,23 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "" "Unable to slice with the current material as it is incompatible with the " "selected machine or configuration." msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "" @@ -767,7 +851,7 @@ msgid "" "errors: {0}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "" @@ -775,13 +859,13 @@ msgid "" "errors on one or more models: {error_labels}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "" "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "" "Nothing to slice because none of the models fit the build volume. Please " @@ -789,12 +873,12 @@ msgid "" msgstr "" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "" @@ -836,14 +920,14 @@ msgid "" "UGII_USER_DIR for Siemens NX." msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "" @@ -854,24 +938,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "" @@ -886,18 +970,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 msgctxt "@info:generic" msgid "" "Make sure the g-code is suitable for your printer and printer configuration " @@ -910,6 +994,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -941,111 +1035,90 @@ msgctxt "@action" msgid "Level build plate" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "" @@ -1053,34 +1126,29 @@ msgid "" "overwrite it?" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "" "The selected material is incompatible with the selected machine or " "configuration." msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1103,14 +1171,14 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "" "Failed to export profile to {0}: {1}" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "" @@ -1118,21 +1186,20 @@ msgid "" "failure." msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "" @@ -1140,35 +1207,62 @@ msgid "" "message>" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "" +"This profile {0} contains incorrect data, could not " +"import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "" +"The machine defined in profile {0} doesn't match with " +"your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "" +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" msgid "" @@ -1181,126 +1275,151 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

A fatal exception has occurred. Please send us this Crash Report to " -"fix the problem

\n" +"

A fatal error has occurred. Please send us this Crash Report to fix " +"the problem

\n" "

Please use the \"Send report\" button to post a bug report " "automatically to our servers

\n" " " msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
" -msgstr "" - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
" +msgctxt "@label Cura version number" +msgid "Cura version" msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
" +msgctxt "@label Type of platform" +msgid "Platform" msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
" +msgctxt "@label" +msgid "Qt version" msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
" +msgctxt "@label" +msgid "PyQt version" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" +msgid "Error traceback" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "" "@info 'width', 'depth' and 'height' are variable names that must NOT be " @@ -1308,19 +1427,19 @@ msgctxt "" msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "" @@ -1349,12 +1468,11 @@ msgstr "" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "" @@ -1459,70 +1577,69 @@ msgid "" "gantry when printing \"One at a Time\"." msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 +msgctxt "@label" +msgid "Start Gcode" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very start." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 +msgctxt "@label" +msgid "End Gcode" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very end." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 +msgctxt "@label" +msgid "Nozzle Settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 msgctxt "@tooltip" msgid "" "The nominal diameter of filament supported by the printer. The exact " "diameter will be overridden by the material and/or the profile." msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 -msgctxt "@label" -msgid "Start Gcode" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 -msgctxt "@tooltip" -msgid "Gcode commands to be executed at the very start." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 -msgctxt "@label" -msgid "End Gcode" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 -msgctxt "@tooltip" -msgid "Gcode commands to be executed at the very end." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 -msgctxt "@label" -msgid "Nozzle Settings" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "" @@ -1535,8 +1652,9 @@ msgstr "" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1621,7 +1739,7 @@ msgstr "" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "" @@ -1645,12 +1763,12 @@ msgid "Type" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" msgstr "" @@ -1696,8 +1814,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1718,6 +1834,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1748,11 +1869,16 @@ msgid "Available" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1844,138 +1970,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" +msgid "SolidWorks: Export wizard" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" +msgid "Quality:" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" +msgid "Fine (3D-printing)" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" +msgid "Coarse (3D-printing)" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" +msgid "Fine (SolidWorks)" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" +msgid "Coarse (SolidWorks)" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" +msgid "Show this dialog again" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "" @@ -2000,7 +2238,7 @@ msgctxt "@label" msgid "Settings" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "" @@ -2079,23 +2317,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "" @@ -2467,66 +2735,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "" @@ -2559,19 +2827,19 @@ msgid "Customized" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "" @@ -2606,72 +2874,72 @@ msgctxt "@label" msgid "Brand" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "" @@ -2712,7 +2980,7 @@ msgid "Unit" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "" @@ -2727,197 +2995,197 @@ msgctxt "@label" msgid "Language:" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "" "You will need to restart the application for these changes to have effect." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "" "Highlight unsupported areas of the model in red. Without support these areas " "will not print properly." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "" "Moves the camera so the model is in the center of the view when a model is " "selected" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "" "Should models on the platform be moved so that they no longer intersect?" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "" "Should a prefix based on the printer name be added to the print job name " "automatically?" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 msgctxt "@info:tooltip" msgid "" "When you have made changes to a profile and switched to a different one, a " @@ -2925,27 +3193,27 @@ msgid "" "not, or you can choose a default behaviour and never show that dialog again." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 msgctxt "@info:tooltip" msgid "" "Should anonymous data about your print be sent to Ultimaker? Note, no " @@ -2953,20 +3221,47 @@ msgid "" "stored." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "" +"Should newly loaded models be arranged on the build plate? Used in " +"conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "" @@ -3009,7 +3304,7 @@ msgid "Waiting for a printjob" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "" @@ -3035,13 +3330,13 @@ msgid "Duplicate" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "" @@ -3109,7 +3404,7 @@ msgid "Export Profile" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "" @@ -3126,62 +3421,62 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "" "Could not import material %1: %2" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "" "Failed to export material to %1: %2" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "" @@ -3308,12 +3603,7 @@ msgctxt "@label" msgid "Profile:" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the " @@ -3322,37 +3612,37 @@ msgid "" "Click to open the profile manager." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated " @@ -3361,29 +3651,29 @@ msgid "" "Click to make these settings visible." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" msgid "" "This setting is always shared between all extruders. Changing it here will " -"change the value for all extruders" +"change the value for all extruders." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 msgctxt "@label" msgid "" "This setting has a value that is different from the profile.\n" @@ -3391,7 +3681,7 @@ msgid "" "Click to restore the value of the profile." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" msgid "" "This setting is normally calculated, but it currently has an absolute value " @@ -3400,77 +3690,77 @@ msgid "" "Click to restore the calculated value." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " +msgid "Time specification" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "" "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is " "print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "" "Recommended Print Setup

    Print with the recommended settings " "for the selected printer, material and quality." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "" "Custom Print Setup

    Print with finegrained control over every " "last bit of the slicing process." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "" @@ -3480,6 +3770,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3492,14 +3792,14 @@ msgid_plural "Print Selected Models With:" msgstr[0] "" msgstr[1] "" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "" msgstr[1] "" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "" @@ -3515,7 +3815,7 @@ msgid "No printer connected" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "" @@ -3632,254 +3932,294 @@ msgctxt "@label" msgid "Estimated time left" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" +msgid "&3D View" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "" msgstr[1] "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "" msgstr[1] "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "" msgstr[1] "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "" @@ -3902,116 +4242,116 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" +msgid "Save &Project..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 msgctxt "@text:window" msgid "" "We have found one or more G-Code files within the files you have selected. " @@ -4039,89 +4379,74 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "" "A custom profile is currently active. To enable the quality slider, choose a " "default quality profile in Custom tab" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "" "You have modified some profile settings. If you want to change these go to " "custom mode." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "" "Gradual infill will gradually increase the amount of infill towards the top." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "" "Generate structures to support parts of the model which have overhangs. " "Without these structures, such parts would collapse during printing." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 msgctxt "@label" msgid "" "Select which extruder to use for support. This will build up supporting " @@ -4129,19 +4454,19 @@ msgid "" "mid air." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "" "Need help improving your prints?
    Read the Ultimaker " @@ -4160,7 +4485,7 @@ msgctxt "@title:window" msgid "Open project file" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 msgctxt "@text:window" msgid "" "This is a Cura project file. Would you like to open it as a project or " @@ -4168,11 +4493,16 @@ msgid "" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "" @@ -4182,21 +4512,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" +msgid "Check compatibility" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "" +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "" @@ -4290,6 +4635,26 @@ msgctxt "name" msgid "USB printing" msgstr "" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4310,6 +4675,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4323,8 +4698,8 @@ msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "" -"Gives you the possibility to open certain files via SolidWorks itself. These " -"are then converted and loaded into Cura" +"Gives you the possibility to open certain files using SolidWorks itself. " +"Conversion is done by this plugin and additional optimizations." msgstr "" #: CuraSolidWorksPlugin/plugin.json @@ -4392,6 +4767,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4552,6 +4937,18 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "" +"Allows material manufacturers to create new material and quality profiles " +"using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." diff --git a/resources/i18n/fdmextruder.def.json.pot b/resources/i18n/fdmextruder.def.json.pot index af77729254..454d324874 100644 --- a/resources/i18n/fdmextruder.def.json.pot +++ b/resources/i18n/fdmextruder.def.json.pot @@ -1,11 +1,11 @@ # Cura JSON setting files -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.1\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" diff --git a/resources/i18n/fdmprinter.def.json.pot b/resources/i18n/fdmprinter.def.json.pot index 9d5ef93fc3..126c02a207 100644 --- a/resources/i18n/fdmprinter.def.json.pot +++ b/resources/i18n/fdmprinter.def.json.pot @@ -1,11 +1,11 @@ # Cura JSON setting files -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.1\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" @@ -377,6 +377,18 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "" +"Whether to use firmware retract commands (G10/G11) instead of using the E " +"property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -651,38 +663,6 @@ msgid "" "adhesion to the build plate easier." msgstr "" -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "" -"How to slice layers with diagonal surfaces. The areas of a layer can be " -"generated based on where the middle of the layer intersects the surface " -"(Middle). Alternatively each layer can have the areas which fall inside of " -"the volume throughout the height of the layer (Exclusive) or a layer has the " -"areas which fall inside anywhere within the layer (Inclusive). Exclusive " -"retains the most details, Inclusive makes for the best fit and Middle takes " -"the least time to process." -msgstr "" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -729,16 +709,6 @@ msgid "" "Width of a single wall line for all wall lines except the outermost one." msgstr "" -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "" - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -937,47 +907,6 @@ msgid "" "sufficient to generate higher quality top surfaces." msgstr "" -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "" -"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)." -msgstr "" - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1130,6 +1059,20 @@ msgid "" "outside of the model." msgstr "" +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "" +"Optimize the order in which walls are printed so as to reduce the number of " +"retractions and the distance travelled. Most parts will benefit from this " +"being enabled but some may actually take longer so please compare the print " +"time estimates with and without optimization." +msgstr "" + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1212,6 +1155,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1656,7 +1609,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." +msgid "The infill pattern is moved this distance along the X axis." msgstr "" #: fdmprinter.def.json @@ -1666,7 +1619,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." +msgid "The infill pattern is moved this distance along the Y axis." msgstr "" #: fdmprinter.def.json @@ -1691,8 +1644,9 @@ 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." +"The amount of overlap between the infill and the walls as a percentage of " +"the infill line width. A slight overlap allows the walls to connect firmly " +"to the infill." msgstr "" #: fdmprinter.def.json @@ -1716,9 +1670,9 @@ msgstr "" msgctxt "skin_overlap description" msgid "" "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." +"skin 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." msgstr "" #: fdmprinter.def.json @@ -1927,18 +1881,6 @@ msgctxt "material description" msgid "Material" msgstr "" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -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 "" - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1998,18 +1940,6 @@ msgid "" "of printing." msgstr "" -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "" -"Data linking material flow (in mm3 per second) to temperature (degrees " -"Celsius)." -msgstr "" - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -2030,8 +1960,8 @@ 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." +"The temperature used for the heated build plate. If this is 0, the bed " +"temperature will not be adjusted." msgstr "" #: fdmprinter.def.json @@ -3962,6 +3892,18 @@ msgid "" "roofs, a lower value results in flattened tower roofs." msgstr "" +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +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 "" + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -4699,20 +4641,6 @@ msgid "" "everything else fails to produce proper GCode." msgstr "" -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "" -"The minimum size of a line segment after slicing. If you increase this, the " -"mesh will have a lower resolution. This may allow the printer to keep up " -"with the speed it has to process g-code and will increase slice speed by " -"removing details of the mesh that it can't process anyway." -msgstr "" - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4897,18 +4825,6 @@ msgid "" "structure." msgstr "" -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -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 "" - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -5005,17 +4921,239 @@ msgid "experimental!" msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" +msgctxt "support_tree_enable label" +msgid "Tree Support" msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" +msgctxt "support_tree_enable description" msgid "" -"Optimize the order in which walls are printed so as to reduce the number of " -"retractions and the distance travelled. Most parts will benefit from this " -"being enabled but some may actually take longer so please compare the print " -"time estimates with and without optimization." +"Generate a tree-like support with branches that support your print. This may " +"reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "" +"The angle of the branches. Use a lower angle to make them more vertical and " +"more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "" +"How far apart the branches need to be when they touch the model. Making this " +"distance small will cause the tree support to touch the model at more " +"points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "" +"The diameter of the thinnest branches of tree support. Thicker branches are " +"more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "" +"The angle of the branches' diameter as they gradually become thicker towards " +"the bottom. An angle of 0 will cause the branches to have uniform thickness " +"over their length. A bit of an angle can increase stability of the tree " +"support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "" +"Resolution to compute collisions with to avoid hitting the model. Setting " +"this lower will produce more accurate trees that fail less often, but " +"increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "" +"The thickness of the walls of the branches of tree support. Thicker walls " +"take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "" +"The number of walls of the branches of tree support. Thicker walls take " +"longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "" +"How to slice layers with diagonal surfaces. The areas of a layer can be " +"generated based on where the middle of the layer intersects the surface " +"(Middle). Alternatively each layer can have the areas which fall inside of " +"the volume throughout the height of the layer (Exclusive) or a layer has the " +"areas which fall inside anywhere within the layer (Inclusive). Exclusive " +"retains the most details, Inclusive makes for the best fit and Middle takes " +"the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "" + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "" +"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)." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "" +"When enabled, the order in which the infill lines are printed is optimized " +"to reduce the distance travelled. The reduction in travel time achieved very " +"much depends on the model being sliced, infill pattern, density, etc. Note " +"that, for some models that have many small areas of infill, the time to " +"slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +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 "" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "" +"Data linking material flow (in mm3 per second) to temperature (degrees " +"Celsius)." +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "" +"The minimum size of a line segment after slicing. If you increase this, the " +"mesh will have a lower resolution. This may allow the printer to keep up " +"with the speed it has to process g-code and will increase slice speed by " +"removing details of the mesh that it can't process anyway." msgstr "" #: fdmprinter.def.json @@ -5745,6 +5883,52 @@ msgid "" "applies to Wire Printing." msgstr "" +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "" +"Adaptive layers computes the layer heights depending on the shape of the " +"model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "" +"The difference in height of the next layer height compared to the previous " +"one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "" +"Threshold whether to use a smaller layer or not. This number is compared to " +"the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" From 58dc6e2b0f09cee229286f8ec3db7a4bfee64ffd Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 29 Jan 2018 10:37:47 +0100 Subject: [PATCH 443/551] Add new strings to each translation This merges the updated translation templates (.pot) into the existing translations (.po). Contributes to issue CURA-4883. --- resources/i18n/de_DE/cura.po | 1761 +++++++----- resources/i18n/de_DE/fdmextruder.def.json.po | 6 +- resources/i18n/de_DE/fdmprinter.def.json.po | 444 +++- resources/i18n/es_ES/cura.po | 1761 +++++++----- resources/i18n/es_ES/fdmextruder.def.json.po | 6 +- resources/i18n/es_ES/fdmprinter.def.json.po | 444 +++- resources/i18n/fi_FI/cura.po | 1621 +++++++---- resources/i18n/fi_FI/fdmextruder.def.json.po | 4 +- resources/i18n/fi_FI/fdmprinter.def.json.po | 414 ++- resources/i18n/fr_FR/cura.po | 1761 +++++++----- resources/i18n/fr_FR/fdmextruder.def.json.po | 6 +- resources/i18n/fr_FR/fdmprinter.def.json.po | 444 +++- resources/i18n/it_IT/cura.po | 1761 +++++++----- resources/i18n/it_IT/fdmextruder.def.json.po | 6 +- resources/i18n/it_IT/fdmprinter.def.json.po | 444 +++- resources/i18n/ja_JP/cura.po | 1738 +++++++----- resources/i18n/ja_JP/fdmextruder.def.json.po | 6 +- resources/i18n/ja_JP/fdmprinter.def.json.po | 466 +++- resources/i18n/ko_KR/cura.po | 1771 +++++++----- resources/i18n/ko_KR/fdmextruder.def.json.po | 4 +- resources/i18n/ko_KR/fdmprinter.def.json.po | 430 ++- resources/i18n/nl_NL/cura.po | 1761 +++++++----- resources/i18n/nl_NL/fdmextruder.def.json.po | 6 +- resources/i18n/nl_NL/fdmprinter.def.json.po | 436 ++- resources/i18n/pl_PL/cura.po | 1718 +++++++----- resources/i18n/pl_PL/fdmextruder.def.json.po | 4 +- resources/i18n/pl_PL/fdmprinter.def.json.po | 426 ++- resources/i18n/pt_BR/cura.po | 1718 +++++++----- resources/i18n/pt_BR/fdmextruder.def.json.po | 4 +- resources/i18n/pt_BR/fdmprinter.def.json.po | 426 ++- resources/i18n/pt_PT/cura.po | 1710 +++++++----- resources/i18n/pt_PT/fdmextruder.def.json.po | 11 +- resources/i18n/pt_PT/fdmprinter.def.json.po | 436 ++- resources/i18n/ru_RU/cura.po | 1761 +++++++----- resources/i18n/ru_RU/fdmextruder.def.json.po | 6 +- resources/i18n/ru_RU/fdmprinter.def.json.po | 444 +++- resources/i18n/tr_TR/cura.po | 1761 +++++++----- resources/i18n/tr_TR/fdmextruder.def.json.po | 6 +- resources/i18n/tr_TR/fdmprinter.def.json.po | 444 +++- resources/i18n/zh_CN/cura.po | 1761 +++++++----- resources/i18n/zh_CN/fdmextruder.def.json.po | 6 +- resources/i18n/zh_CN/fdmprinter.def.json.po | 444 +++- resources/i18n/zh_TW/cura.po | 2233 +++++++++------- resources/i18n/zh_TW/fdmextruder.def.json.po | 24 +- resources/i18n/zh_TW/fdmprinter.def.json.po | 2510 ++++++------------ 45 files changed, 22281 insertions(+), 13073 deletions(-) diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index 211e75c2bc..6ade867317 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: German\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "Geräteeinstellungen" @@ -53,12 +53,11 @@ msgstr "Zu Doodle3D Connect verbinden" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -98,7 +97,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Doodle3D Connect Web-Schnittstelle öffnen" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Änderungsprotokoll anzeigen" @@ -113,78 +112,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "Das Profil wurde geglättet und aktiviert." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "USB-Drucken" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "Über USB drucken" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "Über USB drucken" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "Über USB verbunden" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Es kann kein neuer Auftrag gestartet werden, da der Drucker beschäftigt oder nicht angeschlossen ist." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "Drucker nicht verfügbar" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Der Drucker unterstützt keinen USB-Druck, da er die UltiGCode-Variante verwendet." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "USB-Drucken" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Es kann kein neuer Auftrag gestartet werden, da der Drucker keinen Druck über USB unterstützt." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "Warnhinweis" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "Die Firmware kann nicht aktualisiert werden, da keine Drucker angeschlossen sind." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "Die für den Drucker unter %s erforderliche Firmware wurde nicht gefunden." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "Drucker-Firmware" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -228,11 +232,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Konnte nicht auf dem Wechseldatenträger gespeichert werden {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "Fehler" @@ -282,7 +286,7 @@ msgid "Removable Drive" msgstr "Wechseldatenträger" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Drucken über Netzwerk" @@ -396,110 +400,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "Druckerstatus" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Es kann kein neuer Druckauftrag gestartet werden. Kein PrintCore in Steckplatz {0} geladen." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Es kann kein neuer Druckauftrag gestartet werden. Kein Material in Steckplatz {0} geladen." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Material für Spule {0} unzureichend." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Abweichender PrintCore (Cura: {0}, Drucker: {1}) für Extruder {2} gewählt" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Abweichendes Material (Cura: {0}, Drucker: {1}) für Extruder {2} gewählt" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "PrintCore {0} ist nicht korrekt kalibriert. XY-Kalibrierung muss auf dem Drucker ausgeführt werden." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Möchten Sie wirklich mit der gewählten Konfiguration drucken?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "Anforderungen zwischen der Druckerkonfiguration oder -kalibrierung und Cura stimmen nicht überein. Für optimale Ergebnisse schneiden Sie stets für die PrintCores und Materialien, die in Ihren Drucker eingelegt wurden." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Konfiguration nicht übereinstimmend" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "Das Senden neuer Aufträge ist (vorübergehend) blockiert; der vorherige Druckauftrag wird noch gesendet." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Daten werden zum Drucker gesendet" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "Daten werden gesendet" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Daten können nicht zum Drucker gesendet werden. Ist noch ein weiterer Auftrag in Bearbeitung?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Drucken wird abgebrochen..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Drucken wurde abgebrochen. Den Drucker überprüfen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Drucken wird pausiert..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Drucken wird fortgesetzt..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Synchronisieren Ihres Druckers" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Möchten Sie Ihre aktuelle Druckerkonfiguration in Cura verwenden?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "Die PrintCores und/oder Materialien auf Ihrem Drucker unterscheiden sich von denen Ihres aktuellen Projekts. Für optimale Ergebnisse schneiden Sie stets für die PrintCores und Materialien, die in Ihren Drucker eingelegt wurden." @@ -520,145 +524,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "{printer_name} hat den Druck von '{job_name}‘ beendet. Bitte holen Sie den Druck ab und bestätigen Sie das Räumen des Druckbetts." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} ist für das Drucken von '{job_name}‘ reserviert. Bitte ändern Sie die Druckerkonfiguration passend für den Auftrag, um mit dem Drucken zu beginnen." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Es kann kein neuer Druckauftrag gesendet werden: Dieser 3D-Drucker ist (noch) nicht für das Hosten einer Gruppe verbundener Ultimaker 3-Drucker eingerichtet." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Es können keine Druckaufträge an die Gruppe {cluster_name} gesendet werden." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "{file_name} wurde an Gruppe {cluster_name} gesendet." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "Druckaufträge anzeigen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "Öffnet die Schaltfläche für Druckaufträge in Ihrem Browser." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "Unbekannt" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "Drucker '{printer_name}' hat '{job_name}' vollständig gedrückt." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "Druck vollendet" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "Handlung erforderlich" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "{file_name} wird an Gruppe {cluster_name} gesendet" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "Anschluss über Netzwerk" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "Für Ihren {machine_name} sind neue Funktionen verfügbar! Es wird empfohlen, ein Firmware-Update für Ihren Drucker auszuführen." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Neue Firmware für %s verfügbar" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "Anleitung für die Aktualisierung" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "Zugriff auf Update-Informationen nicht möglich." -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "Beim Öffnen Ihrer SolidWorks Datei trat ein Fehler auf! Überprüfen Sie bitte, ob sich Ihre Datei in SolidWorks ohne Probleme öffnen lässt!" +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "SolidWorks Teiledatei" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "SolidWorks Einbaudatei" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "Konfigurieren" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "Fehler beim Starten %s!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "Simulationsansicht" +msgid "Layer view" +msgstr "Schichtenansicht" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "Cura zeigt die Schichten nicht akkurat an, wenn Wire Printing aktiviert ist." -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "Simulationsansicht" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "G-Code ändern" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "Cura erfasst anonymisierte Slice-Informationen. Sie können dies in den Einstellungen deaktivieren." +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -667,14 +714,41 @@ msgstr "Daten werden erfasst" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "Verwerfen" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Cura 15.04-Profile" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -706,49 +780,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "GIF-Bilddatei" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "Slicing mit dem aktuellen Material nicht möglich, da es mit der gewählten Maschine oder Konfiguration nicht kompatibel ist." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "Slicing nicht möglich" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Die aktuellen Einstellungen lassen kein Schneiden (Slicing) zu. Die folgenden Einstellungen sind fehlerhaft:{0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "Aufgrund der Pro-Modell-Einstellungen ist kein Schneiden (Slicing) möglich. Die folgenden Einstellungen sind für ein oder mehrere Modelle fehlerhaft: {error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Schneiden (Slicing) ist nicht möglich, da der Einzugsturm oder die Einzugsposition(en) ungültig ist (sind)." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Es ist kein Objekt zum Schneiden vorhanden, da keines der Modelle der Druckabmessung entspricht. Bitte die Modelle passend skalieren oder drehen." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "Schichten werden verarbeitet" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "Informationen" @@ -785,14 +859,14 @@ msgstr "Siemens NX Plugin-Dateien konnten nicht kopiert werden. Überprüfen Sie msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Siemens NX Plugin konnte nicht installiert werden. Umgebungsvariable UGII_USER_DIR für Siemens NX konnte nicht zugewiesen werden." -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "Empfohlen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "Benutzerdefiniert" @@ -803,24 +877,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF-Datei" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "Düse" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Plugin-ID von {0} wurde nicht erhalten" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "Warnhinweis" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "Plugin-Browser" @@ -835,18 +909,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G-Datei" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "G-Code parsen" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "G-Code-Details" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "Stellen Sie sicher, dass der G-Code für Ihren Drucker und Ihre Druckerkonfiguration geeignet ist, bevor Sie die Datei senden. Der Darstellung des G-Codes ist möglicherweise nicht korrekt." @@ -857,6 +931,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Cura-Profil" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -888,142 +972,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "Druckbett nivellieren" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Außenwand" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Innenwände" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "Außenhaut" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "Füllung" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "Stützstruktur-Füllung" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "Stützstruktur-Schnittstelle" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "Stützstruktur" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "Skirt" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "Bewegungen" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "Einzüge" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "Sonstige" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "Unbekannt" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Vorgeschnittene Datei {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "Kein Material geladen" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "Unbekanntes Material" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "Neue Position für Objekte finden" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "Position finden" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "Innerhalb der Druckabmessung für alle Objekte konnte keine Position gefunden werden" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "Kann Position nicht finden" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "Datei bereits vorhanden" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "Die Datei {0} ist bereits vorhanden. Soll die Datei wirklich überschrieben werden?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "Benutzerdefiniert" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "Benutzerdefiniertes Material" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "Global" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "Nicht überschrieben" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Das gewählte Material ist mit der gewählten Maschine oder Konfiguration nicht kompatibel." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1044,67 +1102,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Änderung des Materialdurchmessers rückgängig machen" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Export des Profils nach {0} fehlgeschlagen: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Export des Profils nach {0} fehlgeschlagen: Fehlermeldung von Writer-Plugin" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Profil wurde nach {0} exportiert" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "Export erfolgreich ausgeführt" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Import des Profils aus Datei {0} fehlgeschlagen: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Profil erfolgreich importiert {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Profil {0} hat einen unbekannten Dateityp oder ist beschädigt." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "Benutzerdefiniertes Profil" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Für das Profil fehlt eine Qualitätsangabe." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "Es konnte keine Qualitätsangabe {0} für die vorliegende Konfiguration gefunden werden." +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1115,142 +1195,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "Produktabmessungen" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Objekte vervielfältigen und platzieren" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "Objekt-Platzierung" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "Innerhalb der Druckabmessung für alle Objekte konnte keine Position gefunden werden" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "Neue Position für Objekte finden" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "Position finden" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "Kann Position nicht finden" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "Crash-Bericht" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    Ein schwerer Ausnahmefehler ist aufgetreten. Senden Sie uns diesen Absturzbericht, um das Problem zu beheben

    \n

    Verwenden Sie bitte die Schaltfläche „Bericht senden“, um den Fehlerbericht automatisch an unsere Server zu senden

    \n " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "Systeminformationen" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "Unbekannt" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Cura-Version: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "Plattform: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Qt-Version: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "PyQt-Version: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • OpenGL-Version: {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • OpenGL-Anbieter: {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • OpenGL-Renderer: {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "Ausnahme-Rückverfolgung" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "Protokolle" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "Benutzerbeschreibung" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "Bericht senden" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Geräte werden geladen..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Die Szene wird eingerichtet..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Die Benutzeroberfläche wird geladen..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Es kann nur jeweils ein G-Code gleichzeitig geladen werden. Wichtige {0} werden übersprungen." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Wenn G-Code geladen wird, kann keine weitere Datei geöffnet werden. Wichtige {0} werden übersprungen." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "Das gewählte Modell war zu klein zum Laden." @@ -1279,12 +1384,11 @@ msgstr "X (Breite)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1374,68 +1478,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "Der Höhenunterschied zwischen der Düsenspitze und dem Brückensystem (X- und Y-Achsen). Wird verwendet, um Kollisionen zwischen vorherigen Drucken und der Brücke zu verhindern, wenn im Modus „Nacheinander“ gedruckt wird." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "Anzahl Extruder" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "Der Nenndurchmesser des durch den Drucker unterstützten Filaments. Der exakte Durchmesser wird durch das Material und/oder das Profil überschrieben." - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "Materialdurchmesser" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "Düsengröße" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "G-Code starten" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "G-Code-Befehle, die zum Start ausgeführt werden sollen." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "G-Code beenden" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "G-Code-Befehle, die am Ende ausgeführt werden sollen." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "Düseneinstellungen" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Düsengröße" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "Der Nenndurchmesser des durch den Drucker unterstützten Filaments. Der exakte Durchmesser wird durch das Material und/oder das Profil überschrieben." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "X-Versatz Düse" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Y-Versatz Düse" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "G-Code Extruder-Start" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "G-Code Extruder-Ende" @@ -1448,8 +1551,9 @@ msgstr "Änderungsprotokoll" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1514,7 +1618,10 @@ 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 "Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n\nWählen Sie Ihren Drucker aus der folgenden Liste:" +msgstr "" +"Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n" +"\n" +"Wählen Sie Ihren Drucker aus der folgenden Liste:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1530,7 +1637,7 @@ msgstr "Bearbeiten" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "Entfernen" @@ -1552,14 +1659,14 @@ msgid "Type" msgstr "Typ" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Extended" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1603,8 +1710,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "Geben Sie die IP-Adresse oder den Hostnamen Ihres Druckers auf dem Netzwerk ein." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1625,6 +1730,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 ist nicht für das Hosten einer Gruppe verbundener Ultimaker 3-Drucker eingerichtet" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1655,11 +1765,16 @@ msgid "Available" msgstr "Verfügbar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "Verbindung zum Drucker wurde unterbrochen" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1751,138 +1866,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "Konfiguration aktivieren" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Cura SolidWorks Plugin-Konfiguration" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "Standardqualität des exportierten STL:" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "Immer nachfragen" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "Immer Qualität „Fein“ verwenden" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "Immer Qualität „Grob“ verwenden" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "SolidWorks-Datei importieren als STL ..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "Qualität des exportierten STL" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "Qualität" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "Grob" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "Fein" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "Meine Auswahl merken" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "Speichern" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "Farbschema" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "Materialfarbe" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "Linientyp" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "Vorschub" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "Schichtdicke" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "Kompatibilitätsmodus" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "Bewegungen anzeigen" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "Helfer anzeigen" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "Gehäuse anzeigen" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "Füllung anzeigen" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "Nur obere Schichten anzeigen" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "5 detaillierte Schichten oben anzeigen" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "Oben/Unten" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "Innenwand" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "min." -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "max." @@ -1907,7 +2134,7 @@ msgctxt "@label" msgid "Settings" msgstr "Einstellungen" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Aktive Skripts Nachbearbeitung ändern" @@ -1982,23 +2209,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "Glättung" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "Einstellungen wählen" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "Einstellungen für die benutzerdefinierte Anpassung dieses Modells wählen" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "Filtern..." -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "Alle anzeigen" @@ -2166,7 +2423,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Dieses Plugin enthält eine Lizenz.\nSie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\nStimmen Sie den nachfolgenden Bedingungen zu?" +msgstr "" +"Dieses Plugin enthält eine Lizenz.\n" +"Sie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\n" +"Stimmen Sie den nachfolgenden Bedingungen zu?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2357,66 +2617,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "Alles ist in Ordnung! Der Check-up ist abgeschlossen." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "Nicht mit einem Drucker verbunden" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "Drucker nimmt keine Befehle an" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "In Wartung. Den Drucker überprüfen" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Es wird gedruckt..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Pausiert" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Vorbereitung läuft..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "Bitte den Ausdruck entfernen" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "Zurückkehren" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "Pausieren" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "Drucken abbrechen" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "Drucken abbrechen" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "Soll das Drucken wirklich abgebrochen werden?" @@ -2431,7 +2691,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Sie haben einige Profileinstellungen angepasst.\nMöchten Sie diese Einstellungen übernehmen oder verwerfen?" +msgstr "" +"Sie haben einige Profileinstellungen angepasst.\n" +"Möchten Sie diese Einstellungen übernehmen oder verwerfen?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2449,19 +2711,19 @@ msgid "Customized" msgstr "Angepasst" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "Stets nachfragen" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "Verwerfen und zukünftig nicht mehr nachfragen" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "Übernehmen und zukünftig nicht mehr nachfragen" @@ -2496,72 +2758,72 @@ msgctxt "@label" msgid "Brand" msgstr "Marke" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "Materialtyp" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "Farbe" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "Eigenschaften" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "Dichte" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "Durchmesser" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "Filamentkosten" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "Filamentgewicht" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "Filamentlänge" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "Kosten pro Meter" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "Dieses Material ist mit %1 verknüpft und teilt sich damit einige seiner Eigenschaften" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "Material trennen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "Beschreibung" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "Haftungsinformationen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "Druckeinstellungen" @@ -2602,7 +2864,7 @@ msgid "Unit" msgstr "Einheit" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "Allgemein" @@ -2617,230 +2879,255 @@ msgctxt "@label" msgid "Language:" msgstr "Sprache:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "Währung:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "Thema:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "Die Anwendung muss neu gestartet werden, um die Änderungen zu übernehmen." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "Bei Änderung der Einstellungen automatisch schneiden." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "Automatisch schneiden" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "Viewport-Verhalten" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "Nicht gestützte Bereiche des Modells in rot hervorheben. Ohne Support werden diese Bereiche nicht korrekt gedruckt." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "Überhang anzeigen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "Bewegt die Kamera, bis sich das Modell im Mittelpunkt der Ansicht befindet, wenn ein Modell ausgewählt wurde" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "Zentrieren Sie die Kamera, wenn das Element ausgewählt wurde" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "Soll das standardmäßige Zoom-Verhalten von Cura umgekehrt werden?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "Kehren Sie die Richtung des Kamera-Zooms um." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "Soll das Zoomen in Richtung der Maus erfolgen?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "In Mausrichtung zoomen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "Sollen Modelle auf der Plattform so verschoben werden, dass sie sich nicht länger überschneiden?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "Stellen Sie sicher, dass die Modelle getrennt gehalten werden" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "Sollen Modelle auf der Plattform so nach unten verschoben werden, dass sie die Druckplatte berühren?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "Setzt Modelle automatisch auf der Druckplatte ab" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "Warnmeldung im G-Code-Reader anzeigen." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "Warnmeldung in G-Code-Reader" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "Soll die Schicht in den Kompatibilitätsmodus gezwungen werden?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "Schichtenansicht Kompatibilitätsmodus erzwingen (Neustart erforderlich)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "Dateien öffnen und speichern" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "Sollen Modelle an das Erstellungsvolumen angepasst werden, wenn sie zu groß sind?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "Große Modelle anpassen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "Ein Modell kann extrem klein erscheinen, wenn seine Maßeinheit z. B. in Metern anstelle von Millimetern angegeben ist. Sollen diese Modelle hoch skaliert werden?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "Extrem kleine Modelle skalieren" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "Soll ein Präfix anhand des Druckernamens automatisch zum Namen des Druckauftrags hinzugefügt werden?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "Geräte-Präfix zu Auftragsnamen hinzufügen." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "Soll beim Speichern einer Projektdatei eine Zusammenfassung angezeigt werden?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "Dialog Zusammenfassung beim Speichern eines Projekts anzeigen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "Standardverhalten beim Öffnen einer Projektdatei" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "Standardverhalten beim Öffnen einer Projektdatei: " -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "Immer nachfragen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "Immer als Projekt öffnen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "Modelle immer importieren" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "Wenn Sie Änderungen für ein Profil vorgenommen haben und zu einem anderen Profil gewechselt sind, wird ein Dialog angezeigt, der hinterfragt, ob Sie Ihre Änderungen beibehalten möchten oder nicht; optional können Sie ein Standardverhalten wählen, sodass dieser Dialog nicht erneut angezeigt wird." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "Profil überschreiben" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "Privatsphäre" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "Soll Cura bei Programmstart nach Updates suchen?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "Bei Start nach Updates suchen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "Sollen anonyme Daten über Ihren Druck an Ultimaker gesendet werden? Beachten Sie, dass keine Modelle, IP-Adressen oder andere personenbezogene Daten gesendet oder gespeichert werden." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "(Anonyme) Druckinformationen senden" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "Drucker" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "Aktivieren" @@ -2883,7 +3170,7 @@ msgid "Waiting for a printjob" msgstr "Warten auf einen Druckauftrag" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "Profile" @@ -2909,13 +3196,13 @@ msgid "Duplicate" msgstr "Duplizieren" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 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:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "Export" @@ -2981,7 +3268,7 @@ msgid "Export Profile" msgstr "Profil exportieren" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "Materialien" @@ -2996,60 +3283,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "Drucker: %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "Erstellen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "Duplizieren" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "Material importieren" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr "Material konnte nicht importiert werden %1: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "Material wurde erfolgreich importiert %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "Material exportieren" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "Exportieren des Materials nach %1: %2 schlug fehl" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "Material erfolgreich nach %1 exportiert" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "Drucker hinzufügen" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "Druckername:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "Drucker hinzufügen" @@ -3074,7 +3361,9 @@ 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 wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\nCura verwendet mit Stolz die folgenden Open Source-Projekte:" +msgstr "" +"Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\n" +"Cura verwendet mit Stolz die folgenden Open Source-Projekte:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3176,158 +3465,167 @@ msgctxt "@label" msgid "Profile:" msgstr "Profil:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "Kein Profil verfügbar" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 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 "Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n\nKlicken Sie, um den Profilmanager zu öffnen." +msgstr "" +"Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n" +"\n" +"Klicken Sie, um den Profilmanager zu öffnen." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "Suchen..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Werte für alle Extruder kopieren" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Diese Einstellung ausblenden" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Diese Einstellung ausblenden" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Diese Einstellung weiterhin anzeigen" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Sichtbarkeit der Einstellung wird konfiguriert..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n\nKlicken Sie, um diese Einstellungen sichtbar zu machen." +msgstr "" +"Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n" +"\n" +"Klicken Sie, um diese Einstellungen sichtbar zu machen." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "Hat Einfluss auf" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "Wird beeinflusst von" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "Diese Einstellung wird stets zwischen allen Extrudern geteilt. Eine Änderung ändert den Wert für alle Extruder" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "Der Wert wird von Pro-Extruder-Werten gelöst " -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 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 "Diese Einstellung hat einen vom Profil abweichenden Wert.\n\nKlicken Sie, um den Wert des Profils wiederherzustellen." +msgstr "" +"Diese Einstellung hat einen vom Profil abweichenden Wert.\n" +"\n" +"Klicken Sie, um den Wert des Profils wiederherzustellen." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 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 "Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n\nKlicken Sie, um den berechneten Wert wiederherzustellen." +msgstr "" +"Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n" +"\n" +"Klicken Sie, um den berechneten Wert wiederherzustellen." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Druckeinrichtung" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Druckeinrichtung deaktiviert\nG-Code-Dateien können nicht geändert werden" +msgstr "" +"Druckeinrichtung deaktiviert\n" +"G-Code-Dateien können nicht geändert werden" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00 Stunden 00 Minuten" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "Zeitangabe
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "Kostenangabe" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1 m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1 g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "Insgesamt:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Empfohlene Druckeinrichtung

    Drucken mit den empfohlenen Einstellungen für den gewählten Drucker, das gewählte Material und die gewählte Qualität." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Benutzerdefinierte Druckeinrichtung

    Druck mit Feineinstellung über jedem einzelnen Bereich des Schneidvorgangs." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automatisch: %1" @@ -3337,6 +3635,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Ansicht" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3349,14 +3657,14 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Ausgewähltes Modell drucken mit:" msgstr[1] "Ausgewählte Modelle drucken mit:" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Ausgewähltes Modell multiplizieren" msgstr[1] "Ausgewählte Modelle multiplizieren" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "Anzahl Kopien" @@ -3372,7 +3680,7 @@ msgid "No printer connected" msgstr "Es ist kein Drucker verbunden" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "Extruder" @@ -3482,254 +3790,294 @@ msgctxt "@label" msgid "Estimated time left" msgstr "Geschätzte verbleibende Zeit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Umschalten auf Vo&llbild-Modus" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Rückgängig machen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Wiederholen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Beenden" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "&Kameraposition zurücksetzen" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura konfigurieren..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Drucker hinzufügen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Dr&ucker verwalten..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Materialien werden verwaltet..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Profil mit aktuellen Einstellungen/Überschreibungen aktualisieren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Aktuelle Änderungen verwerfen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Profil von aktuellen Einstellungen/Überschreibungen erstellen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profile verwalten..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Online-&Dokumentation anzeigen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "&Fehler melden" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&Über..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "&Ausgewähltes Modell löschen" msgstr[1] "&Ausgewählte Modelle löschen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Ausgewähltes Modell zentrieren" msgstr[1] "Ausgewählte Modelle zentrieren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Ausgewähltes Modell multiplizieren" msgstr[1] "Ausgewählte Modelle multiplizieren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Modell löschen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Modell auf Druckplatte ze&ntrieren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Modelle &gruppieren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Gruppierung für Modelle aufheben" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Modelle &zusammenführen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "Modell &multiplizieren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "Alle Modelle &wählen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "Druckplatte &reinigen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Alle Modelle neu &laden" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Alle Modelle anordnen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Anordnung auswählen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Alle Modellpositionen zurücksetzen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Alle Modell&transformationen zurücksetzen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Datei(en) öffnen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Neues Projekt..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Engine-&Protokoll anzeigen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Konfigurationsordner anzeigen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Sichtbarkeit einstellen wird konfiguriert..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "Plugins durchsuchen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "Installierte plugins..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Bitte laden Sie ein 3D-Modell" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Bereit zum Slicen (Schneiden)" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Das Slicing läuft..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Bereit zum %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Slicing nicht möglich" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Slicing ist nicht verfügbar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Vorbereiten" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Abbrechen" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Wählen Sie das aktive Ausgabegerät" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "Datei(en) öffnen" @@ -3749,114 +4097,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Datei" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "Auswahl als Datei &speichern" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Speichern &Als" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "Projekt speichern" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Bearbeiten" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "&Ansicht" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "&Einstellungen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "Dr&ucker" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "&Material" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Als aktiven Extruder festlegen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "Er&weiterungen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "&Plugins" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "E&instellungen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Hilfe" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "Datei öffnen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "Einstellungen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "Neues Projekt" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "Möchten Sie wirklich ein neues Projekt beginnen? Damit werden das Druckbett und alle nicht gespeicherten Einstellungen gelöscht." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "Plugin installieren" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "Datei(en) öffnen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "Es wurden eine oder mehrere G-Code-Datei(en) innerhalb der von Ihnen gewählten Dateien gefunden. Sie können nur eine G-Code-Datei auf einmal öffnen. Wenn Sie eine G-Code-Datei öffnen möchten wählen Sie bitte nur eine Datei." @@ -3881,97 +4229,82 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Projektzusammenfassung beim Speichern nicht erneut anzeigen" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "Speichern" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "Vorbereiten" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "Überwachen" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "Schichtdicke" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "Ein benutzerdefiniertes Profil ist derzeit aktiv. Wählen Sie ein voreingestelltes Qualitätsprofil aus der Registerkarte „Benutzerdefiniert“, um den Schieberegler für Qualität zu aktivieren." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "Druckgeschwindigkeit" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "Langsamer" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "Schneller" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "Sie haben einige Profileinstellungen geändert. Wenn Sie diese ändern möchten, wechseln Sie in den Modus „Benutzerdefiniert“." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "Füllung" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Die graduelle Füllung steigert die Menge der Füllung nach oben hin schrittweise." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "Graduell aktivieren" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "Stützstruktur generieren" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Damit werden Strukturen zur Unterstützung von Modellteilen mit Überhängen generiert. Ohne diese Strukturen würden solche Teile während des Druckvorgangs zusammenfallen." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "Extruder für Stützstruktur" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "Wählen Sie, welcher Extruder für die Unterstützung verwendet wird. Dient zum Konstruieren von Stützstrukturen unter dem Modell, damit dieses nicht absinkt oder frei schwebend gedruckt wird." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Druckplattenhaftung" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "Drucken eines Brim- oder Raft-Elements aktivieren. Es wird ein flacher Bereich rund um oder unter Ihrem Objekt hinzugefügt, das im Anschluss leicht abgeschnitten werden kann. " -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Sie benötigen Hilfe für Ihre Drucke?
    Lesen Sie die Ultimaker Anleitungen für Fehlerbehebung>" @@ -3988,17 +4321,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Projektdatei öffnen" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "Dies ist eine Cura-Projektdatei. Möchten Sie diese als Projekt öffnen oder die Modelle hieraus importieren?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Meine Auswahl merken" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "Als Projekt öffnen" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "Modelle importieren" @@ -4008,21 +4346,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Engine-Protokoll" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "Material" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "Kompatibilität prüfen" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Klicken Sie, um die Materialkompatibilität auf Ultimaker.com zu prüfen." +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4113,6 +4466,26 @@ msgctxt "name" msgid "USB printing" msgstr "USB-Drucken" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4133,6 +4506,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3-Netzwerkverbindung" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4145,8 +4528,8 @@ msgstr "Firmware-Update-Prüfer" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "Bietet Ihnen die Möglichkeit, bestimmte Dateien über SolidWorks selbst zu öffnen. Diese werden anschließend konvertiert und in Cura geladen." +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4213,6 +4596,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "Cura-Vorgängerprofil-Reader" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4373,6 +4766,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Cura-Profil-Writer" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4413,6 +4816,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura-Profil-Reader" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "Unbekannt" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "Beim Öffnen Ihrer SolidWorks Datei trat ein Fehler auf! Überprüfen Sie bitte, ob sich Ihre Datei in SolidWorks ohne Probleme öffnen lässt!" + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "Fehler beim Starten %s!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "Simulationsansicht" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Cura erfasst anonymisierte Slice-Informationen. Sie können dies in den Einstellungen deaktivieren." + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "Verwerfen" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "Global" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    Ein schwerer Ausnahmefehler ist aufgetreten. Senden Sie uns diesen Absturzbericht, um das Problem zu beheben

    \n" +#~ "

    Verwenden Sie bitte die Schaltfläche „Bericht senden“, um den Fehlerbericht automatisch an unsere Server zu senden

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Cura-Version: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "Plattform: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Qt-Version: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "PyQt-Version: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "Ausnahme-Rückverfolgung" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "Materialdurchmesser" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker 3 Extended" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Cura SolidWorks Plugin-Konfiguration" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "Standardqualität des exportierten STL:" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "Immer nachfragen" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "Immer Qualität „Fein“ verwenden" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "Immer Qualität „Grob“ verwenden" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "SolidWorks-Datei importieren als STL ..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "Qualität des exportierten STL" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "Qualität" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "Grob" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "Fein" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "Kein Profil verfügbar" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "Diese Einstellung wird stets zwischen allen Extrudern geteilt. Eine Änderung ändert den Wert für alle Extruder" + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "Zeitangabe
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "&Kameraposition zurücksetzen" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "Projekt speichern" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "Vorbereiten" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "Überwachen" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "Kompatibilität prüfen" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "Bietet Ihnen die Möglichkeit, bestimmte Dateien über SolidWorks selbst zu öffnen. Diese werden anschließend konvertiert und in Cura geladen." + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "Blockiert" @@ -4433,13 +4986,9 @@ msgstr "Cura-Profil-Reader" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Um sicherzustellen, dass Ihr {machine_name} mit den neuesten Funktionen ausgestattet ist, wird empfohlen, die Firmware regelmäßig zu aktualisieren Dies kann auf dem {machine_name} (bei Anschluss an ein Netzwerk) oder über USB erfolgen." -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Schichtenansicht" - -msgctxt "@info:title" -msgid "Layer View" -msgstr "Schichtenansicht" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Schichtenansicht" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4541,9 +5090,9 @@ msgstr "Schichtenansicht" #~ msgid "Provides the Layer view." #~ msgstr "Bietet eine Schichtenansicht." -msgctxt "name" -msgid "Layer View" -msgstr "Schichtenansicht" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Schichtenansicht" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4864,9 +5413,9 @@ msgstr "Schichtenansicht" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Ermöglicht das Importieren von Profilen aus G-Code-Dateien." -msgctxt "@label" -msgid "Layer View" -msgstr "Schichtenansicht" +#~ msgctxt "@label" +#~ msgid "Layer View" +#~ msgstr "Schichtenansicht" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/de_DE/fdmextruder.def.json.po b/resources/i18n/de_DE/fdmextruder.def.json.po index 1108f1a541..039cc5dcb6 100644 --- a/resources/i18n/de_DE/fdmextruder.def.json.po +++ b/resources/i18n/de_DE/fdmextruder.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: German\n" diff --git a/resources/i18n/de_DE/fdmprinter.def.json.po b/resources/i18n/de_DE/fdmprinter.def.json.po index 337df8bff2..c70b25d7a8 100644 --- a/resources/i18n/de_DE/fdmprinter.def.json.po +++ b/resources/i18n/de_DE/fdmprinter.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: German\n" @@ -56,7 +56,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "Gcode-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n." +msgstr "" +"Gcode-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +70,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "Gcode-Befehle, die Am Ende ausgeführt werden sollen – getrennt durch \n." +msgstr "" +"Gcode-Befehle, die Am Ende ausgeführt werden sollen – getrennt durch \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -345,6 +349,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -605,31 +619,6 @@ 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 "Die Dicke der ersten Schicht in mm. Eine dicke erste Schicht erleichtert die Haftung am Druckbett." -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "Slicing-Toleranz" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "Slicen von Schichten mit diagonalen Flächen. Die Bereiche einer Schicht können anhand der Position generiert werden, an der die Mitte einer Schicht die Oberfläche kreuzt (Mitte). Optional kann jede Schicht die Bereiche enthalten, die in das Volumen entlang der Höhe der Schicht (Exklusiv) fallen oder eine Schicht enthält die Bereiche, die irgendwo innerhalb der Schicht positioniert sind (Inklusiv). Exklusiv bewahrt die meisten Details, Inklusiv ermöglicht die beste Passform und Mitte erfordert die kürzeste Bearbeitungszeit." - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "Mitte" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "Exklusiv" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "Inklusiv" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -670,16 +659,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "Die Breite einer einzelnen Wandlinie für alle Wandlinien, außer der äußersten." -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "Oberfläche Außenhaut Linienbreite" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "Die Breite einer einzelnen Linie der oberen Druckbereiche." - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -860,41 +839,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "Die Anzahl der obersten Außenhautschichten. Üblicherweise reicht eine einzige oberste Schicht aus, um höherwertige Oberflächen zu generieren." -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "Oberfläche Außenhaut Muster" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "Das Muster der obersten Schichten." - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "Linien" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "Konzentrisch" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zickzack" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "Linienrichtungen der Oberfläche Außenhaut" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "Eine Liste von Ganzzahl-Linienrichtungen für den Fall, wenn die oberen Außenhautschichten die Linien- oder Zickzack-Muster verwenden. Elemente aus der Liste werden während des Aufbaus der Schichten sequentiell verwendet und wenn das Listenende erreicht wird, beginnt die Liste von vorne. Die Listenobjekte werden durch Kommas getrennt und die gesamte Liste ist in eckige Klammern gesetzt. Standardmäßig ist eine leere Liste vorhanden, was bedeutet, dass herkömmliche Standardwinkel (45- und 135-Grad) verwendet werden." - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1025,6 +969,16 @@ 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 "Verwendete Einfügung am Pfad zur Außenwand. Wenn die Außenwand kleiner als die Düse ist und nach den Innenwänden gedruckt wird, verwenden Sie diesen Versatz, damit die Öffnung in der Düse mit den Innenwänden überlappt, anstelle mit der Außenseite des Modells." +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "Reihenfolge des Wanddrucks optimieren" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "Optimieren Sie die Reihenfolge, in der die Wände gedruckt werden, um die Anzahl der Einzüge und die zurückgelegten Distanzen zu reduzieren. Dieser Schritt bringt für die meisten Teile Vorteile, allerdings werden einige möglicherweise länger benötigen. Vergleichen Sie deshalb bitte die Schätzung der Druckzeiten mit und ohne Optimierung." + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1095,6 +1049,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "Überall" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1477,8 +1441,8 @@ msgstr "X-Versatz Füllung" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "Das Füllmuster wird um diese Distanz entlang der X-Achse versetzt." +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1487,8 +1451,8 @@ msgstr "Y-Versatz Füllung" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "Das Füllmuster wird um diese Distanz entlang der Y-Achse versetzt." +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1507,8 +1471,8 @@ msgstr "Prozentsatz Füllung überlappen" #: 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 "Das Ausmaß des Überlappens zwischen der Füllung und den Wänden. Ein leichtes Überlappen ermöglicht es den Wänden, eine solide Verbindung mit der Füllung herzustellen." +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1527,8 +1491,8 @@ msgstr "Prozentsatz Außenhaut überlappen" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "Das Ausmaß des Überlappens zwischen der Außenhaut und den Wänden als Prozentwert der Linienbreite. Ein leichtes Überlappen ermöglicht es den Wänden, eine solide Verbindung mit der Außenhaut herzustellen. Dies ist ein Prozentwert der durchschnittlichen Linienbreiten der Außenhautlinien und der innersten Wand." +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1690,16 +1654,6 @@ msgctxt "material description" msgid "Material" msgstr "Material" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -msgstr "Automatische Temperatur" - -#: 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 "Die Temperatur wird für jede Schicht automatisch anhand der durchschnittlichen Fließgeschwindigkeit dieser Schicht geändert." - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1750,16 +1704,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "Die Temperatur, bei der das Abkühlen bereits beginnen kann, bevor der Druck beendet wird." -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "Fließtemperaturgraf" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "Der Materialfluss (in mm3 pro Sekunde) in Bezug zur Temperatur (Grad Celsius)." - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1777,8 +1721,8 @@ msgstr "Temperatur Druckplatte" #: 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 "Die Temperatur, die für die erhitzte Druckplatte verwendet wird. Wenn dieser Wert 0 beträgt, wird das Bett für diesen Druck nicht erhitzt." +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3450,6 +3394,16 @@ 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 "Der Winkel eines Pfeilerdachs. Ein höherer Wert hat spitze Pfeilerdächer zur Folge, ein niedrigerer Wert führt zu flacheren Pfeilerdächern." +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "Stütznetz ablegen" + +#: 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 "Sorgt für Unterstützung überall unterhalb des Stütznetzes, sodass kein Überhang im Stütznetz vorhanden ist." + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -3550,7 +3504,9 @@ 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 "Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\nEs handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden mehrere Skirt-Linien in äußerer Richtung angebracht." +msgstr "" +"Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\n" +"Es handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden mehrere Skirt-Linien in äußerer Richtung angebracht." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4082,16 +4038,6 @@ 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 "Normalerweise versucht Cura kleine Löcher im Netz abzudecken und Teile von Schichten, die große Löcher aufweisen, zu entfernen. Die Aktivierung dieser Option erhält jene Teile, die nicht abgedeckt werden können. Diese Option sollte nur als letzter Ausweg verwendet werden, wenn es ansonsten nicht möglich ist, einen korrekten G-Code zu berechnen." -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "Maximale Auflösung" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "Die Mindestgröße eines Linienabschnitts nach dem Slicen. Wenn Sie diesen Wert erhöhen, führt dies zu einer niedrigeren Auslösung des Mesh. Damit kann der Drucker die erforderliche Geschwindigkeit für die Verarbeitung des G-Codes beibehalten; außerdem wird die Slice-Geschwindigkeit erhöht, indem Details des Mesh entfernt werden, die ohnehin nicht verarbeitet werden können." - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4242,16 +4188,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "Dieses Netz wird verwendet, um festzulegen, welche Bereiche gestützt werden sollen. Dies kann verwendet werden, um eine Stützstruktur zu errichten." -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -msgstr "Stütznetz ablegen" - -#: 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 "Sorgt für Unterstützung überall unterhalb des Stütznetzes, sodass kein Überhang im Stütznetz vorhanden ist." - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4328,14 +4264,194 @@ msgid "experimental!" msgstr "experimentell!" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "Reihenfolge des Wanddrucks optimieren" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "Optimieren Sie die Reihenfolge, in der die Wände gedruckt werden, um die Anzahl der Einzüge und die zurückgelegten Distanzen zu reduzieren. Dieser Schritt bringt für die meisten Teile Vorteile, allerdings werden einige möglicherweise länger benötigen. Vergleichen Sie deshalb bitte die Schätzung der Druckzeiten mit und ohne Optimierung." +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "Slicing-Toleranz" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "Slicen von Schichten mit diagonalen Flächen. Die Bereiche einer Schicht können anhand der Position generiert werden, an der die Mitte einer Schicht die Oberfläche kreuzt (Mitte). Optional kann jede Schicht die Bereiche enthalten, die in das Volumen entlang der Höhe der Schicht (Exklusiv) fallen oder eine Schicht enthält die Bereiche, die irgendwo innerhalb der Schicht positioniert sind (Inklusiv). Exklusiv bewahrt die meisten Details, Inklusiv ermöglicht die beste Passform und Mitte erfordert die kürzeste Bearbeitungszeit." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "Mitte" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "Exklusiv" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "Inklusiv" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "Oberfläche Außenhaut Linienbreite" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "Die Breite einer einzelnen Linie der oberen Druckbereiche." + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "Oberfläche Außenhaut Muster" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "Das Muster der obersten Schichten." + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "Linien" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "Konzentrisch" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zickzack" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "Linienrichtungen der Oberfläche Außenhaut" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "Eine Liste von Ganzzahl-Linienrichtungen für den Fall, wenn die oberen Außenhautschichten die Linien- oder Zickzack-Muster verwenden. Elemente aus der Liste werden während des Aufbaus der Schichten sequentiell verwendet und wenn das Listenende erreicht wird, beginnt die Liste von vorne. Die Listenobjekte werden durch Kommas getrennt und die gesamte Liste ist in eckige Klammern gesetzt. Standardmäßig ist eine leere Liste vorhanden, was bedeutet, dass herkömmliche Standardwinkel (45- und 135-Grad) verwendet werden." + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Automatische Temperatur" + +#: 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 "Die Temperatur wird für jede Schicht automatisch anhand der durchschnittlichen Fließgeschwindigkeit dieser Schicht geändert." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "Fließtemperaturgraf" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "Der Materialfluss (in mm3 pro Sekunde) in Bezug zur Temperatur (Grad Celsius)." + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "Maximale Auflösung" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "Die Mindestgröße eines Linienabschnitts nach dem Slicen. Wenn Sie diesen Wert erhöhen, führt dies zu einer niedrigeren Auslösung des Mesh. Damit kann der Drucker die erforderliche Geschwindigkeit für die Verarbeitung des G-Codes beibehalten; außerdem wird die Slice-Geschwindigkeit erhöht, indem Details des Mesh entfernt werden, die ohnehin nicht verarbeitet werden können." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4827,7 +4943,9 @@ 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 "Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\nDies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur." +msgstr "" +"Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\n" +"Dies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4934,6 +5052,46 @@ 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 "Der Abstand zwischen der Düse und den horizontalen Abwärtslinien. Bei einem größeren Abstand haben die diagonalen Abwärtslinien einen weniger spitzen Winkel, was wiederum weniger Aufwärtsverbindungen zur nächsten Schicht zur Folge hat. Dies gilt nur für das Drucken mit Drahtstruktur." +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4994,6 +5152,26 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Transformationsmatrix, die beim Laden aus der Datei auf das Modell angewandt wird." +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "Das Füllmuster wird um diese Distanz entlang der X-Achse versetzt." + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "Das Füllmuster wird um diese Distanz entlang der Y-Achse versetzt." + +#~ 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 "Das Ausmaß des Überlappens zwischen der Füllung und den Wänden. Ein leichtes Überlappen ermöglicht es den Wänden, eine solide Verbindung mit der Füllung herzustellen." + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "Das Ausmaß des Überlappens zwischen der Außenhaut und den Wänden als Prozentwert der Linienbreite. Ein leichtes Überlappen ermöglicht es den Wänden, eine solide Verbindung mit der Außenhaut herzustellen. Dies ist ein Prozentwert der durchschnittlichen Linienbreiten der Außenhautlinien und der innersten Wand." + +#~ 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 "Die Temperatur, die für die erhitzte Druckplatte verwendet wird. Wenn dieser Wert 0 beträgt, wird das Bett für diesen Druck nicht erhitzt." + #~ msgctxt "wall_x_extruder_nr label" #~ msgid "Inner Walls Extruder" #~ msgstr "Extruder Innenwände" diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index 3a35477fc9..debb9dbfca 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "Ajustes de la máquina" @@ -53,12 +53,11 @@ msgstr "Conectar con Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -98,7 +97,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Abrir la interfaz web de Doodle3D Connect" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Mostrar registro de cambios" @@ -113,78 +112,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "El perfil se ha aplanado y activado." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "Impresión USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "Imprimir mediante USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "Imprimir mediante USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "Conectado mediante USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "No se puede iniciar un trabajo nuevo porque la impresora está ocupada o no está conectada." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "Impresora no disponible" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Esta impresora no es compatible con la impresión USB porque utiliza el tipo UltiGCode." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "Impresión USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "No se puede iniciar un trabajo nuevo porque la impresora no es compatible con la impresión USB." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "Advertencia" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "No se puede actualizar el firmware porque no hay impresoras conectadas." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "No se pudo encontrar el firmware necesario para la impresora en %s." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "Firmware de la impresora" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -228,11 +232,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "No se pudo guardar en unidad extraíble {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "Error" @@ -282,7 +286,7 @@ msgid "Removable Drive" msgstr "Unidad extraíble" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Imprimir a través de la red" @@ -396,110 +400,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "Estado de la impresora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "No se puede iniciar un trabajo nuevo de impresión. No se ha cargado ningún PrintCore en la ranura {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "No se puede iniciar un trabajo nuevo de impresión. No se ha cargado material en la ranura {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "No hay suficiente material para la bobina {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "PrintCore distinto (Cura: {0}, impresora: {1}) seleccionado para extrusor {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Material distinto (Cura: {0}, impresora: {1}) seleccionado para extrusor {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "El PrintCore {0} no está calibrado correctamente. Debe llevarse a cabo una calibración XY de la impresora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "¿Seguro que desea imprimir con la configuración seleccionada?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "La configuración o calibración de la impresora y de Cura no coinciden. Para obtener el mejor resultado, segmente siempre los PrintCores y los materiales que se insertan en la impresora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Configuración desajustada" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "Envío de nuevos trabajos (temporalmente) bloqueado; se sigue enviando el trabajo de impresión previo." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Enviando datos a la impresora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "Enviando datos" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "No se puede enviar datos a la impresora. ¿Hay otro trabajo que todavía esté activo?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Cancelando impresión..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Impresión cancelada. Compruebe la impresora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Pausando impresión..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Reanudando impresión..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Sincronizar con la impresora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "¿Desea utilizar la configuración actual de su impresora en Cura?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "Los PrintCores o los materiales de la impresora difieren de los del proyecto actual. Para obtener el mejor resultado, segmente siempre los PrintCores y materiales que se hayan insertado en la impresora." @@ -520,145 +524,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "{printer_name} ha terminado de imprimir «{job_name}». Recoja el impreso y confirme que ha borrado la placa de impresión." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} está reservada para imprimir «{job_name}». Modifique la configuración de la impresora de modo que se adapte al trabajo para comenzar la impresión." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "No se pudo enviar el nuevo trabajo de impresión: esta impresora 3D (todavía) no está configurada para alojar un grupo de impresoras de Ultimaker 3 conectadas." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "No se puede enviar el trabajo de impresión al grupo {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "Enviar {file_name} al grupo {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "Mostrar trabajos de impresión" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "Abre la interfaz de trabajos de impresión en el navegador." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "Desconocido" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "{printer_name} ha terminado de imprimir «{job_name}»." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "Impresión terminada" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "Acción requerida" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "Enviando {file_name} al grupo {cluster_name}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "Conectar a través de la red" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "Hay nuevas funciones disponibles para {machine_name}. Se recomienda actualizar el firmware de la impresora." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Nuevo firmware de %s disponible" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "Cómo actualizar" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "No se pudo acceder a la información actualizada." -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "Se han producido varios errores al abrir el archivo de SolidWorks. Compruebe que el archivo se puede abrir correctamente en SolidWorks." +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "Archivo de elementos de SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "Archivo de ensamblado de SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "Configurar" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "Error al iniciar %s" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "Vista de simulación" +msgid "Layer view" +msgstr "Vista de capas" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "Cura no muestra correctamente las capas si la impresión de alambre está habilitada." -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "Vista de simulación" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "Modificar GCode" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "Cura recopila de forma anónima información de la segmentación. Puede desactivar esta opción en las preferencias." +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -667,14 +714,41 @@ msgstr "Recopilando datos" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "Descartar" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Perfiles de Cura 15.04" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -706,49 +780,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "Imagen GIF" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "No se puede segmentar con el material actual, ya que es incompatible con el dispositivo o la configuración seleccionados." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "No se puede segmentar" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Los ajustes actuales no permiten la segmentación. Los siguientes ajustes contienen errores: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "Los ajustes de algunos modelos no permiten la segmentación. Los siguientes ajustes contienen errores en uno o más modelos: {error_labels}." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "No se puede segmentar porque la torre auxiliar o la posición o posiciones de preparación no son válidas." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "No hay nada que segmentar porque ninguno de los modelos se adapta al volumen de impresión. Escale o rote los modelos para que se adapten." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "Procesando capas" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "Información" @@ -785,14 +859,14 @@ msgstr "Se ha producido un error al copiar los archivos de complemento de Siemen msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Se ha producido un error al instalar el complemento de Siemens NX. No se pudo definir la variable de entorno UGII_USER_DIR de Siemens NX." -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "Recomendado" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "Personalizado" @@ -803,24 +877,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "Archivo 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "Tobera" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "No se pudo obtener la ID del complemento de {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "Advertencia" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "Explorador de complementos" @@ -835,18 +909,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Archivo G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "Analizar GCode" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "Datos de GCode" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "Asegúrese de que el GCode es adecuado para la impresora y para su configuración antes de enviar el archivo a la misma. Es posible que la representación del GCode no sea precisa." @@ -857,6 +931,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Perfil de cura" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -888,142 +972,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "Nivelar placa de impresión" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Pared exterior" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Paredes interiores" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "Forro" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "Relleno" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "Relleno de soporte" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "Interfaz de soporte" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "Soporte" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "Falda" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "Desplazamiento" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "Retracciones" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "Otro" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "Desconocido" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Archivo {0} presegmentado" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "No se ha cargado material." -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "Material desconocido" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "Buscando nueva ubicación para los objetos" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "Buscando ubicación" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "No se puede encontrar una ubicación dentro del volumen de impresión para todos los objetos" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "No se puede encontrar la ubicación" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "El archivo ya existe" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "El archivo {0} ya existe. ¿Está seguro de que desea sobrescribirlo?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "Personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "Material personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "Global" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "No reemplazado" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "El material seleccionado no es compatible con la máquina o la configuración seleccionada." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1044,67 +1102,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Deshacer cambio del diámetro del material." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Error al exportar el perfil a {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Error al exportar el perfil a {0}: Error en el complemento de escritura." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Perfil exportado a {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "Exportación correcta" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Error al importar el perfil de {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Perfil {0} importado correctamente" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "El perfil {0} tiene un tipo de archivo desconocido o está corrupto." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "Perfil personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Al perfil le falta un tipo de calidad." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "No se ha podido encontrar un tipo de calidad {0} para la configuración actual." +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1115,142 +1195,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "Volumen de impresión" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Multiplicar y colocar objetos" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "Colocando objeto" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "No se puede encontrar una ubicación dentro del volumen de impresión para todos los objetos" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "Buscando nueva ubicación para los objetos" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "Buscando ubicación" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "No se puede encontrar la ubicación" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "Informe del accidente" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    Se ha producido una excepción fatal. Envíenos este informe de errores para que podamos solucionar el problema.

    \n

    Utilice el botón «Enviar informe» para publicar automáticamente un informe de errores en nuestros servidores.

    \n " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "Información del sistema" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "Desconocido" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Versión de Cura: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "Platforma: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Versión de Qt: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "Versión de PyQt: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • Versión de OpenGL: {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • Proveedor de OpenGL: {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • Representador de OpenGL: {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "Rastreabilidad de excepciones" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "Registros" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "Descripción del usuario" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "Enviar informe" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Cargando máquinas..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Configurando escena..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Cargando interfaz..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Solo se puede cargar un archivo GCode a la vez. Se omitió la importación de {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "No se puede abrir ningún archivo si se está cargando un archivo GCode. Se omitió la importación de {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "No se puede cargar el modelo seleccionado, es demasiado pequeño." @@ -1279,12 +1384,11 @@ msgstr "X (anchura)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1374,68 +1478,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "Diferencia de altura entre la punta de la tobera y el sistema del puente (ejes X e Y). Se usa para evitar que colisionen la impresión anterior con el caballete al imprimir «de uno en uno»." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "Número de extrusores" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "El diámetro nominal del filamento compatible con la impresora. El diámetro exacto se sobrescribirá según el material o el perfil." - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "Diámetro del material" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "Tamaño de la tobera" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "Iniciar GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Los comandos de Gcode que se ejecutarán justo al inicio." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "Finalizar GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Los comandos de Gcode que se ejecutarán justo al final." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "Ajustes de la tobera" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Tamaño de la tobera" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "El diámetro nominal del filamento compatible con la impresora. El diámetro exacto se sobrescribirá según el material o el perfil." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "Desplazamiento de la tobera sobre el eje X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Desplazamiento de la tobera sobre el eje Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "GCode inicial del extrusor" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "GCode final del extrusor" @@ -1448,8 +1551,9 @@ msgstr "Registro de cambios" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1514,7 +1618,10 @@ 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 "Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n\nSeleccione la impresora de la siguiente lista:" +msgstr "" +"Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n" +"\n" +"Seleccione la impresora de la siguiente lista:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1530,7 +1637,7 @@ msgstr "Editar" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "Eliminar" @@ -1552,14 +1659,14 @@ msgid "Type" msgstr "Tipo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Extended" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1603,8 +1710,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "Introduzca la dirección IP o el nombre de host de la impresora en red." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1625,6 +1730,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 no está configurada para alojar un grupo de impresoras conectadas de Ultimaker 3" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1655,11 +1765,16 @@ msgid "Available" msgstr "Disponible" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "Se ha perdido la conexión con la impresora." +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1751,138 +1866,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "Activar configuración" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Configuración de complementos Cura SolidWorks" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "Calidad predeterminada del STL exportado:" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "Preguntar siempre" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "Usar siempre calidad fina" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "Usar siempre calidad gruesa" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "Importar el archivo SolidWorks como STL..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "Calidad del STL exportado" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "Calidad" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "Gruesa" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "Fina" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "Recordar mi selección" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "Guardar" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "Combinación de colores" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "Color del material" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "Tipo de línea" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "Velocidad" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "Grosor de la capa" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "Modo de compatibilidad" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "Mostrar desplazamientos" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "Mostrar asistentes" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "Mostrar perímetro" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "Mostrar relleno" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "Mostrar solo capas superiores" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "Mostrar cinco capas detalladas en la parte superior" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "Superior o inferior" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "Pared interior" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "mín." -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "máx." @@ -1907,7 +2134,7 @@ msgctxt "@label" msgid "Settings" msgstr "Ajustes" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Cambia las secuencias de comandos de posprocesamiento." @@ -1982,23 +2209,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "Suavizado" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "Seleccionar ajustes" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "Seleccionar ajustes o personalizar este modelo" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "Filtrar..." -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "Mostrar todo" @@ -2166,7 +2423,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Este complemento incluye una licencia.\nDebe aceptar dicha licencia para instalar el complemento.\n¿Acepta las condiciones que aparecen a continuación?" +msgstr "" +"Este complemento incluye una licencia.\n" +"Debe aceptar dicha licencia para instalar el complemento.\n" +"¿Acepta las condiciones que aparecen a continuación?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2357,66 +2617,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "¡Todo correcto! Ha terminado con la comprobación." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "No está conectado a ninguna impresora." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "La impresora no acepta comandos." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "En mantenimiento. Compruebe la impresora." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Imprimiendo..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "En pausa" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Preparando..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "Retire la impresión." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "Reanudar" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "Pausar" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "Cancelar impresión" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "Cancela la impresión" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "¿Está seguro de que desea cancelar la impresión?" @@ -2431,7 +2691,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Ha personalizado parte de los ajustes del perfil.\n¿Desea descartar los cambios o guardarlos?" +msgstr "" +"Ha personalizado parte de los ajustes del perfil.\n" +"¿Desea descartar los cambios o guardarlos?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2449,19 +2711,19 @@ msgid "Customized" msgstr "Valor personalizado" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "Preguntar siempre" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "Descartar y no volver a preguntar" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "Guardar y no volver a preguntar" @@ -2496,72 +2758,72 @@ msgctxt "@label" msgid "Brand" msgstr "Marca" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "Tipo de material" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "Color" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "Propiedades" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "Densidad" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "Diámetro" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "Coste del filamento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "Anchura del filamento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "Longitud del filamento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "Coste por metro" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "Este material está vinculado a %1 y comparte alguna de sus propiedades." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "Desvincular material" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "Descripción" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "Información sobre adherencia" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "Ajustes de impresión" @@ -2602,7 +2864,7 @@ msgid "Unit" msgstr "Unidad" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "General" @@ -2617,230 +2879,255 @@ msgctxt "@label" msgid "Language:" msgstr "Idioma:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "Moneda:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "Tema:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "Tendrá que reiniciar la aplicación para que estos cambios tengan efecto." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "Segmentar automáticamente al cambiar los ajustes." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "Segmentar automáticamente" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "Comportamiento de la ventanilla" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "Resaltar en rojo las áreas del modelo sin soporte. Sin soporte, estas áreas no se imprimirán correctamente." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "Mostrar voladizos" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "Mueve la cámara de manera que el modelo se encuentre en el centro de la vista cuando se selecciona un modelo." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "Centrar cámara cuando se selecciona elemento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "¿Se debería invertir el comportamiento predeterminado del zoom de cura?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "Invertir la dirección del zoom de la cámara." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "¿Debería moverse el zoom en la dirección del ratón?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "Hacer zoom en la dirección del ratón" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "¿Deben moverse los modelos en la plataforma de modo que no se crucen?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "Asegúrese de que lo modelos están separados." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "¿Deben moverse los modelos del área de impresión de modo que no toquen la placa de impresión?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "Arrastrar modelos a la placa de impresión de forma automática" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "Mostrar mensaje de advertencia en el lector de GCode." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "Mensaje de advertencia en el lector de GCode" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "¿Debe forzarse el modo de compatibilidad de la capa?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "Forzar modo de compatibilidad de la vista de capas (necesario reiniciar)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "Abrir y guardar archivos" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "¿Deben ajustarse los modelos al volumen de impresión si son demasiado grandes?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "Escalar modelos de gran tamaño" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "Un modelo puede mostrarse demasiado pequeño si su unidad son metros en lugar de milímetros, por ejemplo. ¿Deben escalarse estos modelos?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "Escalar modelos demasiado pequeños" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "¿Debe añadirse automáticamente un prefijo basado en el nombre de la impresora al nombre del trabajo de impresión?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "Agregar prefijo de la máquina al nombre del trabajo" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "¿Mostrar un resumen al guardar un archivo de proyecto?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "Mostrar un cuadro de diálogo de resumen al guardar el proyecto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "Comportamiento predeterminado al abrir un archivo del proyecto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "Comportamiento predeterminado al abrir un archivo del proyecto: " -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "Preguntar siempre" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "Abrir siempre como un proyecto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "Importar modelos siempre" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "Si ha realizado cambios en un perfil y, a continuación, ha cambiado a otro, aparecerá un cuadro de diálogo que le preguntará si desea guardar o descartar los cambios. También puede elegir el comportamiento predeterminado, así ese cuadro de diálogo no volverá a aparecer." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "Anular perfil" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "Privacidad" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "¿Debe Cura buscar actualizaciones cuando se abre el programa?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "Buscar actualizaciones al iniciar" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "¿Deben enviarse datos anónimos sobre la impresión a Ultimaker? Tenga en cuenta que no se envían ni almacenan modelos, direcciones IP ni otra información de identificación personal." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "Enviar información (anónima) de impresión" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "Impresoras" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "Activar" @@ -2883,7 +3170,7 @@ msgid "Waiting for a printjob" msgstr "Esperando un trabajo de impresión..." #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "Perfiles" @@ -2909,13 +3196,13 @@ msgid "Duplicate" msgstr "Duplicado" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "Importar" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "Exportar" @@ -2981,7 +3268,7 @@ msgid "Export Profile" msgstr "Exportar perfil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "Materiales" @@ -2996,60 +3283,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "Impresora: %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "Crear" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "Duplicado" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "Importar material" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr "No se pudo importar el material en %1: %2." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "El material se ha importado correctamente en %1." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "Exportar material" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "Se ha producido un error al exportar el material a %1: %2." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "El material se ha exportado correctamente a %1." #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "Agregar impresora" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "Nombre de la impresora:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "Agregar impresora" @@ -3074,7 +3361,9 @@ 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 "Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\nCura se enorgullece de utilizar los siguientes proyectos de código abierto:" +msgstr "" +"Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\n" +"Cura se enorgullece de utilizar los siguientes proyectos de código abierto:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3176,158 +3465,167 @@ msgctxt "@label" msgid "Profile:" msgstr "Perfil:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "No hay perfiles disponibles." - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 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 "Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n\nHaga clic para abrir el administrador de perfiles." +msgstr "" +"Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n" +"\n" +"Haga clic para abrir el administrador de perfiles." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "Buscar..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Copiar valor en todos los extrusores" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Ocultar este ajuste" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "No mostrar este ajuste" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Mostrar este ajuste" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Configurar la visibilidad de los ajustes..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n\nHaga clic para mostrar estos ajustes." +msgstr "" +"Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n" +"\n" +"Haga clic para mostrar estos ajustes." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "Afecta a" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "Afectado por" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "Este ajuste siempre se comparte entre extrusores. Si lo modifica, modificará el valor de todos los extrusores." +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "El valor se resuelve según los valores de los extrusores. " -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 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 "Este ajuste tiene un valor distinto del perfil.\n\nHaga clic para restaurar el valor del perfil." +msgstr "" +"Este ajuste tiene un valor distinto del perfil.\n" +"\n" +"Haga clic para restaurar el valor del perfil." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 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 "Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n\nHaga clic para restaurar el valor calculado." +msgstr "" +"Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n" +"\n" +"Haga clic para restaurar el valor calculado." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Configuración de impresión" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Ajustes de impresión deshabilitados\nNo se pueden modificar los archivos GCode" +msgstr "" +"Ajustes de impresión deshabilitados\n" +"No se pueden modificar los archivos GCode" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00 h 00 min" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "Especificación de tiempo
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "Especificación de costes" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1 m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1 g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "Total:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1 m/~ %2 g/~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1 m/~ %2 g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Configuración de impresión recomendada

    Imprimir con los ajustes recomendados para la impresora, el material y la calidad seleccionados." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Configuración de impresión personalizada

    Imprimir con un control muy detallado del proceso de segmentación." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automático: %1" @@ -3337,6 +3635,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Ver" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3349,14 +3657,14 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Imprimir modelo seleccionado con:" msgstr[1] "Imprimir modelos seleccionados con:" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplicar modelo seleccionado" msgstr[1] "Multiplicar modelos seleccionados" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "Número de copias" @@ -3372,7 +3680,7 @@ msgid "No printer connected" msgstr "No hay ninguna impresora conectada" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "Extrusor" @@ -3482,254 +3790,294 @@ msgctxt "@label" msgid "Estimated time left" msgstr "Tiempo restante estimado" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "A<ernar pantalla completa" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "Des&hacer" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Rehacer" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Salir" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "&Restablecer posición de la cámara" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configurar Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Agregar impresora..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Adm&inistrar impresoras ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Administrar materiales..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Actualizar perfil con ajustes o sobrescrituras actuales" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Descartar cambios actuales" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Crear perfil a partir de ajustes o sobrescrituras actuales..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Administrar perfiles..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Mostrar &documentación en línea" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Informar de un &error" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&Acerca de..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Eliminar modelo &seleccionado" msgstr[1] "Eliminar modelos &seleccionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Centrar modelo seleccionado" msgstr[1] "Centrar modelos seleccionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplicar modelo seleccionado" msgstr[1] "Multiplicar modelos seleccionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Eliminar modelo" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ce&ntrar modelo en plataforma" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "A&grupar modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Desagrupar modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Co&mbinar modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Multiplicar modelo..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Seleccionar todos los modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Borrar placa de impresión" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "&Recargar todos los modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Organizar todos los modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Organizar selección" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Restablecer las posiciones de todos los modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Restablecer las &transformaciones de todos los modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Abrir archivo(s)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nuevo proyecto..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "&Mostrar registro del motor..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Mostrar carpeta de configuración" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configurar visibilidad de los ajustes..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "Examinar complementos..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "Complementos instalados..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Cargue un modelo en 3D" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Preparado para segmentar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Segmentando..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Listo para %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "No se puede segmentar." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "No se puede segmentar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Preparar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Cancelar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Seleccione el dispositivo de salida activo" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "Abrir archivo(s)" @@ -3749,114 +4097,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Archivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "Guardar &selección en archivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Guardar &como..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "Guardar proyecto" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Edición" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "&Ver" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "A&justes" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&Impresora" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "&Material" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "&Perfil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Definir como extrusor activo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "E&xtensiones" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "&Complementos" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "Pre&ferencias" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "A&yuda" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "Abrir archivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "Ajustes" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "Nuevo proyecto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "¿Está seguro de que desea iniciar un nuevo proyecto? Esto borrará la placa de impresión y cualquier ajuste no guardado." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "Instalar complemento" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "Abrir archivo(s)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "Hemos encontrado uno o más archivos de GCode entre los archivos que ha seleccionado. Solo puede abrir los archivos GCode de uno en uno. Si desea abrir un archivo GCode, seleccione solo uno." @@ -3881,97 +4229,82 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "No mostrar resumen de proyecto al guardar de nuevo" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "Guardar" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "Preparar" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "Supervisar" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "Altura de capa" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "Hay un perfil personalizado activado en este momento. Para habilitar el control deslizante de calidad, seleccione un perfil de calidad predeterminado en la pestaña Personalizado." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "Velocidad de impresión" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "Más lento" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "Más rápido" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "Ha modificado algunos ajustes del perfil. Si desea cambiarlos, hágalo en el modo personalizado." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "Relleno" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Un relleno gradual aumentará gradualmente la cantidad de relleno hacia arriba." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "Habilitar gradual" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "Generar soporte" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Generar estructuras para soportar piezas del modelo que tengan voladizos. Sin estas estructuras, estas piezas se romperían durante la impresión." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "Extrusor del soporte" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "Seleccione qué extrusor se utilizará como soporte. Esta opción formará estructuras de soporte por debajo del modelo para evitar que éste se combe o la impresión se haga en el aire." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Adherencia de la placa de impresión" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "Habilita la impresión de un borde o una balsa. Esta opción agregará un área plana alrededor del objeto, que es fácil de cortar después." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "¿Necesita ayuda para mejorar sus impresiones?
    Lea las Guías de solución de problemas de Ultimaker" @@ -3988,17 +4321,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Abrir archivo de proyecto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "Este es un archivo de proyecto Cura. ¿Le gustaría abrirlo como un proyecto o importar sus modelos?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Recordar mi selección" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "Abrir como proyecto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "Importar modelos" @@ -4008,21 +4346,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Registro del motor" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "Material" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "Comprobar compatibilidad" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Haga clic para comprobar la compatibilidad de los materiales en Utimaker.com." +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4113,6 +4466,26 @@ msgctxt "name" msgid "USB printing" msgstr "Impresión USB" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4133,6 +4506,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Conexión de red UM3" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4145,8 +4528,8 @@ msgstr "Buscador de actualizaciones de firmware" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "Permite abrir ciertos archivos con el propio SolidWorks que, a continuación, puede convertirse y cargarse en Cura." +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4213,6 +4596,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "Lector de perfiles antiguos de Cura" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4373,6 +4766,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Escritor de perfiles de Cura" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4413,6 +4816,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Lector de perfiles de Cura" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "Desconocido" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "Se han producido varios errores al abrir el archivo de SolidWorks. Compruebe que el archivo se puede abrir correctamente en SolidWorks." + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "Error al iniciar %s" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "Vista de simulación" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Cura recopila de forma anónima información de la segmentación. Puede desactivar esta opción en las preferencias." + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "Descartar" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "Global" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    Se ha producido una excepción fatal. Envíenos este informe de errores para que podamos solucionar el problema.

    \n" +#~ "

    Utilice el botón «Enviar informe» para publicar automáticamente un informe de errores en nuestros servidores.

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Versión de Cura: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "Platforma: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Versión de Qt: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "Versión de PyQt: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "Rastreabilidad de excepciones" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "Diámetro del material" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker 3 Extended" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Configuración de complementos Cura SolidWorks" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "Calidad predeterminada del STL exportado:" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "Preguntar siempre" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "Usar siempre calidad fina" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "Usar siempre calidad gruesa" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "Importar el archivo SolidWorks como STL..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "Calidad del STL exportado" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "Calidad" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "Gruesa" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "Fina" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "No hay perfiles disponibles." + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "Este ajuste siempre se comparte entre extrusores. Si lo modifica, modificará el valor de todos los extrusores." + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "Especificación de tiempo
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "&Restablecer posición de la cámara" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "Guardar proyecto" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "Preparar" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "Supervisar" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "Comprobar compatibilidad" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "Permite abrir ciertos archivos con el propio SolidWorks que, a continuación, puede convertirse y cargarse en Cura." + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "Deshabilitada" @@ -4433,13 +4986,9 @@ msgstr "Lector de perfiles de Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Para garantizar que su {machine_name} disponga de las prestaciones más recientes, se recomienda actualizar el firmware con regularidad. Esto se puede hacer en la {machine_name} (cuando esté conectada a la red) o vía USB." -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Vista de capas" - -msgctxt "@info:title" -msgid "Layer View" -msgstr "Vista de capas" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Vista de capas" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4541,9 +5090,9 @@ msgstr "Vista de capas" #~ msgid "Provides the Layer view." #~ msgstr "Proporciona la vista de capas." -msgctxt "name" -msgid "Layer View" -msgstr "Vista de capas" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Vista de capas" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4864,9 +5413,9 @@ msgstr "Vista de capas" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Proporciona asistencia para la importación de perfiles de archivos GCode." -msgctxt "@label" -msgid "Layer View" -msgstr "Vista de capas" +#~ msgctxt "@label" +#~ msgid "Layer View" +#~ msgstr "Vista de capas" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/es_ES/fdmextruder.def.json.po b/resources/i18n/es_ES/fdmextruder.def.json.po index 1d0986f4e1..e895c053e3 100644 --- a/resources/i18n/es_ES/fdmextruder.def.json.po +++ b/resources/i18n/es_ES/fdmextruder.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" diff --git a/resources/i18n/es_ES/fdmprinter.def.json.po b/resources/i18n/es_ES/fdmprinter.def.json.po index d3515844e3..82b913b3e8 100644 --- a/resources/i18n/es_ES/fdmprinter.def.json.po +++ b/resources/i18n/es_ES/fdmprinter.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" @@ -56,7 +56,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "Los comandos de Gcode que se ejecutarán justo al inicio - separados por \n." +msgstr "" +"Los comandos de Gcode que se ejecutarán justo al inicio - separados por \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +70,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "Los comandos de Gcode que se ejecutarán justo al final - separados por \n." +msgstr "" +"Los comandos de Gcode que se ejecutarán justo al final - separados por \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -345,6 +349,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -605,31 +619,6 @@ 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 "Altura de capa inicial en mm. Una capa inicial más gruesa se adhiere a la placa de impresión con mayor facilidad." -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "Tolerancia de segmentación" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "Cómo segmentar capas con superficies diagonales. Las áreas de una capa se pueden crear según el punto en el que el centro de esta intersecta con la superficie (Media). Las capas también pueden tener áreas comprendidas en el volumen a lo largo de la altura de la capa (Exclusiva) o una capa puede tener áreas comprendidas en cualquier lugar de la capa (Inclusiva). Las capas exclusivas tienen un mayor nivel de detalle, mientras que las inclusivas son las que mejor se ajustan y las medias las que tardan menos en procesarse." - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "Media" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "Exclusiva" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "Inclusiva" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -670,16 +659,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "Ancho de una sola línea de pared para todas las líneas de pared excepto la más externa." -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "Ancho de línea de la superficie superior del forro" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "Ancho de una sola línea de las áreas superiores de la impresión." - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -860,41 +839,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "El número de capas del nivel superior del forro. Normalmente es suficiente con una sola capa para generar superficies superiores con mayor calidad." -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "Patrón de la superficie superior del forro" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "El patrón de las capas de nivel superior." - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "Líneas" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "Concéntrico" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zigzag" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "Direcciones de línea de la superficie superior del forro" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "Una lista de los valores enteros de las direcciones de línea si las capas de la superficie superior del forro utilizan líneas o el patrón en zigzag. Los elementos de esta lista se utilizan de forma secuencial a medida que las capas se utilizan y, cuando se alcanza el final, la lista vuelve a comenzar desde el principio. Los elementos de la lista están separados por comas y toda la lista aparece entre corchetes. El valor predeterminado es una lista vacía que utiliza los ángulos predeterminados típicos (45 y 135 grados)." - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1025,6 +969,16 @@ 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 "Entrante aplicado a la trayectoria de la pared exterior. Si la pared exterior es más pequeña que la tobera y se imprime a continuación de las paredes interiores, utilice este valor de desplazamiento para hacer que el agujero de la tobera se superponga a las paredes interiores del modelo en lugar de a las exteriores." +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "Optimizar el orden de impresión de paredes" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "Optimizar el orden en el que se imprimen las paredes a fin de reducir el número de retracciones y la distancia recorrida. La mayoría de los componentes se beneficiarán si este ajuste está habilitado pero, en algunos casos, se puede tardar más, por lo que deben compararse las previsiones de tiempo de impresión con y sin optimización." + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1095,6 +1049,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "En todas partes" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1477,8 +1441,8 @@ msgstr "Desplazamiento del relleno sobre el eje X" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "El patrón de relleno se desplaza esta distancia a lo largo del eje X." +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1487,8 +1451,8 @@ msgstr "Desplazamiento del relleno sobre el eje X" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "El patrón de relleno se desplaza esta distancia a lo largo del eje Y." +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1507,8 +1471,8 @@ msgstr "Porcentaje de superposición del relleno" #: 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 "Cantidad de superposición entre el relleno y las paredes. Una ligera superposición permite que las paredes conecten firmemente con el relleno." +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1527,8 +1491,8 @@ msgstr "Porcentaje de superposición del forro" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "Cantidad de superposición entre el forro y las paredes como porcentaje del ancho de línea. Una ligera superposición permite que las paredes conecten firmemente con el forro. Este es el porcentaje de la media de los anchos de las líneas del forro y la pared más profunda." +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1690,16 +1654,6 @@ msgctxt "material description" msgid "Material" msgstr "Material" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -msgstr "Temperatura automática" - -#: 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 "Cambia automáticamente la temperatura para cada capa con la velocidad media de flujo de esa capa." - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1750,16 +1704,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "La temperatura a la que se puede empezar a enfriar justo antes de finalizar la impresión." -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "Gráfico de flujo y temperatura" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "Datos que vinculan el flujo de materiales (en 3 mm por segundo) a la temperatura (grados centígrados)." - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1777,8 +1721,8 @@ msgstr "Temperatura de la placa de impresión" #: 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 "Temperatura de la placa de impresión una vez caliente. Si el valor es 0, la plataforma no se calentará en esta impresión." +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3450,6 +3394,16 @@ 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 "Ángulo del techo superior de una torre. Un valor más alto da como resultado techos de torre en punta, un valor más bajo da como resultado techos de torre planos." +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "Malla de soporte desplegable" + +#: 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 "Disponga un soporte en todas partes por debajo de la malla de soporte, para que no haya voladizo en la malla de soporte." + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -3550,7 +3504,9 @@ 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 "La distancia horizontal entre la falda y la primera capa de la impresión.\nSe trata de la distancia mínima. Múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia." +msgstr "" +"La distancia horizontal entre la falda y la primera capa de la impresión.\n" +"Se trata de la distancia mínima. Múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4082,16 +4038,6 @@ 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 "Normalmente, Cura intenta coser los pequeños agujeros de la malla y eliminar las partes de una capa con grandes agujeros. Al habilitar esta opción se mantienen aquellas partes que no puedan coserse. Esta opción se debe utilizar como una opción de último recurso cuando todo lo demás falla para producir un GCode adecuado." -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "Resolución máxima" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "El tamaño mínimo de un segmento de línea tras la segmentación. Si se aumenta, la resolución de la malla será menor. Esto puede permitir a la impresora mantener la velocidad que necesita para procesar GCode y aumentará la velocidad de segmentación al eliminar detalles de la malla que, de todas formas, no puede procesar." - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4242,16 +4188,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "Utilice esta malla para especificar las áreas de soporte. Esta opción puede utilizarse para generar estructuras de soporte." -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -msgstr "Malla de soporte desplegable" - -#: 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 "Disponga un soporte en todas partes por debajo de la malla de soporte, para que no haya voladizo en la malla de soporte." - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4328,14 +4264,194 @@ msgid "experimental!" msgstr "Experimental" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "Optimizar el orden de impresión de paredes" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "Optimizar el orden en el que se imprimen las paredes a fin de reducir el número de retracciones y la distancia recorrida. La mayoría de los componentes se beneficiarán si este ajuste está habilitado pero, en algunos casos, se puede tardar más, por lo que deben compararse las previsiones de tiempo de impresión con y sin optimización." +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "Tolerancia de segmentación" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "Cómo segmentar capas con superficies diagonales. Las áreas de una capa se pueden crear según el punto en el que el centro de esta intersecta con la superficie (Media). Las capas también pueden tener áreas comprendidas en el volumen a lo largo de la altura de la capa (Exclusiva) o una capa puede tener áreas comprendidas en cualquier lugar de la capa (Inclusiva). Las capas exclusivas tienen un mayor nivel de detalle, mientras que las inclusivas son las que mejor se ajustan y las medias las que tardan menos en procesarse." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "Media" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "Exclusiva" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "Inclusiva" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "Ancho de línea de la superficie superior del forro" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "Ancho de una sola línea de las áreas superiores de la impresión." + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "Patrón de la superficie superior del forro" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "El patrón de las capas de nivel superior." + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "Líneas" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "Concéntrico" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zigzag" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "Direcciones de línea de la superficie superior del forro" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "Una lista de los valores enteros de las direcciones de línea si las capas de la superficie superior del forro utilizan líneas o el patrón en zigzag. Los elementos de esta lista se utilizan de forma secuencial a medida que las capas se utilizan y, cuando se alcanza el final, la lista vuelve a comenzar desde el principio. Los elementos de la lista están separados por comas y toda la lista aparece entre corchetes. El valor predeterminado es una lista vacía que utiliza los ángulos predeterminados típicos (45 y 135 grados)." + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Temperatura automática" + +#: 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 "Cambia automáticamente la temperatura para cada capa con la velocidad media de flujo de esa capa." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "Gráfico de flujo y temperatura" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "Datos que vinculan el flujo de materiales (en 3 mm por segundo) a la temperatura (grados centígrados)." + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "Resolución máxima" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "El tamaño mínimo de un segmento de línea tras la segmentación. Si se aumenta, la resolución de la malla será menor. Esto puede permitir a la impresora mantener la velocidad que necesita para procesar GCode y aumentará la velocidad de segmentación al eliminar detalles de la malla que, de todas formas, no puede procesar." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4827,7 +4943,9 @@ 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 "Distancia de un movimiento ascendente que se extrude a media velocidad.\nEsto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre." +msgstr "" +"Distancia de un movimiento ascendente que se extrude a media velocidad.\n" +"Esto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4934,6 +5052,46 @@ 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 "Distancia entre la tobera y líneas descendentes en horizontal. Cuanto mayor sea la holgura, menos pronunciado será el ángulo de las líneas descendentes en diagonal, lo que a su vez se traduce en menos conexiones ascendentes con la siguiente capa. Solo se aplica a la impresión de alambre." +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4994,6 +5152,26 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Matriz de transformación que se aplicará al modelo cuando se cargue desde el archivo." +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "El patrón de relleno se desplaza esta distancia a lo largo del eje X." + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "El patrón de relleno se desplaza esta distancia a lo largo del eje Y." + +#~ 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 "Cantidad de superposición entre el relleno y las paredes. Una ligera superposición permite que las paredes conecten firmemente con el relleno." + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "Cantidad de superposición entre el forro y las paredes como porcentaje del ancho de línea. Una ligera superposición permite que las paredes conecten firmemente con el forro. Este es el porcentaje de la media de los anchos de las líneas del forro y la pared más profunda." + +#~ 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 de la placa de impresión una vez caliente. Si el valor es 0, la plataforma no se calentará en esta impresión." + #~ msgctxt "wall_x_extruder_nr label" #~ msgid "Inner Walls Extruder" #~ msgstr "Extrusor de paredes interiores" diff --git a/resources/i18n/fi_FI/cura.po b/resources/i18n/fi_FI/cura.po index 461bfd63db..5b16d0b323 100644 --- a/resources/i18n/fi_FI/cura.po +++ b/resources/i18n/fi_FI/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Finnish\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "Laitteen asetukset" @@ -53,12 +53,11 @@ msgstr "Yhteyden muodostaminen Doodle3D Connectiin" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -98,7 +97,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Avaa Doodle3D Connect -verkkoliittymä" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Näytä muutosloki" @@ -113,78 +112,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "Profiili on tasoitettu ja aktivoitu." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "USB-tulostus" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "Tulosta USB:n kautta" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "Tulosta USB:n kautta" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "Yhdistetty USB:n kautta" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Uuden työn aloittaminen ei onnistu, koska tulostin on varattu tai sitä ei ole yhdistetty." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Tämä tulostin ei tue USB-tulostusta, koska se käyttää UltiGCode-tyyppiä." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "USB-tulostus" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Uuden työn aloittaminen ei onnistu, koska tulostin ei tue USB-tulostusta." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "Varoitus" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "Laiteohjelmistoa ei voida päivittää, koska yhtään tulostinta ei ole yhdistetty." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "Tulostimelle ei löydetty laiteohjelmistoa (%s)." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "Tulostimen laiteohjelmisto" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -228,11 +232,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Ei voitu tallentaa siirrettävälle asemalle {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "Virhe" @@ -282,7 +286,7 @@ msgid "Removable Drive" msgstr "Siirrettävä asema" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Tulosta verkon kautta" @@ -396,110 +400,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "Tulostimen tila" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Uuden tulostustyön aloittaminen ei onnistu. PrintCorea ei ole ladattu aukkoon {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Uuden tulostustyön aloittaminen ei onnistu. Materiaalia ei ole ladattu aukkoon {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Kelalle {0} ei ole tarpeeksi materiaalia." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Eri PrintCore (Cura: {0}, tulostin: {1}) valittu suulakkeelle {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Eri materiaali (Cura: {0}, tulostin: {1}) valittu suulakkeelle {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "Print Core -tulostusydintä {0} ei ole kalibroitu oikein. Tulostimen XY-kalibrointi tulee suorittaa." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Haluatko varmasti tulostaa valitulla määrityksellä?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "Tulostimen ja Curan määrityksen tai kalibroinnin välillä on ristiriita. Parhaat tulokset saavutetaan viipaloimalla aina tulostimeen asetetuille PrintCoreille ja materiaaleille." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Ristiriitainen määritys" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "Uusien töiden lähettäminen (tilapäisesti) estetty, edellistä tulostustyötä lähetetään vielä." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Lähetetään tietoja tulostimeen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "Lähetetään tietoja" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Tietojen lähetys tulostimeen ei onnistu. Onko toinen työ yhä aktiivinen?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Keskeytetään tulostus..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Tulostus keskeytetty. Tarkista tulostin" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Tulostus pysäytetään..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Tulostusta jatketaan..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Synkronoi tulostimen kanssa" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Haluatko käyttää nykyistä tulostimen määritystä Curassa?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "Tulostimen PrintCoret tai materiaalit eivät vastaa tulostettavan projektin asetuksia. Parhaat tulokset saavutetaan viipaloimalla aina tulostimeen asetetuille PrintCoreille ja materiaaleille." @@ -520,145 +524,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "{printer_name} on tulostanut työn '{job_name}'. Nouda työ ja vahvista alustan tyhjennys." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} on varattu työn {job_name} tulostamiseen. Muuta tulostimen määritys vastaamaan työtä, jotta tulostus alkaa." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Uuden tulostustyön lähetys ei onnistu: tätä 3D-tulostinta ei ole (vielä) määritetty yhdistetyn Ultimaker 3 -tulostinryhmän isännäksi." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Tulostustyön lähetys ryhmään {cluster_name} ei onnistu." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "Lähetettiin {file_name} ryhmään {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "Näytä tulostustyöt" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "Avaa tulostustöiden käyttöliittymän selaimessa." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "Tuntematon" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "{printer_name} on tulostanut työn '{job_name}'." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "Tulosta valmis" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "Vaatii toimenpiteitä" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "Lähetetään tiedostoa {file_name} ryhmään {cluster_name}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "Yhdistä verkon kautta" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Uusi tulostimen %s laiteohjelmisto saatavilla" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "Päivitystietoja ei löytynyt." -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "SolidWorks-tiedostoa avattaessa ilmeni virheitä! Tarkista, voiko tiedoston avata SolidWorks-ohjelmistossa ilman ongelmia." +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "SolidWorks-osatiedosto" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "SolidWorks-kokoonpanotiedosto" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "Määritä" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "%s:n käynnistyksen aikana ilmeni virhe!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "" +msgid "Layer view" +msgstr "Kerrosnäkymä" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "Cura ei näytä kerroksia täsmällisesti, kun rautalankatulostus on käytössä" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "Muokkaa GCode-arvoa" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "Cura kerää anonyymejä viipalointiin liittyviä tilastotietoja. Tämän voi poistaa käytöstä asetuksien kautta." +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -667,14 +714,41 @@ msgstr "Kerätään tietoja" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "Ohita" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Cura 15.04 -profiilit" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -706,49 +780,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "GIF-kuva" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "Viipalointi ei onnistu nykyisellä materiaalilla, sillä se ei sovellu käytettäväksi valitun laitteen tai kokoonpanon kanssa." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "Viipalointi ei onnistu" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Viipalointi ei onnistu nykyisten asetuksien ollessa voimassa. Seuraavissa asetuksissa on virheitä: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Viipalointi ei onnistu, koska esitäyttötorni tai esitäytön sijainti tai sijainnit eivät kelpaa." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Ei viipaloitavaa, koska mikään malleista ei sovellu tulostustilavuuteen. Skaalaa tai pyöritä mallia, kunnes se on sopiva." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "Käsitellään kerroksia" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "Tiedot" @@ -785,14 +859,14 @@ msgstr "" msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "Suositeltu" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "Mukautettu" @@ -803,24 +877,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF-tiedosto" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "Suutin" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Lisäosan tunnuksen hankkiminen epäonnistui tiedostosta {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "Varoitus" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "Lisäosien selain" @@ -835,18 +909,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G File -tiedosto" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "G-coden jäsennys" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "G-coden tiedot" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "Varmista, että G-code on tulostimelle ja sen tulostusasetuksille soveltuva, ennen kuin lähetät tiedoston siihen. G-coden esitys ei välttämättä ole tarkka." @@ -857,6 +931,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Cura-profiili" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -888,142 +972,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "Tasaa alusta" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Ulkoseinämä" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Sisäseinämät" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "Pintakalvo" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "Täyttö" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "Tuen täyttö" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "Tukiliittymä" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "Tuki" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "Helma" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "Siirtoliike" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "Takaisinvedot" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "Muu" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Esiviipaloitu tiedosto {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "Ei ladattua materiaalia" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "Tuntematon materiaali" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "Uusien paikkojen etsiminen kappaleille" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "Etsitään paikkaa" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "Kaikille kappaleille ei löydy paikkaa tulostustilavuudessa." - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "Paikkaa ei löydy" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "Tiedosto on jo olemassa" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "Tiedosto {0} on jo olemassa. Haluatko varmasti kirjoittaa sen päälle?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "Mukautettu" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "Mukautettu materiaali" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Valittu materiaali ei sovellu käytettäväksi valitun laitteen tai kokoonpanon kanssa." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1044,67 +1102,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Kumoa materiaalin halkaisijan muutokset." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Profiilin vienti epäonnistui tiedostoon {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Profiilin vienti epäonnistui tiedostoon {0}: Kirjoitin-lisäosa ilmoitti virheestä." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Profiili viety tiedostoon {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Profiilin tuonti epäonnistui tiedostosta {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Onnistuneesti tuotu profiili {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Profiililla {0} on tuntematon tiedostotyyppi tai se on vioittunut." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "Mukautettu profiili" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Profiilista puuttuu laatutyyppi." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "Laatutyyppiä {0} ei löydy nykyiselle kokoonpanolle." +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1115,142 +1195,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "Tulostustilavuus" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Kappaleiden kertominen ja sijoittelu" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "Sijoitetaan kappaletta" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "Kaikille kappaleille ei löydy paikkaa tulostustilavuudessa." + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "Uusien paikkojen etsiminen kappaleille" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "Etsitään paikkaa" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "Paikkaa ei löydy" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "Kaatumisraportti" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "" - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" +msgid "Error traceback" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Ladataan laitteita..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Asetetaan näkymää..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Ladataan käyttöliittymää..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Vain yksi G-code-tiedosto voidaan ladata kerralla. Tiedoston {0} tuonti ohitettiin." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Muita tiedostoja ei voida ladata, kun G-code latautuu. Tiedoston {0} tuonti ohitettiin." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "" @@ -1279,12 +1384,11 @@ msgstr "X (leveys)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1374,68 +1478,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "Suuttimen kärjen ja korokejärjestelmän (X- ja Y-akselit) välinen korkeusero. Käytetään estämään aiempien tulosteiden ja korokkeen yhteentörmäyksiä, kun tulostetaan yksi kerrallaan." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "Suulakkeiden määrä" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "Tulostimen tukema tulostuslangan nimellinen halkaisija. Materiaali ja/tai profiili korvaa tarkan halkaisijan." - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "Materiaalin halkaisija" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "Suuttimen koko" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "Aloita GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "GCode-komennot, jotka suoritetaan aivan alussa." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "Lopeta GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "GCode-komennot, jotka suoritetaan aivan lopussa." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "Suutinasetukset" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Suuttimen koko" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "Tulostimen tukema tulostuslangan nimellinen halkaisija. Materiaali ja/tai profiili korvaa tarkan halkaisijan." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "Suuttimen X-siirtymä" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Suuttimen Y-siirtymä" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Suulake – aloita Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Suulake – lopeta Gcode" @@ -1448,8 +1551,9 @@ msgstr "Muutosloki" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1533,7 +1637,7 @@ msgstr "Muokkaa" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "Poista" @@ -1555,14 +1659,14 @@ msgid "Type" msgstr "Tyyppi" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Extended" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1606,8 +1710,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "Anna verkon tulostimen IP-osoite tai isäntänimi." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1628,6 +1730,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 ei ole määritetty yhdistetyn Ultimaker 3 -tulostinryhmän isännäksi" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1658,11 +1765,16 @@ msgid "Available" msgstr "Saatavilla" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "Yhteys tulostimeen menetetty" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1754,138 +1866,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "Aktivoi määritys" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Cura SolidWorks -laajennuksen määritys" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "Viedyn STL:n oletuslaatu:" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "Kysy aina" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "Käytä aina hienoa laatua" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "Käytä aina karkeaa laatua" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "Tuo SolidWorks-tiedosto STL-muodossa..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "Viedyn STL:n laatu" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "Laatu" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "Karkea" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "Hieno" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "Muista valintani" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "Tallenna" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "Värimalli" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "Materiaalin väri" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "Linjojen tyyppi" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "Yhteensopivuustila" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "Näytä siirtoliikkeet" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "Näytä avustimet" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "Näytä kuori" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "Näytä täyttö" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "Näytä vain yläkerrokset" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "Näytä 5 yksityiskohtaista kerrosta ylhäällä" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "Yläosa/alaosa" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "Sisäseinämä" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "" @@ -1910,7 +2134,7 @@ msgctxt "@label" msgid "Settings" msgstr "Asetukset" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Muuta aktiivisia jälkikäsittelykomentosarjoja" @@ -1985,23 +2209,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "Tasoitus" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "Valitse asetukset" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "Valitse tätä mallia varten mukautettavat asetukset" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "Suodatin..." -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "Näytä kaikki" @@ -2360,66 +2614,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "Kaikki on kunnossa! CheckUp on valmis." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "Ei yhteyttä tulostimeen" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "Tulostin ei hyväksy komentoja" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "Huolletaan. Tarkista tulostin" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Tulostetaan..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Keskeytetty" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Valmistellaan..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "Poista tuloste" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "Jatka" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "Keskeytä" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "Keskeytä tulostus" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "Keskeytä tulostus" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "Haluatko varmasti keskeyttää tulostuksen?" @@ -2454,19 +2708,19 @@ msgid "Customized" msgstr "Mukautettu" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "Kysy aina" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "Hylkää äläkä kysy uudelleen" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "Säilytä äläkä kysy uudelleen" @@ -2501,72 +2755,72 @@ msgctxt "@label" msgid "Brand" msgstr "Merkki" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "Materiaalin tyyppi" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "Väri" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "Ominaisuudet" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "Tiheys" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "Läpimitta" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "Tulostuslangan hinta" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "Tulostuslangan paino" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "Tulostuslangan pituus" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "Hinta metriä kohden" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "Materiaali on linkitetty kohteeseen %1 ja niillä on joitain samoja ominaisuuksia." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "Poista materiaalin linkitys" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "Kuvaus" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "Tarttuvuustiedot" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "Tulostusasetukset" @@ -2607,7 +2861,7 @@ msgid "Unit" msgstr "Yksikkö" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "Yleiset" @@ -2622,230 +2876,255 @@ msgctxt "@label" msgid "Language:" msgstr "Kieli:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "Valuutta:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "Teema:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "Sovellus on käynnistettävä uudelleen, jotta nämä muutokset tulevat voimaan." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "Viipaloi automaattisesti, kun asetuksia muutetaan." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "Viipaloi automaattisesti" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "Näyttöikkunan käyttäytyminen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "Korosta mallin vailla tukea olevat alueet punaisella. Ilman tukea nämä alueet eivät tulostu kunnolla." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "Näytä uloke" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "Siirtää kameraa siten, että valittuna oleva malli on näkymän keskellä." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "Keskitä kamera kun kohde on valittu" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "Pitääkö Curan oletusarvoinen zoom-toimintatapa muuttaa päinvastaiseksi?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "Käännä kameran zoomin suunta päinvastaiseksi." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "Tuleeko zoomauksen siirtyä hiiren suuntaan?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "Zoomaa hiiren suuntaan" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "Pitäisikö alustalla olevia malleja siirtää niin, etteivät ne enää leikkaa toisiaan?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "Varmista, että mallit ovat erillään" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "Pitäisikö tulostusalueella olevia malleja siirtää alas niin, että ne koskettavat tulostusalustaa?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "Pudota mallit automaattisesti alustalle" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "Näytä varoitusviesti gcode-lukijassa." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "Gcode-lukijan varoitusviesti" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "Pakotetaanko kerros yhteensopivuustilaan?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "Pakota kerrosnäkymän yhteensopivuustila (vaatii uudelleenkäynnistyksen)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "Tiedostojen avaaminen ja tallentaminen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "Pitäisikö mallit skaalata tulostustilavuuteen, jos ne ovat liian isoja?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "Skaalaa suuret mallit" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "Malli voi vaikuttaa erittäin pieneltä, jos sen koko on ilmoitettu esimerkiksi metreissä eikä millimetreissä. Pitäisikö nämä mallit suurentaa?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "Skaalaa erittäin pienet mallit" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "Pitäisikö tulostustyön nimeen lisätä automaattisesti tulostimen nimeen perustuva etuliite?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "Lisää laitteen etuliite työn nimeen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "Näytetäänkö yhteenveto, kun projektitiedosto tallennetaan?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "Näytä yhteenvetoikkuna, kun projekti tallennetaan" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "Projektitiedoston avaamisen oletustoimintatapa" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "Projektitiedoston avaamisen oletustoimintatapa: " -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "Kysy aina" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "Avaa aina projektina" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "Tuo mallit aina" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "Kun olet tehnyt muutokset profiiliin ja vaihtanut toiseen, näytetään valintaikkuna, jossa kysytään, haluatko säilyttää vai hylätä muutokset. Tässä voit myös valita oletuskäytöksen, jolloin valintaikkunaa ei näytetä uudelleen." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "Kumoa profiili" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "Tietosuoja" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "Pitäisikö Curan tarkistaa saatavilla olevat päivitykset, kun ohjelma käynnistetään?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "Tarkista päivitykset käynnistettäessä" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "Pitäisikö anonyymejä tietoja tulosteesta lähettää Ultimakerille? Huomaa, että malleja, IP-osoitteita tai muita henkilökohtaisia tietoja ei lähetetä eikä tallenneta." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "Lähetä (anonyymit) tulostustiedot" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "Tulostimet" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "Aktivoi" @@ -2888,7 +3167,7 @@ msgid "Waiting for a printjob" msgstr "Odotetaan tulostustyötä" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "Profiilit" @@ -2914,13 +3193,13 @@ msgid "Duplicate" msgstr "Jäljennös" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "Tuo" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "Vie" @@ -2986,7 +3265,7 @@ msgid "Export Profile" msgstr "Profiilin vienti" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "Materiaalit" @@ -3001,60 +3280,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "Tulostin: %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "Luo" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "Jäljennös" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "Tuo materiaali" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr "Materiaalin tuominen epäonnistui: %1: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "Materiaalin tuominen onnistui: %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "Vie materiaali" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "Materiaalin vieminen epäonnistui kohteeseen %1: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "Materiaalin vieminen onnistui kohteeseen %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "Lisää tulostin" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "Tulostimen nimi:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "Lisää tulostin" @@ -3183,12 +3462,7 @@ msgctxt "@label" msgid "Profile:" msgstr "Profiili:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" @@ -3199,37 +3473,37 @@ msgstr "" "\n" "Avaa profiilin hallinta napsauttamalla." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "Haku…" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Kopioi arvo kaikkiin suulakepuristimiin" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Piilota tämä asetus" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Älä näytä tätä asetusta" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Pidä tämä asetus näkyvissä" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Määritä asetusten näkyvyys..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" @@ -3240,27 +3514,27 @@ msgstr "" "\n" "Tee asetuksista näkyviä napsauttamalla." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "Koskee seuraavia:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "Riippuu seuraavista:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "Tämä asetus koskee aina kaikkia suulakepuristimia. Jos se vaihdetaan tässä, kaikkien suulakepuristimien arvo muuttuu" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "Arvo perustuu suulakepuristimien arvoihin " -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 msgctxt "@label" msgid "" "This setting has a value that is different from the profile.\n" @@ -3271,7 +3545,7 @@ msgstr "" "\n" "Palauta profiilin arvo napsauttamalla." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" @@ -3282,12 +3556,12 @@ msgstr "" "\n" "Palauta laskettu arvo napsauttamalla." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Tulostuksen asennus" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" @@ -3296,59 +3570,59 @@ msgstr "" "Tulostuksen asennus ei käytössä\n" "G-code-tiedostoja ei voida muokata" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " +msgid "Time specification" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Suositeltu tulostuksen asennus

    Tulosta valitun tulostimen, materiaalin ja laadun suositelluilla asetuksilla." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Mukautettu tulostuksen asennus

    Tulosta hallitsemalla täysin kaikkia viipalointiprosessin vaiheita." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automaattinen: %1" @@ -3358,6 +3632,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Näytä" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3370,14 +3654,14 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Tulosta valittu malli asetuksella:" msgstr[1] "Tulosta valitut mallit asetuksella:" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Kerro valittu malli" msgstr[1] "Kerro valitut mallit" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "Kopioiden määrä" @@ -3393,7 +3677,7 @@ msgid "No printer connected" msgstr "Ei tulostinta yhdistettynä" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "Suulake" @@ -3503,254 +3787,294 @@ msgctxt "@label" msgid "Estimated time left" msgstr "Aikaa jäljellä arviolta" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Vaihda &koko näyttöön" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Kumoa" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "Tee &uudelleen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Lopeta" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" +msgid "&3D View" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Määritä Curan asetukset..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "L&isää tulostin..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Tulostinten &hallinta..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Hallitse materiaaleja..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Päivitä nykyiset asetukset tai ohitukset profiiliin" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Hylkää tehdyt muutokset" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Luo profiili nykyisten asetusten tai ohitusten perusteella..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profiilien hallinta..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Näytä sähköinen &dokumentaatio" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Ilmoita &virheestä" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "Ti&etoja..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Poista &valittu malli" msgstr[1] "Poista &valitut mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Keskitä valittu malli" msgstr[1] "Keskitä valitut mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Kerro valittu malli" msgstr[1] "Kerro valitut mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Poista malli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ke&skitä malli alustalle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Ryhmittele mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Poista mallien ryhmitys" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Yhdistä mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Kerro malli..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Valitse kaikki mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Tyhjennä tulostusalusta" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "&Lataa kaikki mallit uudelleen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Järjestä kaikki mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Järjestä valinta" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Määritä kaikkien mallien positiot uudelleen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Määritä kaikkien mallien &muutokset uudelleen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Avaa tiedosto(t)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Uusi projekti..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Näytä moottorin l&oki" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Näytä määrityskansio" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Määritä asetusten näkyvyys..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "Selaa lisäosia..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "Asennetut lisäoset..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Lataa 3D-malli" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Valmiina viipaloimaan" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Viipaloidaan..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Valmis: %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Viipalointi ei onnistu" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Viipalointi ei käytettävissä" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Valmistele" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Peruuta" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Valitse aktiivinen tulostusväline" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "Avaa tiedosto(t)" @@ -3770,114 +4094,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Tiedosto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&Tallenna valinta tiedostoon" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Tallenna &nimellä…" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "Tallenna projekti" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Muokkaa" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "&Näytä" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "&Asetukset" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&Tulostin" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "&Materiaali" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profiili" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Aseta aktiiviseksi suulakepuristimeksi" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "Laa&jennukset" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "&Lisäosat" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "L&isäasetukset" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Ohje" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "Avaa tiedosto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "Asetukset" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "Uusi projekti" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "Haluatko varmasti aloittaa uuden projektin? Se tyhjentää alustan ja kaikki tallentamattomat asetukset." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "Asenna laajennus" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "Avaa tiedosto(t)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "Löysimme vähintään yhden Gcode-tiedoston valitsemiesi tiedostojen joukosta. Voit avata vain yhden Gcode-tiedoston kerrallaan. Jos haluat avata Gcode-tiedoston, valitse vain yksi." @@ -3902,97 +4226,82 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Älä näytä projektin yhteenvetoa tallennettaessa" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "Tallenna" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "Valmistele" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "Valvo" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "Kerroksen korkeus" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "Tulostusnopeus" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "Hitaammin" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "Nopeammin" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "Täyttö" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Asteittainen täyttö lisää täytön tiheyttä vähitellen yläosaa kohti." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "Ota asteittainen käyttöön" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "Muodosta tuki" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Muodosta rakenteita, jotka tukevat mallin ulokkeita sisältäviä osia. Ilman tukirakenteita kyseiset osat luhistuvat tulostuksen aikana." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "Tuen suulake" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "Valitse tukena käytettävä suulakepuristin. Näin mallin alle rakennetaan tukirakenteita estämään mallin painuminen tai tulostuminen ilmaan." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Alustan tarttuvuus" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "Ota reunuksen tai pohjaristikon tulostus käyttöön. Tämä lisää kappaleen ympärille tai alle tasaisen alueen, joka on helppo leikata pois myöhemmin." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Tarvitsetko apua tulosteiden parantamiseen?
    Lue Ultimakerin vianmääritysoppaat" @@ -4009,17 +4318,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Avaa projektitiedosto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "Tämä on Cura-projektitiedosto. Haluatko avata sen projektina vai tuoda siinä olevat mallit?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Muista valintani" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "Avaa projektina" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "Tuo mallit" @@ -4029,21 +4343,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Moottorin loki" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "Materiaali" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" +msgid "Check compatibility" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Napsauta ja tarkista materiaalin yhteensopivuus sivustolla Ultimaker.com." +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4134,6 +4463,26 @@ msgctxt "name" msgid "USB printing" msgstr "USB-tulostus" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4154,6 +4503,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3-verkkoyhteys" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4166,8 +4525,8 @@ msgstr "Laiteohjelmiston päivitysten tarkistus" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "Mahdollistaa tiettyjen tiedostojen avaamisen SolidWorks-ohjelmiston kautta. Tämän jälkeen tiedostot muunnetaan ja ladataan Curaan." +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4234,6 +4593,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "Aikaisempien Cura-profiilien lukija" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4394,6 +4763,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Cura-profiilin kirjoitin" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4434,6 +4813,98 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura-profiilin lukija" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "Tuntematon" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "SolidWorks-tiedostoa avattaessa ilmeni virheitä! Tarkista, voiko tiedoston avata SolidWorks-ohjelmistossa ilman ongelmia." + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "%s:n käynnistyksen aikana ilmeni virhe!" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Cura kerää anonyymejä viipalointiin liittyviä tilastotietoja. Tämän voi poistaa käytöstä asetuksien kautta." + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "Ohita" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "Materiaalin halkaisija" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker 3 Extended" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Cura SolidWorks -laajennuksen määritys" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "Viedyn STL:n oletuslaatu:" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "Kysy aina" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "Käytä aina hienoa laatua" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "Käytä aina karkeaa laatua" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "Tuo SolidWorks-tiedosto STL-muodossa..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "Viedyn STL:n laatu" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "Laatu" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "Karkea" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "Hieno" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "Tämä asetus koskee aina kaikkia suulakepuristimia. Jos se vaihdetaan tässä, kaikkien suulakepuristimien arvo muuttuu" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "Tallenna projekti" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "Valmistele" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "Valvo" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "Mahdollistaa tiettyjen tiedostojen avaamisen SolidWorks-ohjelmiston kautta. Tämän jälkeen tiedostot muunnetaan ja ladataan Curaan." + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "Tukossa" @@ -4454,10 +4925,6 @@ msgstr "Cura-profiilin lukija" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "On suositeltavaa päivittää laiteohjelmisto säännöllisesti, jotta voidaan varmistaa, että laitteessa {machine_name} on viimeisimmät ominaisuudet. Tämä voidaan tehdä laitteessa {machine_name} (verkkoon yhdistettynä) tai USB:n kautta." -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "Kerrosnäkymä" - #~ msgctxt "@info:title" #~ msgid "Layer View" #~ msgstr "Kerrosnäkymä" diff --git a/resources/i18n/fi_FI/fdmextruder.def.json.po b/resources/i18n/fi_FI/fdmextruder.def.json.po index a76ee285e0..ea50325417 100644 --- a/resources/i18n/fi_FI/fdmextruder.def.json.po +++ b/resources/i18n/fi_FI/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-08-11 14:31+0200\n" "Last-Translator: Bothof \n" "Language-Team: Finnish\n" diff --git a/resources/i18n/fi_FI/fdmprinter.def.json.po b/resources/i18n/fi_FI/fdmprinter.def.json.po index 23ed6b0da4..678d6afcec 100644 --- a/resources/i18n/fi_FI/fdmprinter.def.json.po +++ b/resources/i18n/fi_FI/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Finnish\n" @@ -349,6 +349,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -609,31 +619,6 @@ 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 "Alkukerroksen korkeus milleinä. Paksumpi alkukerros helpottaa alustaan kiinnittymistä." -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -674,16 +659,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "Yhden seinämälinjan leveys. Koskee kaikkia muita paitsi ulommaista seinämää." -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "Yläpinnan pintakalvon linjan leveys" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "Tulosteen yläosan alueiden yhden linjan leveys." - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -864,41 +839,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "Ylimpien pintakalvokerrosten määrä. Yleensä vain yksi ylin kerros riittää tuottamaan korkeampilaatuisia yläpintoja." -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "Yläpinnan pintakalvokuvio" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "Ylimpien kerrosten kuvio." - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "Linjat" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "Samankeskinen" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Siksak" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "Yläpinnan pintakalvon linjojen suunnat" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "Luettelo käytettävistä linjojen kokonaislukusuunnista, kun yläpinnan pintakalvokerroksilla käytetään linja- tai siksak-kuviota. Tämän luettelon elementtejä käytetään järjestyksessä kerrosten edetessä, ja kun luettelon loppu saavutetaan, aloitetaan taas alusta. Luettelon kohteet on erotettu pilkuilla, ja koko luettelo on hakasulkeiden sisällä. Oletusarvo on tyhjä luettelo, jolloin käytetään perinteisiä oletuskulmia (45 ja 135 astetta)." - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1029,6 +969,16 @@ 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 "Ulkoseinämän reitille asetettu liitos. Jos ulkoseinämä on pienempi kuin suutin ja se tulostetaan sisäseinämien jälkeen, tällä siirtymällä saadaan suuttimen reikä limittymään sisäseinämiin mallin ulkopuolen sijaan." +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "Optimoi seinämien tulostusjärjestys" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "Optimoi seinämien tulostusjärjestys takaisinvetojen ja kuljetun etäisyyden vähentämiseksi. Useimmat osat hyötyvät tämän asetuksen käytöstä, mutta joissakin saattaa kestää kauemmin, joten vertaa tulostusajan arvioita optimointia käytettäessä ja ilman sitä." + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1099,6 +1049,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "Kaikkialla" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1481,7 +1441,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." +msgid "The infill pattern is moved this distance along the X axis." msgstr "" #: fdmprinter.def.json @@ -1491,7 +1451,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." +msgid "The infill pattern is moved this distance along the Y axis." msgstr "" #: fdmprinter.def.json @@ -1511,8 +1471,8 @@ msgstr "Täytön limityksen prosentti" #: 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 "Limityksen määrä täytön ja seinämien välillä. Pienellä limityksellä seinämät liittyvät tukevasti täyttöön." +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1531,8 +1491,8 @@ msgstr "Pintakalvon limityksen prosentti" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "Limityksen määrä pintakalvon ja seinämien välillä linjaleveyden prosenttina. Pienellä limityksellä seinämät liittyvät tukevasti pintakalvoon. Tämä on pintakalvon linjojen ja sisimmän seinämän keskimääräisten linjaleveyksien prosenttiluku." +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1694,16 +1654,6 @@ msgctxt "material description" msgid "Material" msgstr "Materiaali" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -msgstr "Automaattinen lämpötila" - -#: 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 "Muuta kunkin kerroksen lämpötilaa automaattisesti kyseisen kerroksen keskimääräisen virtausnopeuden mukaan." - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1754,16 +1704,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "Lämpötila, johon jäähdytetään jo ennen tulostuksen loppumista." -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "Virtauksen lämpötilakaavio" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "Tiedot, jotka yhdistävät materiaalivirran (mm3 sekunnissa) lämpötilaan (celsiusastetta)." - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1781,8 +1721,8 @@ msgstr "Alustan lämpötila" #: 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 "Lämmitettävän alustan lämpötila. Jos tämä on 0, pöytä ei lämpene tätä tulostusta varten." +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3454,6 +3394,16 @@ 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 "Tornin katon kulma. Korkeampi arvo johtaa teräväkärkisiin tornien kattoihin, matalampi arvo litteämpiin tornien kattoihin." +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "Tukiverkon pudottaminen alaspäin" + +#: 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 "Muodosta tukea kaikkialle tukiverkon alla, niin ettei tukiverkossa ole ulokkeita." + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -4086,16 +4036,6 @@ 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 "Normaalisti Cura yrittää silmukoida umpeen pieniä reikiä verkosta ja poistaa kerroksesta osat, joissa on isoja reikiä. Tämän vaihtoehdon käyttöönotto pitää ne osat, joita ei voida silmukoida. Tätä tulisi pitää viimeisenä vaihtoehtona, kun millään muulla ei saada aikaan kunnollista GCodea." -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4246,16 +4186,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "Käytä tätä verkkoa tukialueiden valintaan. Sen avulla voidaan luoda tukirakenne." -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -msgstr "Tukiverkon pudottaminen alaspäin" - -#: 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 "Muodosta tukea kaikkialle tukiverkon alla, niin ettei tukiverkossa ole ulokkeita." - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4332,14 +4262,194 @@ msgid "experimental!" msgstr "kokeellinen!" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "Optimoi seinämien tulostusjärjestys" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "Optimoi seinämien tulostusjärjestys takaisinvetojen ja kuljetun etäisyyden vähentämiseksi. Useimmat osat hyötyvät tämän asetuksen käytöstä, mutta joissakin saattaa kestää kauemmin, joten vertaa tulostusajan arvioita optimointia käytettäessä ja ilman sitä." +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "Yläpinnan pintakalvon linjan leveys" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "Tulosteen yläosan alueiden yhden linjan leveys." + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "Yläpinnan pintakalvokuvio" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "Ylimpien kerrosten kuvio." + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "Linjat" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "Samankeskinen" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Siksak" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "Yläpinnan pintakalvon linjojen suunnat" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "Luettelo käytettävistä linjojen kokonaislukusuunnista, kun yläpinnan pintakalvokerroksilla käytetään linja- tai siksak-kuviota. Tämän luettelon elementtejä käytetään järjestyksessä kerrosten edetessä, ja kun luettelon loppu saavutetaan, aloitetaan taas alusta. Luettelon kohteet on erotettu pilkuilla, ja koko luettelo on hakasulkeiden sisällä. Oletusarvo on tyhjä luettelo, jolloin käytetään perinteisiä oletuskulmia (45 ja 135 astetta)." + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Automaattinen lämpötila" + +#: 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 "Muuta kunkin kerroksen lämpötilaa automaattisesti kyseisen kerroksen keskimääräisen virtausnopeuden mukaan." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "Virtauksen lämpötilakaavio" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "Tiedot, jotka yhdistävät materiaalivirran (mm3 sekunnissa) lämpötilaan (celsiusastetta)." + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4940,6 +5050,46 @@ 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 "Suuttimen ja vaakasuoraan laskevien linjojen välinen etäisyys. Suurempi väli aiheuttaa vähemmän jyrkän kulman diagonaalisesti laskeviin linjoihin, mikä puolestaan johtaa harvempiin yläliitoksiin seuraavan kerroksen kanssa. Koskee vain rautalankamallin tulostusta." +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -5000,6 +5150,18 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Mallissa käytettävä muunnosmatriisi, kun malli ladataan tiedostosta." +#~ 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 "Limityksen määrä täytön ja seinämien välillä. Pienellä limityksellä seinämät liittyvät tukevasti täyttöön." + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "Limityksen määrä pintakalvon ja seinämien välillä linjaleveyden prosenttina. Pienellä limityksellä seinämät liittyvät tukevasti pintakalvoon. Tämä on pintakalvon linjojen ja sisimmän seinämän keskimääräisten linjaleveyksien prosenttiluku." + +#~ 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 "Lämmitettävän alustan lämpötila. Jos tämä on 0, pöytä ei lämpene tätä tulostusta varten." + #~ msgctxt "wall_x_extruder_nr label" #~ msgid "Inner Walls Extruder" #~ msgstr "Sisäseinämien suulake" diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index 4db845190f..0504b1e50c 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: French\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "Paramètres de la machine" @@ -53,12 +53,11 @@ msgstr "Connexion avec Doodle3D Connecter..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -98,7 +97,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Ouvrir l'interface web Doodle3D Connecter" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Afficher le récapitulatif des changements" @@ -113,78 +112,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "Le profil a été aplati et activé." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "Impression par USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "Imprimer via USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "Imprimer via USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "Connecté via USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Impossible de démarrer une nouvelle tâche car l'imprimante est occupée ou n'est pas connectée." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "Imprimante indisponible" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "L'imprimante ne prend pas en charge l'impression par USB car elle utilise UltiGCode parfum." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "Impression par USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Impossible de démarrer une nouvelle tâche car l'imprimante ne prend pas en charge l'impression par USB." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "Avertissement" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "Impossible de mettre à jour le firmware car il n'y a aucune imprimante connectée." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "Impossible de trouver le firmware requis pour l'imprimante sur %s." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "Firmware de l'imprimante" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -228,11 +232,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Impossible d'enregistrer sur le lecteur {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "Erreur" @@ -282,7 +286,7 @@ msgid "Removable Drive" msgstr "Lecteur amovible" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Imprimer sur le réseau" @@ -396,110 +400,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "Statut de l'imprimante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Impossible de démarrer une nouvelle tâche d'impression. Pas de PrintCore inséré dans la fente {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Impossible de démarrer une nouvelle tâche d'impression car l'imprimante est occupée. Pas de matériau chargé dans la fente {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Pas suffisamment de matériau pour bobine {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "PrintCore différent (Cura : {0}, Imprimante : {1}) sélectionné pour l'extrudeuse {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Matériau différent (Cura : {0}, Imprimante : {1}) sélectionné pour l'extrudeuse {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "Le PrintCore {0} n'est pas correctement calibré. Le calibrage XY doit être effectué sur l'imprimante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Êtes-vous sûr(e) de vouloir imprimer avec la configuration sélectionnée ?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "Problème de compatibilité entre la configuration ou l'étalonnage de l'imprimante et Cura. Pour un résultat optimal, découpez toujours pour les PrintCores et matériaux insérés dans votre imprimante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Configuration différente" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "Envoi de nouvelles tâches (temporairement) bloqué, envoi de la tâche d'impression précédente en cours." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Envoi des données à l'imprimante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "Envoi des données..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Impossible d'envoyer les données à l'imprimante. Une autre tâche est-elle toujours active ?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Abandon de l'impression..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Abandon de l'impression. Vérifiez l'imprimante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Mise en pause de l'impression..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Reprise de l'impression..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Synchroniser avec votre imprimante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Voulez-vous utiliser votre configuration d'imprimante actuelle dans Cura ?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "Les PrintCores et / ou matériaux sur votre imprimante diffèrent de ceux de votre projet actuel. Pour un résultat optimal, découpez toujours pour les PrintCores et matériaux insérés dans votre imprimante." @@ -520,145 +524,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "{printer_name} a terminé d'imprimer '{job_name}'. Veuillez enlever l'impression et confirmer avoir débarrassé le plateau." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} est réservé pour imprimer '{job_name}'. Veuillez modifier la configuration de l'imprimante pour qu'elle corresponde à la tâche et commence l'impression." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Impossible d'envoyer une nouvelle tâche d'impression : cette imprimante 3D n'est pas (encore) configurée pour héberger un groupe d'imprimantes connectées Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Impossible d'envoyer la tâche d'impression vers le groupe {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "{file_name} envoyé vers le groupe {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "Afficher les tâches d'impression" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "Ouvre l'interface d'impression des tâches dans votre navigateur." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "Inconnu" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "{printer_name} a terminé d'imprimer '{job_name}'." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "Impression terminée" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "Action requise" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "Envoi de {file_name} vers le groupe {cluster_name}..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "Connecter via le réseau" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "De nouvelles fonctionnalités sont disponibles pour votre {machine_name} ! Il est recommandé de mettre à jour le firmware sur votre imprimante." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Nouveau firmware %s disponible" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "Comment effectuer la mise à jour" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "Impossible d'accéder aux informations de mise à jour." -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "Des erreurs sont apparues lors de l'ouverture de votre fichier SolidWorks ! Veuillez vérifier s'il est possible d'ouvrir votre fichier dans SolidWorks sans que cela ne cause de problèmes." +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "Fichier de composant SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "Fichier d'assemblage SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "Configurer" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "Erreur lors du lancement de %s !" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "Vue simulation" +msgid "Layer view" +msgstr "Vue en couches" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "Cura n'affiche pas les couches avec précision lorsque l'impression filaire est activée" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "Vue simulation" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "Modifier le G-Code" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "Cura collecte des statistiques anonymes sur le découpage. Vous pouvez désactiver cette fonctionnalité dans les préférences." +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -667,14 +714,41 @@ msgstr "Collecte des données..." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "Ignorer" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Profils Cura 15.04" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -706,49 +780,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "Image GIF" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "Impossible de découper le matériau actuel, car celui-ci est incompatible avec la machine ou la configuration sélectionnée." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "Impossible de découper" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Impossible de couper avec les paramètres actuels. Les paramètres suivants contiennent des erreurs : {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "Impossible de couper en raison de certains paramètres par modèle. Les paramètres suivants contiennent des erreurs sur un ou plusieurs modèles : {error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Impossible de couper car la tour primaire ou la (les) position(s) d'amorçage ne sont pas valides." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Rien à couper car aucun des modèles ne convient au volume d'impression. Mettez à l'échelle ou faites pivoter les modèles pour les faire correspondre." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "Traitement des couches" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "Informations" @@ -785,14 +859,14 @@ msgstr "Échec de la copie des fichiers plug-ins Siemens NX. Veuillez vérifier msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Échec de l'installation du plug-in Siemens NX. Impossible de définir la variable d'environnement UGII_USER_DIR pour Siemens NX." -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "Recommandé" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "Personnalisé" @@ -803,24 +877,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "Fichier 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "Buse" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Échec de l'obtention de l'identifiant du plug-in au départ de {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "Avertissement" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "Navigateur de plug-ins" @@ -835,18 +909,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Fichier G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "Analyse du G-Code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "Détails G-Code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "Assurez-vous que le g-code est adapté à votre imprimante et à la configuration de l'imprimante avant d'y envoyer le fichier. La représentation du g-code peut ne pas être exacte." @@ -857,6 +931,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Profil Cura" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -888,142 +972,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "Nivellement du plateau" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Paroi externe" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Parois internes" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "Couche extérieure" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "Remplissage" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "Remplissage du support" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "Interface du support" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "Support" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "Jupe" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "Déplacement" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "Rétractions" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "Autre" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "Inconnu" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Fichier {0} prédécoupé" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "Pas de matériau chargé" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "Matériau inconnu" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "Recherche d'un nouvel emplacement pour les objets" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "Recherche d'emplacement..." - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "Impossible de trouver un emplacement dans le volume d'impression pour tous les objets" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "Impossible de trouver un emplacement" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "Le fichier existe déjà" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "Le fichier {0} existe déjà. Êtes-vous sûr de vouloir le remplacer ?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "Personnalisé" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "Matériau personnalisé" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "Global" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "Pas écrasé" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Le matériau sélectionné est incompatible avec la machine ou la configuration sélectionnée." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1044,67 +1102,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Annuler la modification du diamètre du matériau." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Échec de l'exportation du profil vers {0} : {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Échec de l'exportation du profil vers {0} : le plug-in du générateur a rapporté une erreur." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Profil exporté vers {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "L'exportation a réussi" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Échec de l'importation du profil depuis le fichier {0} : {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Importation du profil {0} réussie" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Le profil {0} est un type de fichier inconnu ou est corrompu." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "Personnaliser le profil" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Il manque un type de qualité au profil." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "Impossible de trouver un type de qualité {0} pour la configuration actuelle." +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1115,142 +1195,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "Volume d'impression" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Multiplication et placement d'objets" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "Placement de l'objet..." -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "Impossible de trouver un emplacement dans le volume d'impression pour tous les objets" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "Recherche d'un nouvel emplacement pour les objets" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "Recherche d'emplacement..." + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "Impossible de trouver un emplacement" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "Rapport d'incident" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    Une exception fatale s'est produite. Veuillez nous envoyer ce Rapport d'incident pour résoudre le problème

    \n

    Veuillez utiliser le bouton « Envoyer rapport » pour publier automatiquement un rapport d'erreur sur nos serveurs

    \n " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "Informations système" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "Inconnu" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Version Cura : {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "Plateforme : {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Version Qt : {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "Version PyQt : {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL : {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • Version OpenGL : {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • Revendeur OpenGL : {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • Moteur de rendu OpenGL : {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "Retraçage de l'exception" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "Journaux" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "Description de l'utilisateur" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "Envoyer rapport" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Chargement des machines..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Préparation de la scène..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Chargement de l'interface..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Un seul fichier G-Code peut être chargé à la fois. Importation de {0} sautée" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Impossible d'ouvrir un autre fichier si le G-Code est en cours de chargement. Importation de {0} sautée" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "Le modèle sélectionné était trop petit pour être chargé." @@ -1279,12 +1384,11 @@ msgstr "X (Largeur)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1374,68 +1478,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "La différence de hauteur entre la pointe de la buse et le système de portique (axes X et Y). Permet d'empêcher les collisions entre les impressions précédentes et le portique lors d'une impression « Un à la fois »." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "Nombre d'extrudeuses" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "Le diamètre nominal de filament pris en charge par l'imprimante. Le diamètre exact sera remplacé par le matériau et / ou le profil." - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "Diamètre du matériau" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "Taille de la buse" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "Début Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Commandes Gcode à exécuter au tout début." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "Fin Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Commandes Gcode à exécuter tout à la fin." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "Paramètres de la buse" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Taille de la buse" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "Le diamètre nominal de filament pris en charge par l'imprimante. Le diamètre exact sera remplacé par le matériau et / ou le profil." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "Décalage buse X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Décalage buse Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Extrudeuse Gcode de démarrage" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Extrudeuse Gcode de fin" @@ -1448,8 +1551,9 @@ msgstr "Récapitulatif des changements" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1514,7 +1618,10 @@ 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 "Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n\nSélectionnez votre imprimante dans la liste ci-dessous :" +msgstr "" +"Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n" +"\n" +"Sélectionnez votre imprimante dans la liste ci-dessous :" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1530,7 +1637,7 @@ msgstr "Modifier" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "Supprimer" @@ -1552,14 +1659,14 @@ msgid "Type" msgstr "Type" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Extended" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1603,8 +1710,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "Saisissez l'adresse IP ou le nom d'hôte de votre imprimante sur le réseau." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1625,6 +1730,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 n'est pas configurée pour héberger un groupe d'imprimantes connectées Ultimaker 3." +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1655,11 +1765,16 @@ msgid "Available" msgstr "Disponible" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "Connexion avec l'imprimante perdue" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1751,138 +1866,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "Activer la configuration" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Configuration du plug-in Cura SolidWorks" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "Qualité par défaut du STL exporté :" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "Toujours demander" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "Toujours utiliser la qualité Fine" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "Toujours utiliser la qualité grossière" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "Importer le fichier SolidWorks comme STL..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "Qualité du STL exporté" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "Qualité" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "Grossière" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "Fine" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "Se souvenir de mon choix" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "Enregistrer" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "Modèle de couleurs" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "Couleur du matériau" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "Type de ligne" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "Taux d'alimentation" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "Épaisseur de la couche" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "Mode de compatibilité" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "Afficher les déplacements" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "Afficher les aides" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "Afficher la coque" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "Afficher le remplissage" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "Afficher uniquement les couches supérieures" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "Afficher 5 niveaux détaillés en haut" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "Haut / bas" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "Paroi interne" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "min." -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "max." @@ -1907,7 +2134,7 @@ msgctxt "@label" msgid "Settings" msgstr "Paramètres" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Modifier les scripts de post-traitement actifs" @@ -1982,23 +2209,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "Lissage" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "Sélectionner les paramètres" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "Sélectionner les paramètres pour personnaliser ce modèle" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "Filtrer..." -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "Afficher tout" @@ -2166,7 +2423,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Ce plug-in contient une licence.\nVous devez approuver cette licence pour installer ce plug-in.\nAcceptez-vous les clauses ci-dessous ?" +msgstr "" +"Ce plug-in contient une licence.\n" +"Vous devez approuver cette licence pour installer ce plug-in.\n" +"Acceptez-vous les clauses ci-dessous ?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2357,66 +2617,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "Tout est en ordre ! Vous avez terminé votre check-up." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "Non connecté à une imprimante" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "L'imprimante n'accepte pas les commandes" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "En maintenance. Vérifiez l'imprimante" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Impression..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "En pause" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Préparation..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "Supprimez l'imprimante" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "Reprendre" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "Pause" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "Abandonner l'impression" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "Abandonner l'impression" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "Êtes-vous sûr(e) de vouloir abandonner l'impression ?" @@ -2431,7 +2691,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Vous avez personnalisé certains paramètres du profil.\nSouhaitez-vous conserver ces changements, ou les annuler ?" +msgstr "" +"Vous avez personnalisé certains paramètres du profil.\n" +"Souhaitez-vous conserver ces changements, ou les annuler ?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2449,19 +2711,19 @@ msgid "Customized" msgstr "Personnalisé" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "Toujours me demander" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "Annuler et ne plus me demander" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "Conserver et ne plus me demander" @@ -2496,72 +2758,72 @@ msgctxt "@label" msgid "Brand" msgstr "Marque" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "Type de matériau" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "Couleur" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "Propriétés" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "Densité" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "Diamètre" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "Coût du filament" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "Poids du filament" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "Longueur du filament" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "Coût au mètre" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "Ce matériau est lié à %1 et partage certaines de ses propriétés." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "Délier le matériau" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "Description" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "Informations d'adhérence" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "Paramètres d'impression" @@ -2602,7 +2864,7 @@ msgid "Unit" msgstr "Unité" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "Général" @@ -2617,230 +2879,255 @@ msgctxt "@label" msgid "Language:" msgstr "Langue :" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "Devise :" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "Thème :" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "Vous devez redémarrer l'application pour que ces changements prennent effet." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "Découper automatiquement si les paramètres sont modifiés." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "Découper automatiquement" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "Comportement Viewport" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "Surligne les parties non supportées du modèle en rouge. Sans ajouter de support, ces zones ne s'imprimeront pas correctement." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "Mettre en surbrillance les porte-à-faux" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "Déplace la caméra afin que le modèle sélectionné se trouve au centre de la vue." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "Centrer la caméra lorsqu'un élément est sélectionné" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "Le comportement de zoom par défaut de Cura doit-il être inversé ?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "Inverser la direction du zoom de la caméra." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "Le zoom doit-il se faire dans la direction de la souris ?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "Zoomer vers la direction de la souris" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "Les modèles dans la zone d'impression doivent-ils être déplacés afin de ne plus se croiser ?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "Veillez à ce que les modèles restent séparés" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "Les modèles dans la zone d'impression doivent-ils être abaissés afin de toucher le plateau ?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "Abaisser automatiquement les modèles sur le plateau" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "Afficher le message d'avertissement dans le lecteur gcode." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "Message d'avertissement dans lecteur gcode." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "La couche doit-elle être forcée en mode de compatibilité ?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "Forcer l'affichage de la couche en mode de compatibilité (redémarrage requis)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "Ouvrir et enregistrer des fichiers" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "Les modèles doivent-ils être mis à l'échelle du volume d'impression s'ils sont trop grands ?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "Réduire la taille des modèles trop grands" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "Un modèle peut apparaître en tout petit si son unité est par exemple en mètres plutôt qu'en millimètres. Ces modèles doivent-ils être agrandis ?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "Mettre à l'échelle les modèles extrêmement petits" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "Un préfixe basé sur le nom de l'imprimante doit-il être automatiquement ajouté au nom de la tâche d'impression ?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "Ajouter le préfixe de la machine au nom de la tâche" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "Un résumé doit-il être affiché lors de l'enregistrement d'un fichier de projet ?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "Afficher la boîte de dialogue du résumé lors de l'enregistrement du projet" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "Comportement par défaut lors de l'ouverture d'un fichier de projet" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "Comportement par défaut lors de l'ouverture d'un fichier de projet : " -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "Toujours demander" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "Toujours ouvrir comme projet" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "Toujours importer les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "Lorsque vous apportez des modifications à un profil puis passez à un autre profil, une boîte de dialogue apparaît, vous demandant si vous souhaitez conserver les modifications. Vous pouvez aussi choisir une option par défaut, et le dialogue ne s'affichera plus." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "Écraser le profil" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "Confidentialité" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "Cura doit-il vérifier les mises à jour au démarrage du programme ?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "Vérifier les mises à jour au démarrage" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "Les données anonymes de votre impression doivent-elles être envoyées à Ultimaker ? Notez qu'aucun modèle, aucune adresse IP ni aucune autre information permettant de vous identifier personnellement ne seront envoyés ou stockés." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "Envoyer des informations (anonymes) sur l'impression" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "Imprimantes" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "Activer" @@ -2883,7 +3170,7 @@ msgid "Waiting for a printjob" msgstr "En attente d'une tâche d'impression" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "Profils" @@ -2909,13 +3196,13 @@ msgid "Duplicate" msgstr "Dupliquer" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "Importer" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "Exporter" @@ -2981,7 +3268,7 @@ msgid "Export Profile" msgstr "Exporter un profil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "Matériaux" @@ -2996,60 +3283,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "Imprimante : %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "Créer" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "Dupliquer" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "Importer un matériau" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr "Impossible d'importer le matériau %1 : %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "Matériau %1 importé avec succès" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "Exporter un matériau" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "Échec de l'exportation de matériau vers %1 : %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "Matériau exporté avec succès vers %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "Ajouter une imprimante" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "Nom de l'imprimante :" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "Ajouter une imprimante" @@ -3074,7 +3361,9 @@ 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 a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\nCura est fier d'utiliser les projets open source suivants :" +msgstr "" +"Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\n" +"Cura est fier d'utiliser les projets open source suivants :" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3176,158 +3465,167 @@ msgctxt "@label" msgid "Profile:" msgstr "Profil :" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "Aucun profil disponible" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 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 "Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n\nCliquez pour ouvrir le gestionnaire de profils." +msgstr "" +"Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n" +"\n" +"Cliquez pour ouvrir le gestionnaire de profils." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "Rechercher..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Copier la valeur vers tous les extrudeurs" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Masquer ce paramètre" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Masquer ce paramètre" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Afficher ce paramètre" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Configurer la visibilité des paramètres..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n\nCliquez pour rendre ces paramètres visibles." +msgstr "" +"Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n" +"\n" +"Cliquez pour rendre ces paramètres visibles." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "Touche" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "Touché par" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "Ce paramètre est toujours partagé par tous les extrudeurs. Le modifier ici entraînera la modification de la valeur pour tous les extrudeurs." +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "La valeur est résolue à partir des valeurs par extrudeur " -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 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 "Ce paramètre possède une valeur qui est différente du profil.\n\nCliquez pour restaurer la valeur du profil." +msgstr "" +"Ce paramètre possède une valeur qui est différente du profil.\n" +"\n" +"Cliquez pour restaurer la valeur du profil." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 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 "Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n\nCliquez pour restaurer la valeur calculée." +msgstr "" +"Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n" +"\n" +"Cliquez pour restaurer la valeur calculée." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Configuration de l'impression" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Configuration de l'impression désactivée\nLes fichiers G-Code ne peuvent pas être modifiés" +msgstr "" +"Configuration de l'impression désactivée\n" +"Les fichiers G-Code ne peuvent pas être modifiés" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00h 00min" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "Spécification de temps
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "Spécification de coût" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "Total :" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Configuration de l'impression recommandée

    Imprimer avec les paramètres recommandés pour l'imprimante, le matériau et la qualité sélectionnés." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Configuration de l'impression personnalisée

    Imprimer avec un contrôle fin de chaque élément du processus de découpe." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automatique : %1" @@ -3337,6 +3635,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Visualisation" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3349,14 +3657,14 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Imprimer le modèle sélectionné avec :" msgstr[1] "Imprimer les modèles sélectionnés avec :" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplier le modèle sélectionné" msgstr[1] "Multiplier les modèles sélectionnés" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "Nombre de copies" @@ -3372,7 +3680,7 @@ msgid "No printer connected" msgstr "Aucune imprimante n'est connectée" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "Extrudeuse" @@ -3482,254 +3790,294 @@ msgctxt "@label" msgid "Estimated time left" msgstr "Durée restante estimée" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Passer en P&lein écran" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Annuler" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Rétablir" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Quitter" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "&Réinitialiser la position de la caméra" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configurer Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Ajouter une imprimante..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Gérer les &imprimantes..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Gérer les matériaux..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Mettre à jour le profil à l'aide des paramètres / forçages actuels" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Ignorer les modifications actuelles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Créer un profil à partir des paramètres / forçages actuels..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Gérer les profils..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Afficher la &documentation en ligne" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Notifier un &bug" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&À propos de..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Supprimer le modèle &sélectionné" msgstr[1] "Supprimer les modèles &sélectionnés" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Centrer le modèle sélectionné" msgstr[1] "Centrer les modèles sélectionnés" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplier le modèle sélectionné" msgstr[1] "Multiplier les modèles sélectionnés" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Supprimer le modèle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ce&ntrer le modèle sur le plateau" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Grouper les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Dégrouper les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Fusionner les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Multiplier le modèle..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Sélectionner tous les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Supprimer les objets du plateau" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Rechar&ger tous les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Réorganiser tous les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Réorganiser la sélection" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Réinitialiser toutes les positions des modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Réinitialiser tous les modèles et transformations" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Ouvrir le(s) fichier(s)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nouveau projet..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Afficher le &journal du moteur..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Afficher le dossier de configuration" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configurer la visibilité des paramètres..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "Parcourir les plug-ins..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "Plug-ins installés..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Veuillez charger un modèle 3D" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Prêt à découper" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Découpe en cours..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Prêt à %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Impossible de découper" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Découpe indisponible" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Préparer" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Annuler" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Sélectionner le périphérique de sortie actif" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "Ouvrir le(s) fichier(s)" @@ -3749,114 +4097,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Fichier" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "Enregi&strer la sélection dans un fichier" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Enregistrer &sous..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "Enregistrer le projet" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Modifier" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "&Visualisation" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "&Paramètres" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "Im&primante" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "&Matériau" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Définir comme extrudeur actif" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "E&xtensions" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "&Plug-ins" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "P&références" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Aide" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "Ouvrir un fichier" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "Paramètres" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "Nouveau projet" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "Êtes-vous sûr(e) de souhaiter lancer un nouveau projet ? Cela supprimera les objets du plateau ainsi que tous paramètres non enregistrés." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "Installer plug-in" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "Ouvrir le(s) fichier(s)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "Nous avons trouvé au moins un fichier G-Code parmi les fichiers que vous avez sélectionné. Vous ne pouvez ouvrir qu'un seul fichier G-Code à la fois. Si vous souhaitez ouvrir un fichier G-Code, veuillez ne sélectionner qu'un seul fichier de ce type." @@ -3881,97 +4229,82 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Ne pas afficher à nouveau le résumé du projet lors de l'enregistrement" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "Enregistrer" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "Préparer" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "Surveiller" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "Hauteur de la couche" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "Un profil personnalisé est actuellement actif. Pour activer le curseur de qualité, choisissez un profil de qualité par défaut dans l'onglet Personnaliser" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "Vitesse d’impression" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "Ralentir" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "Accélérer" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "Vous avez modifié certains paramètres du profil. Si vous souhaitez les modifier, allez dans le mode Personnaliser." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "Remplissage" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Un remplissage graduel augmentera la quantité de remplissage vers le haut." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "Permettre le remplissage graduel" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "Générer les supports" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Générer des structures pour soutenir les parties du modèle qui possèdent des porte-à-faux. Sans ces structures, ces parties s'effondreront durant l'impression." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "Extrudeuse de soutien" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "Sélectionnez l'extrudeur à utiliser comme support. Cela créera des structures de support sous le modèle afin de l'empêcher de s'affaisser ou de s'imprimer dans les airs." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Adhérence au plateau" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "Activez l'impression d'une bordure ou plaquette (Brim/Raft). Cela ajoutera une zone plate autour de ou sous votre objet qui est facile à découper par la suite." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Besoin d'aide pour améliorer vos impressions ?
    Lisez les Guides de dépannage Ultimaker" @@ -3988,17 +4321,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Ouvrir un fichier de projet" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "Ceci est un fichier de projet Cura. Souhaitez-vous l'ouvrir comme projet ou en importer les modèles ?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Se souvenir de mon choix" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "Ouvrir comme projet" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "Importer les modèles" @@ -4008,21 +4346,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Journal du moteur" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "Matériau" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "Vérifier la compatibilité" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Cliquez ici pour vérifier la compatibilité des matériaux sur Ultimaker.com." +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4113,6 +4466,26 @@ msgctxt "name" msgid "USB printing" msgstr "Impression par USB" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4133,6 +4506,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Connexion au réseau UM3" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4145,8 +4528,8 @@ msgstr "Vérificateur des mises à jour du firmware" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "Donne la possibilité d'ouvrir certains fichiers via SolidWorks. Ces fichiers sont ensuite convertis et chargés dans Cura." +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4213,6 +4596,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "Lecteur de profil Cura antérieur" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4373,6 +4766,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Générateur de profil Cura" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4413,6 +4816,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Lecteur de profil Cura" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "Inconnu" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "Des erreurs sont apparues lors de l'ouverture de votre fichier SolidWorks ! Veuillez vérifier s'il est possible d'ouvrir votre fichier dans SolidWorks sans que cela ne cause de problèmes." + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "Erreur lors du lancement de %s !" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "Vue simulation" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Cura collecte des statistiques anonymes sur le découpage. Vous pouvez désactiver cette fonctionnalité dans les préférences." + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "Ignorer" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "Global" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    Une exception fatale s'est produite. Veuillez nous envoyer ce Rapport d'incident pour résoudre le problème

    \n" +#~ "

    Veuillez utiliser le bouton « Envoyer rapport » pour publier automatiquement un rapport d'erreur sur nos serveurs

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Version Cura : {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "Plateforme : {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Version Qt : {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "Version PyQt : {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL : {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "Retraçage de l'exception" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "Diamètre du matériau" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker 3 Extended" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Configuration du plug-in Cura SolidWorks" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "Qualité par défaut du STL exporté :" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "Toujours demander" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "Toujours utiliser la qualité Fine" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "Toujours utiliser la qualité grossière" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "Importer le fichier SolidWorks comme STL..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "Qualité du STL exporté" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "Qualité" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "Grossière" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "Fine" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "Aucun profil disponible" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "Ce paramètre est toujours partagé par tous les extrudeurs. Le modifier ici entraînera la modification de la valeur pour tous les extrudeurs." + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "Spécification de temps
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "&Réinitialiser la position de la caméra" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "Enregistrer le projet" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "Préparer" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "Surveiller" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "Vérifier la compatibilité" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "Donne la possibilité d'ouvrir certains fichiers via SolidWorks. Ces fichiers sont ensuite convertis et chargés dans Cura." + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "Bloqué" @@ -4433,13 +4986,9 @@ msgstr "Lecteur de profil Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Pour s'assurer que votre {machine_name} est pourvue des dernières fonctionnalités, il est recommandé de mettre régulièrement à jour le firmware. Cela peut se faire sur la {machine_name} (lorsque connectée au réseau) ou via USB." -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Vue en couches" - -msgctxt "@info:title" -msgid "Layer View" -msgstr "Vue en couches" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Vue en couches" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4541,9 +5090,9 @@ msgstr "Vue en couches" #~ msgid "Provides the Layer view." #~ msgstr "Permet la vue en couches." -msgctxt "name" -msgid "Layer View" -msgstr "Vue en couches" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Vue en couches" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4864,9 +5413,9 @@ msgstr "Vue en couches" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Fournit la prise en charge de l'importation de profils à partir de fichiers g-code." -msgctxt "@label" -msgid "Layer View" -msgstr "Vue en couches" +#~ msgctxt "@label" +#~ msgid "Layer View" +#~ msgstr "Vue en couches" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/fr_FR/fdmextruder.def.json.po b/resources/i18n/fr_FR/fdmextruder.def.json.po index fdec72de32..ead5e0a87b 100644 --- a/resources/i18n/fr_FR/fdmextruder.def.json.po +++ b/resources/i18n/fr_FR/fdmextruder.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: French\n" diff --git a/resources/i18n/fr_FR/fdmprinter.def.json.po b/resources/i18n/fr_FR/fdmprinter.def.json.po index 0e768253dc..e5aa684c90 100644 --- a/resources/i18n/fr_FR/fdmprinter.def.json.po +++ b/resources/i18n/fr_FR/fdmprinter.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: French\n" @@ -56,7 +56,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "Commandes Gcode à exécuter au tout début, séparées par \n." +msgstr "" +"Commandes Gcode à exécuter au tout début, séparées par \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +70,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "Commandes Gcode à exécuter à la toute fin, séparées par \n." +msgstr "" +"Commandes Gcode à exécuter à la toute fin, séparées par \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -345,6 +349,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -605,31 +619,6 @@ 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 "La hauteur de la couche initiale en mm. Une couche initiale plus épaisse adhère plus facilement au plateau." -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "Tolérance à la découpe" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "Comment découper des couches avec des surfaces diagonales. Les zones d'une couche peuvent être générées en fonction de l'endroit où le milieu de la couche croise la surface (Milieu). Alternativement, chaque couche peut posséder des zones situées à l'intérieur du volume à travers toute la hauteur de la couche (Exclusif), ou une couche peut avoir des zones situées à l'intérieur à tout endroit dans la couche (Inclusif). L'option Exclusif permet de retenir le plus de détails, Inclusif permet d'obtenir une adaptation optimale et Milieu demande le moins de temps de traitement." - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "Milieu" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "Exclusif" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "Inclusif" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -670,16 +659,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "Largeur d'une seule ligne de la paroi pour toutes les lignes de paroi, à l’exception de la ligne la plus externe." -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "Largeur de ligne de couche extérieure de la surface supérieure" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "Largeur d'une seule ligne de la zone en haut de l'impression." - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -860,41 +839,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "Nombre de couches extérieures supérieures. En général, une seule couche supérieure est suffisante pour générer des surfaces supérieures de qualité." -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "Motif de couche extérieure de surface supérieure" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "Le motif des couches supérieures." - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "Lignes" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "Concentrique" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zig Zag" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "Sens de lignes de couche extérieure de surface supérieure" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "Une liste de sens de ligne (exprimés en nombres entiers) à utiliser lorsque les couches extérieures de la surface supérieure utilisent le motif en lignes ou en zig zag. Les éléments de la liste sont utilisés de manière séquentielle à mesure de l'avancement des couches. La liste reprend depuis le début lorsque la fin est atteinte. Les éléments de la liste sont séparés par des virgules et la liste entière est encadrée entre crochets. La valeur par défaut est une liste vide, ce qui signifie que les angles traditionnels par défaut seront utilisés (45 et 135 degrés)." - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1025,6 +969,16 @@ 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 "Insert appliqué sur le passage de la paroi externe. Si la paroi externe est plus petite que la buse et imprimée après les parois intérieures, utiliser ce décalage pour que le trou dans la buse chevauche les parois internes et non l'extérieur du modèle." +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "Optimiser l'ordre d'impression des parois" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "Optimiser l'ordre dans lequel des parois sont imprimées de manière à réduire le nombre de retraits et les distances parcourues. La plupart des pièces bénéficieront de cette possibilité, mais certaines peuvent en fait prendre plus de temps à l'impression ; veuillez dès lors comparer les estimations de durée d'impression avec et sans optimisation." + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1095,6 +1049,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "Partout" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1477,8 +1441,8 @@ msgstr "Remplissage Décalage X" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "Le motif de remplissage est décalé de cette distance sur l'axe X." +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1487,8 +1451,8 @@ msgstr "Remplissage Décalage Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "Le motif de remplissage est décalé de cette distance sur l'axe Y." +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1507,8 +1471,8 @@ msgstr "Pourcentage de chevauchement du remplissage" #: 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 "Le degré de chevauchement entre le remplissage et les parois. Un léger chevauchement permet de lier fermement les parois au remplissage." +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1527,8 +1491,8 @@ msgstr "Pourcentage de chevauchement de la couche extérieure" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "Le montant de chevauchement entre la couche extérieure et les parois en pourcentage de la largeur de ligne. Un chevauchement faible permet aux parois de se connecter fermement à la couche extérieure. Ce montant est un pourcentage des largeurs moyennes des lignes de la couche extérieure et de la paroi la plus intérieure." +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1690,16 +1654,6 @@ msgctxt "material description" msgid "Material" msgstr "Matériau" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -msgstr "Température auto" - -#: 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 "Modifie automatiquement la température pour chaque couche en fonction de la vitesse de flux moyenne pour cette couche." - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1750,16 +1704,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "La température à laquelle le refroidissement commence juste avant la fin de l'impression." -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "Graphique de la température du flux" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "Données reliant le flux de matériau (en mm3 par seconde) à la température (degrés Celsius)." - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1777,8 +1721,8 @@ msgstr "Température du plateau" #: 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 "Température utilisée pour le plateau chauffant. Si elle est définie sur 0, le plateau ne sera pas chauffé pour cette impression." +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3450,6 +3394,16 @@ 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 "L'angle du toit d'une tour. Une valeur plus élevée entraîne des toits de tour pointus, tandis qu'une valeur plus basse résulte en des toits plats." +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "Maillage de support descendant" + +#: 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 "Inclure du support à tout emplacement sous le maillage de support, de sorte à ce qu'il n'y ait pas de porte-à-faux dans le maillage de support." + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -3550,7 +3504,9 @@ 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 "La distance horizontale entre la jupe et la première couche de l’impression.\nIl s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur." +msgstr "" +"La distance horizontale entre la jupe et la première couche de l’impression.\n" +"Il s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4082,16 +4038,6 @@ 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 "Normalement, Cura essaye de raccommoder les petits trous dans le maillage et supprime les parties des couches contenant de gros trous. Activer cette option pousse Cura à garder les parties qui ne peuvent être raccommodées. Cette option doit être utilisée en dernier recours quand tout le reste échoue à produire un GCode correct." -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "Résolution maximum" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "Taille minimum d'un segment de ligne après découpage. Si vous augmentez cette valeur, la maille aura une résolution plus faible. Cela peut permettre à l'imprimante de suivre la vitesse à laquelle elle doit traiter le G-Code et augmentera la vitesse de découpe en enlevant des détails de la maille que l'imprimante ne peut pas traiter de toute manière." - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4242,16 +4188,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "Utiliser ce maillage pour spécifier des zones de support. Cela peut être utilisé pour générer une structure de support." -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -msgstr "Maillage de support descendant" - -#: 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 "Inclure du support à tout emplacement sous le maillage de support, de sorte à ce qu'il n'y ait pas de porte-à-faux dans le maillage de support." - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4328,14 +4264,194 @@ msgid "experimental!" msgstr "expérimental !" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "Optimiser l'ordre d'impression des parois" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "Optimiser l'ordre dans lequel des parois sont imprimées de manière à réduire le nombre de retraits et les distances parcourues. La plupart des pièces bénéficieront de cette possibilité, mais certaines peuvent en fait prendre plus de temps à l'impression ; veuillez dès lors comparer les estimations de durée d'impression avec et sans optimisation." +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "Tolérance à la découpe" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "Comment découper des couches avec des surfaces diagonales. Les zones d'une couche peuvent être générées en fonction de l'endroit où le milieu de la couche croise la surface (Milieu). Alternativement, chaque couche peut posséder des zones situées à l'intérieur du volume à travers toute la hauteur de la couche (Exclusif), ou une couche peut avoir des zones situées à l'intérieur à tout endroit dans la couche (Inclusif). L'option Exclusif permet de retenir le plus de détails, Inclusif permet d'obtenir une adaptation optimale et Milieu demande le moins de temps de traitement." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "Milieu" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "Exclusif" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "Inclusif" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "Largeur de ligne de couche extérieure de la surface supérieure" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "Largeur d'une seule ligne de la zone en haut de l'impression." + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "Motif de couche extérieure de surface supérieure" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "Le motif des couches supérieures." + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "Lignes" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "Concentrique" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zig Zag" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "Sens de lignes de couche extérieure de surface supérieure" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "Une liste de sens de ligne (exprimés en nombres entiers) à utiliser lorsque les couches extérieures de la surface supérieure utilisent le motif en lignes ou en zig zag. Les éléments de la liste sont utilisés de manière séquentielle à mesure de l'avancement des couches. La liste reprend depuis le début lorsque la fin est atteinte. Les éléments de la liste sont séparés par des virgules et la liste entière est encadrée entre crochets. La valeur par défaut est une liste vide, ce qui signifie que les angles traditionnels par défaut seront utilisés (45 et 135 degrés)." + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Température auto" + +#: 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 "Modifie automatiquement la température pour chaque couche en fonction de la vitesse de flux moyenne pour cette couche." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "Graphique de la température du flux" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "Données reliant le flux de matériau (en mm3 par seconde) à la température (degrés Celsius)." + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "Résolution maximum" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "Taille minimum d'un segment de ligne après découpage. Si vous augmentez cette valeur, la maille aura une résolution plus faible. Cela peut permettre à l'imprimante de suivre la vitesse à laquelle elle doit traiter le G-Code et augmentera la vitesse de découpe en enlevant des détails de la maille que l'imprimante ne peut pas traiter de toute manière." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4827,7 +4943,9 @@ 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 "Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\nCela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire." +msgstr "" +"Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\n" +"Cela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4934,6 +5052,46 @@ 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 "Distance entre la buse et les lignes descendantes horizontalement. Un espacement plus important génère des lignes diagonalement descendantes avec un angle moins abrupt, qui génère alors des connexions moins ascendantes avec la couche suivante. Uniquement applicable à l'impression filaire." +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4994,6 +5152,26 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Matrice de transformation à appliquer au modèle lors de son chargement depuis le fichier." +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "Le motif de remplissage est décalé de cette distance sur l'axe X." + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "Le motif de remplissage est décalé de cette distance sur l'axe Y." + +#~ 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 "Le degré de chevauchement entre le remplissage et les parois. Un léger chevauchement permet de lier fermement les parois au remplissage." + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "Le montant de chevauchement entre la couche extérieure et les parois en pourcentage de la largeur de ligne. Un chevauchement faible permet aux parois de se connecter fermement à la couche extérieure. Ce montant est un pourcentage des largeurs moyennes des lignes de la couche extérieure et de la paroi la plus intérieure." + +#~ 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 "Température utilisée pour le plateau chauffant. Si elle est définie sur 0, le plateau ne sera pas chauffé pour cette impression." + #~ msgctxt "wall_x_extruder_nr label" #~ msgid "Inner Walls Extruder" #~ msgstr "Extrudeuse de parois internes" diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po index a4c9ef40f8..f4820d1aa7 100644 --- a/resources/i18n/it_IT/cura.po +++ b/resources/i18n/it_IT/cura.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "Impostazioni macchina" @@ -53,12 +53,11 @@ msgstr "Collegamento a Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -98,7 +97,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Apri interfaccia web Doodle3D Connect" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Visualizza registro modifiche" @@ -113,78 +112,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "Il profilo è stato appiattito e attivato." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "Stampa USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "Stampa tramite USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "Stampa tramite USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "Connesso tramite USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Impossibile avviare un nuovo processo di stampa perché la stampante è occupata o non collegata." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "Stampante non disponibile" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Questa stampante non supporta la stampa tramite USB in quanto utilizza la versione UltiGCode." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "Stampa USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Impossibile avviare un nuovo processo di stampa perché la stampante non supporta la stampa tramite USB." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "Avvertenza" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "Impossibile aggiornare il firmware perché non ci sono stampanti collegate." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "Impossibile trovare il firmware richiesto per la stampante a %s." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "Firmware stampante" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -228,11 +232,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Impossibile salvare su unità rimovibile {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "Errore" @@ -282,7 +286,7 @@ msgid "Removable Drive" msgstr "Unità rimovibile" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Stampa sulla rete" @@ -396,110 +400,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "Stato stampante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Impossibile avviare un nuovo processo di stampa. Nessun Printcore caricato nello slot {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Impossibile avviare un nuovo processo di stampa. Nessun materiale caricato nello slot {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Materiale per la bobina insufficiente {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "PrintCore diverso (Cura: {0}, Stampante: {1}) selezionata per estrusore {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Materiale diverso (Cura: {0}, Stampante: {1}) selezionato per l’estrusore {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "PrintCore {0} non correttamente calibrato. Necessario eseguire calibrazione XY sulla stampante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Sei sicuro di voler stampare con la configurazione selezionata?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "Le configurazioni o la calibrazione della stampante e di Cura non corrispondono. Per ottenere i migliori risultati, sezionare sempre per i PrintCore e i materiali inseriti nella stampante utilizzata." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Mancata corrispondenza della configurazione" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "Invio nuovi processi (temporaneamente) bloccato, invio in corso precedente processo di stampa." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Invio dati alla stampante in corso" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "Invio dati" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Impossibile inviare i dati alla stampante. Altro processo ancora attivo?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Interruzione stampa in corso..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Stampa interrotta. Controllare la stampante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Messa in pausa stampa..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Ripresa stampa..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Sincronizzazione con la stampante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Desideri utilizzare la configurazione corrente della tua stampante in Cura?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "I PrintCore e/o i materiali sulla stampante differiscono da quelli contenuti nel tuo attuale progetto. Per ottenere i risultati migliori, sezionare sempre per i PrintCore e i materiali inseriti nella stampante utilizzata." @@ -520,145 +524,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "{printer_name} ha terminato la stampa '{job_name}'. Raccogliere la stampa e confermare la liberazione del piano di stampa." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} è riservata per la stampa di '{job_name}'. Modificare la configurazione della stampante in modo che corrisponda al lavoro da eseguire per avviare il processo di stampa." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Impossibile inviare nuovo processo di stampa: questa stampante 3D non è (ancora) configurata per supportare la connessione di un gruppo di stampanti Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Impossibile inviare processo di stampa a gruppo {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "Inviato {file_name} a gruppo {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "Mostra processi di stampa" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "Apre l'interfaccia processi di stampa sul browser." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "Sconosciuto" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "La stampante '{printer_name}' ha finito di stampare '{job_name}'." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "Stampa finita" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "Richiede un'azione" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "Invio {file_name} a gruppo {cluster_name}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "Collega tramite rete" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "Sono disponibili nuove funzioni per la {machine_name}! Si consiglia di aggiornare il firmware sulla stampante." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Nuovo firmware %s disponibile" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "Modalità di aggiornamento" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "Non è possibile accedere alle informazioni di aggiornamento." -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "Rilevati errori all'apertura del file SolidWorks! Controllare se è possibile aprire il file in SolidWorks senza che si verifichino problemi!" +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "File part SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "File gruppo SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "Configura" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "Errore durante l'avvio di %s!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "Vista simulazione" +msgid "Layer view" +msgstr "Visualizzazione strato" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "Cura non visualizza in modo accurato gli strati se la funzione Wire Printing è abilitata" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "Vista simulazione" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "Modifica G-code" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "Cura acquisisce dati statistici elaborati in forma anonima. L'acquisizione può essere disabilitata nelle preferenze." +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -667,14 +714,41 @@ msgstr "Acquisizione dati" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "Ignora" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Profili Cura 15.04" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -706,49 +780,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "Immagine GIF" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "Impossibile eseguire il sezionamento con il materiale corrente in quanto incompatibile con la macchina o la configurazione selezionata." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "Sezionamento impossibile" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Impossibile eseguire il sezionamento con le impostazioni attuali. Le seguenti impostazioni presentano errori: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "Impossibile eseguire il sezionamento a causa di alcune impostazioni per modello. Le seguenti impostazioni presentano errori su uno o più modelli: {error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Impossibile eseguire il sezionamento perché la torre di innesco o la posizione di innesco non sono valide." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Nulla da sezionare in quanto nessuno dei modelli corrisponde al volume di stampa. Ridimensionare o ruotare i modelli secondo necessità." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "Elaborazione dei livelli" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "Informazioni" @@ -785,14 +859,14 @@ msgstr "Impossibile copiare i file di plugin Siemens NX. Controllare UGII_USER_D msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Impossibile installare plugin Siemens NX. Impossibile impostare la variabile di ambiente UGII_USER_DIR per Siemens NX." -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "Consigliata" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "Personalizzata" @@ -803,24 +877,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "File 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "Ugello" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Impossibile ottenere ID plugin da {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "Avvertenza" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "Browser plugin" @@ -835,18 +909,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "File G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "Parsing codice G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "Dettagli codice G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "Verifica che il codice G sia idoneo alla tua stampante e alla sua configurazione prima di trasmettere il file. La rappresentazione del codice G potrebbe non essere accurata." @@ -857,6 +931,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Profilo Cura" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -888,142 +972,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "Livella piano di stampa" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Parete esterna" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Pareti interne" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "Rivestimento esterno" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "Riempimento" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "Riempimento del supporto" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "Interfaccia supporto" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "Supporto" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "Skirt" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "Spostamenti" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "Retrazioni" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "Altro" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "Sconosciuto" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "File pre-sezionato {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "Nessun materiale caricato" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "Materiale sconosciuto" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "Ricerca nuova posizione per gli oggetti" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "Ricerca posizione" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "Impossibile individuare una posizione nel volume di stampa per tutti gli oggetti" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "Impossibile individuare posizione" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "Il file esiste già" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "Il file {0} esiste già. Sei sicuro di volerlo sovrascrivere?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "Personalizzata" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "Materiale personalizzato" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "Globale" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "Non sottoposto a override" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Il materiale selezionato è incompatibile con la macchina o la configurazione selezionata." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1044,67 +1102,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Annulla modifica del diametro del materiale." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Impossibile esportare il profilo su {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Impossibile esportare il profilo su {0}: Rilevata anomalia durante scrittura plugin." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Profilo esportato su {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "Esportazione riuscita" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Impossibile importare il profilo da {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Profilo importato correttamente {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Il profilo {0} ha un tipo di file sconosciuto o corrotto." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "Profilo personalizzato" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Il profilo è privo del tipo di qualità." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "Impossibile trovare un tipo qualità {0} per la configurazione corrente." +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1115,142 +1195,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "Volume di stampa" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Moltiplicazione e collocazione degli oggetti" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "Sistemazione oggetto" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "Impossibile individuare una posizione nel volume di stampa per tutti gli oggetti" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "Ricerca nuova posizione per gli oggetti" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "Ricerca posizione" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "Impossibile individuare posizione" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "Rapporto su crash" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    Si è verificata un'eccezione irreversibile. Si prega di inviarci questo crash report per risolvere il problema

    \n

    Utilizzare il pulsante \"Invia report\" per inviare un report sui bug automaticamente ai nostri server

    \n " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "Informazioni di sistema" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "Sconosciuto" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Versione Cura: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "Piattaforma: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Versione Qt: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "Versione PyQt: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • Versione OpenGL: {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • Fornitore OpenGL: {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • Renderer OpenGL: {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "Analisi eccezione" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "Registri" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "Descrizione utente" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "Invia report" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Caricamento macchine in corso..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Impostazione scena in corso..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Caricamento interfaccia in corso..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "È possibile caricare un solo file codice G per volta. Importazione saltata {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Impossibile aprire altri file durante il caricamento del codice G. Importazione saltata {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "Il modello selezionato è troppo piccolo per il caricamento." @@ -1279,12 +1384,11 @@ msgstr "X (Larghezza)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1374,68 +1478,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "La differenza di altezza tra la punta dell’ugello e il sistema gantry (assi X e Y). Utilizzata per evitare collisioni tra le stampe precedenti e il gantry durante la stampa \"Uno alla volta\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "Numero di estrusori" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "Diametro nominale del filamento supportato dalla stampante. Il diametro esatto verrà sovrapposto dal materiale e/o dal profilo." - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "Diametro materiale" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "Dimensione ugello" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "Avvio GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Comandi Gcode da eseguire all’avvio." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "Fine GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Comandi Gcode da eseguire alla fine." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "Impostazioni ugello" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Dimensione ugello" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "Diametro nominale del filamento supportato dalla stampante. Il diametro esatto verrà sovrapposto dal materiale e/o dal profilo." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "Scostamento X ugello" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Scostamento Y ugello" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Codice G avvio estrusore" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Codice G fine estrusore" @@ -1448,8 +1551,9 @@ msgstr "Registro modifiche" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1514,7 +1618,10 @@ 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 "Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n\nSelezionare la stampante dall’elenco seguente:" +msgstr "" +"Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n" +"\n" +"Selezionare la stampante dall’elenco seguente:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1530,7 +1637,7 @@ msgstr "Modifica" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "Rimuovi" @@ -1552,14 +1659,14 @@ msgid "Type" msgstr "Tipo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker3 Extended" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1603,8 +1710,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "Inserire l’indirizzo IP o l’hostname della stampante sulla rete." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1625,6 +1730,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 non è configurata per supportare la connessione di un gruppo di stampanti Ultimaker 3" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1655,11 +1765,16 @@ msgid "Available" msgstr "Disponibile" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "Persa connessione con la stampante" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1751,138 +1866,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "Attiva la configurazione" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Configurazione plugin Cura SolidWorks" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "Qualità predefinita STL esportato:" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "Chiedi sempre" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "Utilizza sempre la qualità Fine" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "Utilizza sempre la qualità Grossolana" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "Importa file SolidWorks come STL..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "Qualità STL esportato" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "Qualità" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "Grossolana" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "Fine" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "Ricorda la scelta" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "Salva" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "Schema colori" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "Colore materiale" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "Tipo di linea" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "Velocità" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "Spessore strato" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "Modalità di compatibilità" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "Mostra spostamenti" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "Mostra helper" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "Mostra guscio" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "Mostra riempimento" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "Mostra solo strati superiori" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "Mostra 5 strati superiori in dettaglio" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "Superiore / Inferiore" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "Parete interna" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "min." -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "max." @@ -1907,7 +2134,7 @@ msgctxt "@label" msgid "Settings" msgstr "Impostazioni" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Modifica script di post-elaborazione attivi" @@ -1982,23 +2209,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "Smoothing" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "Seleziona impostazioni" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "Seleziona impostazioni di personalizzazione per questo modello" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "Filtro..." -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "Mostra tutto" @@ -2166,7 +2423,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Questo plugin contiene una licenza.\nÈ necessario accettare questa licenza per poter installare il plugin.\nAccetti i termini sotto riportati?" +msgstr "" +"Questo plugin contiene una licenza.\n" +"È necessario accettare questa licenza per poter installare il plugin.\n" +"Accetti i termini sotto riportati?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2357,66 +2617,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "È tutto in ordine! Controllo terminato." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "Non collegato ad una stampante" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "La stampante non accetta comandi" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "In manutenzione. Controllare la stampante" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Stampa in corso..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "In pausa" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Preparazione in corso..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "Rimuovere la stampa" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "Riprendi" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "Pausa" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "Interrompi la stampa" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "Interrompi la stampa" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "Sei sicuro di voler interrompere la stampa?" @@ -2431,7 +2691,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Sono state personalizzate alcune impostazioni del profilo.\nMantenere o eliminare tali impostazioni?" +msgstr "" +"Sono state personalizzate alcune impostazioni del profilo.\n" +"Mantenere o eliminare tali impostazioni?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2449,19 +2711,19 @@ msgid "Customized" msgstr "Valore personalizzato" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "Chiedi sempre" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "Elimina e non chiedere nuovamente" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "Mantieni e non chiedere nuovamente" @@ -2496,72 +2758,72 @@ msgctxt "@label" msgid "Brand" msgstr "Marchio" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "Tipo di materiale" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "Colore" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "Proprietà" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "Densità" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "Diametro" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "Costo del filamento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "Peso del filamento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "Lunghezza del filamento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "Costo al metro" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "Questo materiale è collegato a %1 e condivide alcune delle sue proprietà." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "Scollega materiale" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "Descrizione" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "Informazioni sull’aderenza" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "Impostazioni di stampa" @@ -2602,7 +2864,7 @@ msgid "Unit" msgstr "Unità" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "Generale" @@ -2617,230 +2879,255 @@ msgctxt "@label" msgid "Language:" msgstr "Lingua:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "Valuta:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "Tema:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "Riavviare l'applicazione per rendere effettive le modifiche." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "Seziona automaticamente alla modifica delle impostazioni." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "Seziona automaticamente" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "Comportamento del riquadro di visualizzazione" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "Evidenzia in rosso le zone non supportate del modello. In assenza di supporto, queste aree non saranno stampate in modo corretto." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "Visualizza sbalzo" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "Sposta la fotocamera in modo che il modello si trovi al centro della visualizzazione quando è selezionato" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "Centratura fotocamera alla selezione dell'elemento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "Il comportamento dello zoom predefinito di Cura dovrebbe essere invertito?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "Inverti la direzione dello zoom della fotocamera." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "Lo zoom si muove nella direzione del mouse?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "Zoom verso la direzione del mouse" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "I modelli sull’area di stampa devono essere spostati per evitare intersezioni?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "Assicurarsi che i modelli siano mantenuti separati" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "I modelli sull’area di stampa devono essere portati a contatto del piano di stampa?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "Rilascia automaticamente i modelli sul piano di stampa" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "Visualizza il messaggio di avvertimento sul lettore codice G." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "Messaggio di avvertimento sul lettore codice G" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "Lo strato deve essere forzato in modalità di compatibilità?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "Forzare la modalità di compatibilità visualizzazione strato (riavvio necessario)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "Apertura e salvataggio file" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "I modelli devono essere ridimensionati al volume di stampa, se troppo grandi?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "Ridimensiona i modelli troppo grandi" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "Un modello può apparire eccessivamente piccolo se la sua unità di misura è espressa in metri anziché in millimetri. Questi modelli devono essere aumentati?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "Ridimensiona i modelli eccessivamente piccoli" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "Al nome del processo di stampa deve essere aggiunto automaticamente un prefisso basato sul nome della stampante?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "Aggiungi al nome del processo un prefisso macchina" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "Quando si salva un file di progetto deve essere visualizzato un riepilogo?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "Visualizza una finestra di riepilogo quando si salva un progetto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "Comportamento predefinito all'apertura di un file progetto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "Comportamento predefinito all'apertura di un file progetto: " -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "Chiedi sempre" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "Apri sempre come progetto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "Importa sempre i modelli" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "Dopo aver modificato un profilo ed essere passati a un altro, si apre una finestra di dialogo che chiede se mantenere o eliminare le modifiche oppure se scegliere un comportamento predefinito e non visualizzare più tale finestra di dialogo." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "Override profilo" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "Privacy" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "Cura deve verificare la presenza di eventuali aggiornamenti all’avvio del programma?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "Controlla aggiornamenti all’avvio" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "I dati anonimi sulla stampa devono essere inviati a Ultimaker? Nota, non sono trasmessi o memorizzati modelli, indirizzi IP o altre informazioni personali." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "Invia informazioni di stampa (anonime)" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "Stampanti" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "Attiva" @@ -2883,7 +3170,7 @@ msgid "Waiting for a printjob" msgstr "In attesa di un processo di stampa" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "Profili" @@ -2909,13 +3196,13 @@ msgid "Duplicate" msgstr "Duplica" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "Importa" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "Esporta" @@ -2981,7 +3268,7 @@ msgid "Export Profile" msgstr "Esporta profilo" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "Materiali" @@ -2996,60 +3283,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "Stampante: %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "Crea" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "Duplica" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "Importa materiale" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr "Impossibile importare materiale {1}: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "Materiale importato correttamente %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "Esporta materiale" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "Impossibile esportare il materiale su %1: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "Materiale esportato correttamente su %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "Aggiungi stampante" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "Nome stampante:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "Aggiungi stampante" @@ -3074,7 +3361,9 @@ 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 è stato sviluppato da Ultimaker B.V. in cooperazione con la comunità.\nCura è orgogliosa di utilizzare i seguenti progetti open source:" +msgstr "" +"Cura è stato sviluppato da Ultimaker B.V. in cooperazione con la comunità.\n" +"Cura è orgogliosa di utilizzare i seguenti progetti open source:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3176,158 +3465,167 @@ msgctxt "@label" msgid "Profile:" msgstr "Profilo:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "Nessun profilo disponibile" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 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 "Alcuni valori di impostazione/esclusione sono diversi dai valori memorizzati nel profilo.\n\nFare clic per aprire la gestione profili." +msgstr "" +"Alcuni valori di impostazione/esclusione sono diversi dai valori memorizzati nel profilo.\n" +"\n" +"Fare clic per aprire la gestione profili." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "Ricerca..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Copia valore su tutti gli estrusori" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Nascondi questa impostazione" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Nascondi questa impostazione" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Mantieni visibile questa impostazione" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Configurazione visibilità delle impostazioni in corso..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Alcune impostazioni nascoste utilizzano valori diversi dal proprio valore normale calcolato.\n\nFare clic per rendere visibili queste impostazioni." +msgstr "" +"Alcune impostazioni nascoste utilizzano valori diversi dal proprio valore normale calcolato.\n" +"\n" +"Fare clic per rendere visibili queste impostazioni." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "Influisce su" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "Influenzato da" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "Questa impostazione è sempre condivisa tra tutti gli estrusori. La sua modifica varierà il valore per tutti gli estrusori" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "Questo valore è risolto da valori per estrusore " -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 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 "Questa impostazione ha un valore diverso dal profilo.\n\nFare clic per ripristinare il valore del profilo." +msgstr "" +"Questa impostazione ha un valore diverso dal profilo.\n" +"\n" +"Fare clic per ripristinare il valore del profilo." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 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 "Questa impostazione normalmente viene calcolata, ma attualmente ha impostato un valore assoluto.\n\nFare clic per ripristinare il valore calcolato." +msgstr "" +"Questa impostazione normalmente viene calcolata, ma attualmente ha impostato un valore assoluto.\n" +"\n" +"Fare clic per ripristinare il valore calcolato." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Impostazione di stampa" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Impostazione di stampa disabilitata\nI file codice G non possono essere modificati" +msgstr "" +"Impostazione di stampa disabilitata\n" +"I file codice G non possono essere modificati" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00h 00min" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "Indicazione del tempo
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "Indicazione di costo" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "Totale:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Impostazione di stampa consigliata

    Stampa con le impostazioni consigliate per la stampante, il materiale e la qualità selezionati." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Impostazione di stampa personalizzata

    Stampa con il controllo grana fine su ogni sezione finale del processo di sezionamento." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automatico: %1" @@ -3337,6 +3635,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Visualizza" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3349,14 +3657,14 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Stampa modello selezionato con:" msgstr[1] "Stampa modelli selezionati con:" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Moltiplica modello selezionato" msgstr[1] "Moltiplica modelli selezionati" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "Numero di copie" @@ -3372,7 +3680,7 @@ msgid "No printer connected" msgstr "Nessuna stampante collegata" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "Estrusore" @@ -3482,254 +3790,294 @@ msgctxt "@label" msgid "Estimated time left" msgstr "Tempo residuo stimato" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Att&iva/disattiva schermo intero" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Annulla" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "Ri&peti" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "E&sci" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "&Ripristina la posizione della telecamera" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configura Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "A&ggiungi stampante..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "&Gestione stampanti..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Gestione materiali..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Aggiorna il profilo con le impostazioni/esclusioni correnti" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Elimina le modifiche correnti" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Crea profilo dalle impostazioni/esclusioni correnti..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Gestione profili..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Mostra documentazione &online" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Se&gnala un errore" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "I&nformazioni..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Cancella &modello selezionato" msgstr[1] "Cancella modelli &selezionati" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Centra modello selezionato" msgstr[1] "Centra modelli selezionati" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Moltiplica modello selezionato" msgstr[1] "Moltiplica modelli selezionati" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Elimina modello" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "C&entra modello su piattaforma" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Raggruppa modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Separa modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Unisci modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "Mo<iplica modello" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "Sel&eziona tutti i modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Cancellare piano di stampa" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "R&icarica tutti i modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Sistema tutti i modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Sistema selezione" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Reimposta tutte le posizioni dei modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Reimposta tutte le &trasformazioni dei modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Apri file..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nuovo Progetto..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "M&ostra log motore..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Mostra cartella di configurazione" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configura visibilità delle impostazioni..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "Sfoglia plugin..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "Plugin installati..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Caricare un modello 3D" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Pronto per il sezionamento" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Sezionamento in corso..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Pronto a %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Sezionamento impossibile" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Sezionamento non disponibile" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Prepara" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Annulla" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Seleziona l'unità di uscita attiva" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "Apri file" @@ -3749,114 +4097,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&File" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&Salva selezione su file" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Salva &come..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "Salva progetto" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Modifica" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "&Visualizza" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "&Impostazioni" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "S&tampante" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "Ma&teriale" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profilo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Imposta come estrusore attivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "Es&tensioni" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "&Plugin" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "P&referenze" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Help" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "Apri file" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "Impostazioni" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "Nuovo progetto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "Sei sicuro di voler aprire un nuovo progetto? Questo cancellerà il piano di stampa e tutte le impostazioni non salvate." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "Installa plugin" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "Apri file" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "Rilevata la presenza di uno o più file codice G tra i file selezionati. È possibile aprire solo un file codice G alla volta. Se desideri aprire un file codice G, selezionane uno solo. " @@ -3881,97 +4229,82 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Non mostrare il riepilogo di progetto alla ripetizione di salva" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "Salva" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "Prepara" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "Controlla" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "Altezza dello strato" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "Un profilo personalizzato è attualmente attivo. Per attivare il cursore qualità, selezionare un profilo di qualità predefinito nella scheda Personalizza" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "Velocità di stampa" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "Più lenta" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "Più veloce" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "Sono state modificate alcune impostazioni del profilo. Per modificarle, andare alla modalità personalizzata." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "Riempimento" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Un riempimento graduale aumenterà gradualmente la quantità di riempimento verso l'alto." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "Consenti variazione graduale" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "Generazione supporto" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Genera strutture per supportare le parti del modello a sbalzo. Senza queste strutture, queste parti collasserebbero durante la stampa." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "Estrusore del supporto" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "Seleziona l’estrusore da utilizzare per la stampa di strutture di supporto. Ciò consentirà di costruire strutture di supporto sotto il modello per evitare cedimenti del modello o di stampare a mezz'aria." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Adesione piano di stampa" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "Abilita stampa di brim o raft. Questa funzione aggiunge un’area piana attorno o sotto l’oggetto, facile da tagliare successivamente." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Serve aiuto per migliorare le tue stampe?
    Leggi la Guida alla ricerca e riparazione guasti Ultimaker" @@ -3988,17 +4321,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Apri file progetto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "Questo è un file progetto Cura. Vuoi aprirlo come progetto o importarne i modelli?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Ricorda la scelta" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "Apri come progetto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "Importa i modelli" @@ -4008,21 +4346,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Log motore" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "Materiale" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "Controllo compatibilità" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Fai clic per verificare la compatibilità del materiale su Ultimaker.com." +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4113,6 +4466,26 @@ msgctxt "name" msgid "USB printing" msgstr "Stampa USB" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4133,6 +4506,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Connessione di rete UM3" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4145,8 +4528,8 @@ msgstr "Controllo aggiornamento firmware" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "Offre la possibilità di aprire alcuni file tramite SolidWorks stessa. Questi vengono quindi convertiti e caricati in Cura" +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4213,6 +4596,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "Lettore legacy profilo Cura" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4373,6 +4766,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Writer profilo Cura" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4413,6 +4816,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Lettore profilo Cura" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "Sconosciuto" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "Rilevati errori all'apertura del file SolidWorks! Controllare se è possibile aprire il file in SolidWorks senza che si verifichino problemi!" + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "Errore durante l'avvio di %s!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "Vista simulazione" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Cura acquisisce dati statistici elaborati in forma anonima. L'acquisizione può essere disabilitata nelle preferenze." + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "Ignora" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "Globale" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    Si è verificata un'eccezione irreversibile. Si prega di inviarci questo crash report per risolvere il problema

    \n" +#~ "

    Utilizzare il pulsante \"Invia report\" per inviare un report sui bug automaticamente ai nostri server

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Versione Cura: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "Piattaforma: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Versione Qt: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "Versione PyQt: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "Analisi eccezione" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "Diametro materiale" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker3 Extended" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Configurazione plugin Cura SolidWorks" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "Qualità predefinita STL esportato:" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "Chiedi sempre" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "Utilizza sempre la qualità Fine" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "Utilizza sempre la qualità Grossolana" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "Importa file SolidWorks come STL..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "Qualità STL esportato" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "Qualità" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "Grossolana" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "Fine" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "Nessun profilo disponibile" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "Questa impostazione è sempre condivisa tra tutti gli estrusori. La sua modifica varierà il valore per tutti gli estrusori" + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "Indicazione del tempo
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "&Ripristina la posizione della telecamera" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "Salva progetto" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "Prepara" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "Controlla" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "Controllo compatibilità" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "Offre la possibilità di aprire alcuni file tramite SolidWorks stessa. Questi vengono quindi convertiti e caricati in Cura" + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "Ostacolato" @@ -4433,13 +4986,9 @@ msgstr "Lettore profilo Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Per verificare che la vostra {machine_name} sia dotata delle funzionalità più recenti, si consiglia di aggiornare periodicamente il firmware. Questo può essere fatto sulla {machine_name} (quando connessa alla rete) o via USB." -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Visualizzazione strato" - -msgctxt "@info:title" -msgid "Layer View" -msgstr "Visualizzazione strato" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Visualizzazione strato" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4541,9 +5090,9 @@ msgstr "Visualizzazione strato" #~ msgid "Provides the Layer view." #~ msgstr "Fornisce la visualizzazione degli strati." -msgctxt "name" -msgid "Layer View" -msgstr "Visualizzazione strato" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Visualizzazione strato" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4864,9 +5413,9 @@ msgstr "Visualizzazione strato" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Fornisce supporto per l'importazione di profili da file G-Code." -msgctxt "@label" -msgid "Layer View" -msgstr "Visualizzazione strato" +#~ msgctxt "@label" +#~ msgid "Layer View" +#~ msgstr "Visualizzazione strato" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/it_IT/fdmextruder.def.json.po b/resources/i18n/it_IT/fdmextruder.def.json.po index ec3c8051cf..f34ebd04ff 100644 --- a/resources/i18n/it_IT/fdmextruder.def.json.po +++ b/resources/i18n/it_IT/fdmextruder.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" diff --git a/resources/i18n/it_IT/fdmprinter.def.json.po b/resources/i18n/it_IT/fdmprinter.def.json.po index 5fb7743130..204ebdc539 100644 --- a/resources/i18n/it_IT/fdmprinter.def.json.po +++ b/resources/i18n/it_IT/fdmprinter.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" @@ -56,7 +56,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "I comandi codice G da eseguire all’avvio, separati da \n." +msgstr "" +"I comandi codice G da eseguire all’avvio, separati da \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +70,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "I comandi codice G da eseguire alla fine, separati da \n." +msgstr "" +"I comandi codice G da eseguire alla fine, separati da \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -345,6 +349,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -605,31 +619,6 @@ 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 "Indica l’altezza dello strato iniziale in mm. Uno strato iniziale più spesso facilita l’adesione al piano di stampa." -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "Tolleranza di sezionamento" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "Modalità di sezionamento di strati con superfici diagonali. Le aree di uno strato possono essere generate in base al punto in cui la parte intermedia dello strato interseca la superficie (intermedia). In alternativa le aree di ciascuno strato possono ricadere all'interno del volume per tutta l'altezza dello strato (Esclusiva) ovvero possono cadere in qualsiasi punto all'interno dello strato (Inclusiva). La tolleranza esclusiva mantiene il maggior numero di dettagli, la tolleranza inclusiva è la più idonea, mentre la tolleranza intermedia richiede il minor tempo di processo." - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "Intermedia" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "Esclusiva" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "Inclusiva" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -670,16 +659,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "Indica la larghezza di una singola linea della parete per tutte le linee della parete tranne quella più esterna." -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "Larghezza linea rivestimento superficie superiore" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "Larghezza di un singola linea delle aree nella parte superiore della stampa" - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -860,41 +839,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "Numero degli strati di rivestimento superiori. Solitamente è sufficiente un unico strato di sommità per ottenere superfici superiori di qualità elevata." -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "Configurazione del rivestimento superficie superiore" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "Configurazione degli strati superiori." - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "Linee" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "Concentrica" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zig Zag" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "Direzioni linea rivestimento superficie superiore" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "Un elenco di direzioni linee intere da usare quando gli strati rivestimento superficie superiore utilizzano le linee o la configurazione zig zag. Gli elementi dall’elenco sono utilizzati in sequenza con il progredire degli strati e, al raggiungimento della fine dell’elenco, la sequenza ricomincia dall’inizio. Le voci elencate sono separate da virgole e l’intero elenco è racchiuso tra parentesi quadre. L’elenco predefinito è vuoto, vale a dire che utilizza i valori angolari predefiniti (45 e 135 gradi)." - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1025,6 +969,16 @@ 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 "Inserto applicato al percorso della parete esterna. Se la parete esterna è di dimensioni inferiori all’ugello e stampata dopo le pareti interne, utilizzare questo offset per fare in modo che il foro dell’ugello si sovrapponga alle pareti interne anziché all’esterno del modello." +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "Ottimizzazione sequenza di stampa pareti" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "Ottimizza l'ordine in cui vengono stampate le pareti in modo da ridurre le retrazioni e la distanza percorsa. L'abilitazione di questa funzione porta vantaggi per la maggior parte dei pezzi, ma alcuni potrebbero richiedere un maggior tempo di esecuzione, per cui si consiglia di confrontare i tempi di stampa stimati con e senza ottimizzazione." + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1095,6 +1049,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "In tutti i possibili punti" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1477,8 +1441,8 @@ msgstr "Offset X riempimento" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "Il riempimento si scosta di questa distanza lungo l'asse X." +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1487,8 +1451,8 @@ msgstr "Offset Y riempimento" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "Il riempimento si scosta di questa distanza lungo l'asse Y." +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1507,8 +1471,8 @@ msgstr "Percentuale di sovrapposizione del riempimento" #: 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 "Indica la quantità di sovrapposizione tra il riempimento e le pareti. Una leggera sovrapposizione consente il saldo collegamento delle pareti al riempimento." +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1527,8 +1491,8 @@ msgstr "Percentuale di sovrapposizione del rivestimento esterno" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "Entità della sovrapposizione tra il rivestimento e le pareti espressa in percentuale della larghezza della linea. Una leggera sovrapposizione consente alle pareti di essere saldamente collegate al rivestimento. È una percentuale delle larghezze medie delle linee del rivestimento e della parete più interna." +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1690,16 +1654,6 @@ msgctxt "material description" msgid "Material" msgstr "Materiale" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -msgstr "Temperatura automatica" - -#: 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 "Modifica automaticamente la temperatura per ciascuno strato con la velocità media del flusso per tale strato." - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1750,16 +1704,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "La temperatura alla quale può già iniziare il raffreddamento prima della fine della stampa." -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "Grafico della temperatura del flusso" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "Collegamento dei dati di flusso del materiale (in mm3 al secondo) alla temperatura (in °C)." - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1777,8 +1721,8 @@ msgstr "Temperatura piano di stampa" #: 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 "Indica la temperatura usata per il piano di stampa riscaldato. Se è 0, il piano non si riscalda per questa stampa." +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3450,6 +3394,16 @@ 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 "L’angolo della parte superiore di una torre. Un valore superiore genera parti superiori appuntite, un valore inferiore, parti superiori piatte." +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "Maglia supporto di discesa" + +#: 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 "Rappresenta il supporto ovunque sotto la maglia di supporto, in modo che in questa non vi siano punti a sbalzo." + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -3550,7 +3504,9 @@ 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 "Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\nQuesta è la distanza minima. Più linee di skirt aumenteranno tale distanza." +msgstr "" +"Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\n" +"Questa è la distanza minima. Più linee di skirt aumenteranno tale distanza." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4082,16 +4038,6 @@ 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 "Di norma Cura cerca di \"ricucire\" piccoli fori nella maglia e di rimuovere le parti di uno strato che presentano grossi fori. Abilitando questa opzione, Cura mantiene quelle parti che non possono essere 'ricucite'. Questa opzione deve essere utilizzata come ultima risorsa quando non sia stato possibile produrre un corretto GCode in nessun altro modo." -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "Risoluzione massima" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "La dimensione minima di un segmento di linea dopo il sezionamento. Se tale dimensione aumenta, la maglia avrà una risoluzione inferiore. Questo può consentire alla stampante di mantenere la velocità per processare il g-code ed aumenterà la velocità di sezionamento eliminando i dettagli della maglia che non è comunque in grado di processare." - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4242,16 +4188,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "Utilizzare questa maglia per specificare le aree di supporto. Può essere usata per generare una struttura di supporto." -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -msgstr "Maglia supporto di discesa" - -#: 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 "Rappresenta il supporto ovunque sotto la maglia di supporto, in modo che in questa non vi siano punti a sbalzo." - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4328,14 +4264,194 @@ msgid "experimental!" msgstr "sperimentale!" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "Ottimizzazione sequenza di stampa pareti" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "Ottimizza l'ordine in cui vengono stampate le pareti in modo da ridurre le retrazioni e la distanza percorsa. L'abilitazione di questa funzione porta vantaggi per la maggior parte dei pezzi, ma alcuni potrebbero richiedere un maggior tempo di esecuzione, per cui si consiglia di confrontare i tempi di stampa stimati con e senza ottimizzazione." +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "Tolleranza di sezionamento" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "Modalità di sezionamento di strati con superfici diagonali. Le aree di uno strato possono essere generate in base al punto in cui la parte intermedia dello strato interseca la superficie (intermedia). In alternativa le aree di ciascuno strato possono ricadere all'interno del volume per tutta l'altezza dello strato (Esclusiva) ovvero possono cadere in qualsiasi punto all'interno dello strato (Inclusiva). La tolleranza esclusiva mantiene il maggior numero di dettagli, la tolleranza inclusiva è la più idonea, mentre la tolleranza intermedia richiede il minor tempo di processo." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "Intermedia" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "Esclusiva" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "Inclusiva" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "Larghezza linea rivestimento superficie superiore" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "Larghezza di un singola linea delle aree nella parte superiore della stampa" + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "Configurazione del rivestimento superficie superiore" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "Configurazione degli strati superiori." + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "Linee" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "Concentrica" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zig Zag" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "Direzioni linea rivestimento superficie superiore" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "Un elenco di direzioni linee intere da usare quando gli strati rivestimento superficie superiore utilizzano le linee o la configurazione zig zag. Gli elementi dall’elenco sono utilizzati in sequenza con il progredire degli strati e, al raggiungimento della fine dell’elenco, la sequenza ricomincia dall’inizio. Le voci elencate sono separate da virgole e l’intero elenco è racchiuso tra parentesi quadre. L’elenco predefinito è vuoto, vale a dire che utilizza i valori angolari predefiniti (45 e 135 gradi)." + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Temperatura automatica" + +#: 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 "Modifica automaticamente la temperatura per ciascuno strato con la velocità media del flusso per tale strato." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "Grafico della temperatura del flusso" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "Collegamento dei dati di flusso del materiale (in mm3 al secondo) alla temperatura (in °C)." + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "Risoluzione massima" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "La dimensione minima di un segmento di linea dopo il sezionamento. Se tale dimensione aumenta, la maglia avrà una risoluzione inferiore. Questo può consentire alla stampante di mantenere la velocità per processare il g-code ed aumenterà la velocità di sezionamento eliminando i dettagli della maglia che non è comunque in grado di processare." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4827,7 +4943,9 @@ 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 "Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\nCiò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing." +msgstr "" +"Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\n" +"Ciò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4934,6 +5052,46 @@ 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 "Indica la distanza tra l'ugello e le linee diagonali verso il basso. Un maggior gioco risulta in linee diagonali verso il basso con un minor angolo di inclinazione, cosa che a sua volta si traduce in meno collegamenti verso l'alto con lo strato successivo. Applicabile solo alla funzione Wire Printing." +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4994,6 +5152,26 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Matrice di rotazione da applicare al modello quando caricato dal file." +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "Il riempimento si scosta di questa distanza lungo l'asse X." + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "Il riempimento si scosta di questa distanza lungo l'asse Y." + +#~ 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 "Indica la quantità di sovrapposizione tra il riempimento e le pareti. Una leggera sovrapposizione consente il saldo collegamento delle pareti al riempimento." + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "Entità della sovrapposizione tra il rivestimento e le pareti espressa in percentuale della larghezza della linea. Una leggera sovrapposizione consente alle pareti di essere saldamente collegate al rivestimento. È una percentuale delle larghezze medie delle linee del rivestimento e della parete più interna." + +#~ 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 "Indica la temperatura usata per il piano di stampa riscaldato. Se è 0, il piano non si riscalda per questa stampa." + #~ msgctxt "wall_x_extruder_nr label" #~ msgid "Inner Walls Extruder" #~ msgstr "Estrusore parete interna" diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index 01b39b3229..b394a3a510 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: \n" "Language-Team: TEAM\n" @@ -18,7 +18,7 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.7.1\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "プリンターの設定" @@ -55,12 +55,11 @@ msgstr "Doodle3D Connectに接続する" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -100,7 +99,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Doodle3D Connect web interfaceを開く" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Changelogの表示" @@ -117,78 +116,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "プロファイルが平らになり、アクティベートされました。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "USBプリンティング" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "USBを使ってプリントする" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "USBを使ってプリントする" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "USBにて接続する" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "新しいプリントジョブをはじめることができません。プリンターが使用中または接続できていません。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "プリンターが利用できません" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "UltiGCodeを使用中のため、USBからのプリントができません。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "USBプリント" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "USBでの印刷ができないため、新しいプリントジョブができません。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "警告" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "プリンターが未接続のため、ファームウェアをアップデートできません。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "プリンター(%s)に必要なファームウェアを探せませんでした。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "ファームウェア" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -232,11 +236,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "リムーバブルドライブ{0}に保存することができませんでした: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "エラー" @@ -286,7 +290,7 @@ msgid "Removable Drive" msgstr "リムーバブルドライブ" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "ネットワーク上のプリント" @@ -400,110 +404,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "プリンターのステータス" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "プリントコアがスロット{0}に入っていません。プリントジョブを開始できません。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "フィラメントがスロット{0}に入っていません。プリントジョブを開始できません。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "フィラメント{0}の残量が足りません。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "異なるプリントコアが入っています(Cura:{0}, プリンター{1})エクストルーダー{2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "異なるフィラメントが入っています(Cura:{0}, プリンター{1})エクストルーダー{2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "プリントコア{0}が適切にキャリブレーションできていません。XYキャリブレーションをプリンターで行ってください。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "選択された構成にてプリントを開始してもいいですか。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "プリンターの設定、キャリブレーションとCuraの構成にミスマッチがあります。プリンターに設置されたプリントコア及びフィラメントを元にCuraをスライスすることで最良の印刷結果を出すことができます。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "ミスマッチの構成" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "新しいデータの送信 (temporarily) をブロックします、前のプリントジョブが送信中です。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "プリンターにプリントデータを送信中" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "プリントデータを送信中" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "データをプリンターに送ることができません。他のプリントジョブは進行中ですか?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "プリントを停止します…" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "プリントを中止しました。プリンターを確認してください。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "プリントを一時停止します…" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "プリント再開します…" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "プリンターと同期する" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Curaで設定しているプリンタ構成を使用されますか?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "プリンターのプリントコア及びフィラメントが現在のプロジェクトと異なります。最善な印刷結果のために、プリンタに装着しているプリントコア、フィラメントに合わせてスライスして頂くことをお勧めします。" @@ -524,145 +528,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "{printer_name}は ‘{job_name}’印刷を終了しました。造形物を確認し、ビルドプレートから取り出してください。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} は '{job_name}'.を印刷予定です。印刷を開始するためにジョブに合わせた構成に変更してください。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "新しいプリントジョブをお送りできません。この3Dプリンターは繋がっているUltimaker3のグループをホストするために設定されていません。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "プリントジョブをグループに送ることができません。{cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "グループに送信完了{file_name} {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "プリントジョブを見る" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "プリントジョブのインターフェイスをブラウザーで開く" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "不明" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "プリンター’{printer_name}’が’{job_name}’のプリントを終了しました。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "プリント終了" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "アクションが必要です。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "グループに送信中{file_name} {cluster_name}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "ネットワーク上にて接続" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "{machine_name} で利用可能な新しい機能があります。プリンターのファームウェアをアップデートしてください。" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "新しい利用可能な%sファームウェアのアップデートがあります。" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "アップデートの仕方" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "必要なアップデートの情報にアクセスできません。" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "ソリッドワークスのファイルを開く際にエラーが発生しました!ソリッドワークスで、問題なく開くことができるか確認してください。" +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "ソリッドワークスパートファイル" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "ソリッドワークスアセンブリーファイル" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "構成" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "%sを開始中にエラーが発生" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "シミュレーションビュー" +msgid "Layer view" +msgstr "レイヤービュー" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "Curaはワイヤープリンティング設定中には正確にレイヤーを表示しません。" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "シミュレーションビュー" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "G-codeを修正" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "Curaが非特定なスライスされた数字を集めました。プレファレンス内で無効にできます。" +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -671,14 +718,41 @@ msgstr "データを収集中" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "却下する" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Cura 15.04 プロファイル" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -710,49 +784,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "GIF画像" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "選ばれたプリンターまたは選ばれたプリント構成が異なるため進行中の材料にてスライスを完了できません。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "スライスできません。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "現在の設定でスライスが完了できません。以下の設定にエラーがあります: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "モデル別の設定があるためスライスできません。1つまたは複数のモデルで以下の設定にエラーが発生しました:{error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "プライムタワーまたはプライム位置が無効なためスライスできません。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "モデルのデータがビルトボリュームに入っていないためスライスできるものがありません。スケールやローテーションにて合うように設定してください。" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "レイヤーを処理しています。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "インフォメーション" @@ -789,14 +863,14 @@ msgstr "Siemens NXプラグインファイルのコピーに失敗しました msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Siemens NXプラグインのインストールに失敗しました。Siemens NX用の環境変数UGII_USER_DIRが設定できませんでした。" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "推奨" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "カスタム" @@ -807,24 +881,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF ファイル" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "ノズル" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "{0}からプラグインIDを取得することに失敗しました。" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "警告" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "プラグインブラウザー" @@ -839,18 +913,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Gファイル" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "G-codeを解析" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "G-codeの詳細" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "データファイルを送信する前に、プリンターとプリンターの構成設定にそのG-codeが適応しているか確認してください。G-codeの表示が適切でない場合があります。" @@ -861,6 +935,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Curaプロファイル" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -892,142 +976,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "ビルドプレートを調整する" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "アウターウォール" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "インナーウォール" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "スキン" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "インフィル" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "サポートイルフィル" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "サポートインターフェイス" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "サポート" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "スカート" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "移動" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "退却" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "他" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "不明" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "スライス前ファイル {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "フィラメントがロードされていません。" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "未確認のフィラメント" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "造形物のために新しい位置を探索中" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "位置確認" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "全ての造形物の造形サイズに対し、適切な位置が確認できません" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "位置を確保できません。" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "すでに存在するファイルです。" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "{0} は既に存在します。ファイルを上書きしますか?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "カスタム" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "カスタムフィラメント" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "グローバル" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "上書きできません" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "選択されたフィラメントはプリンターとそのプリント構成に適応しておりません。" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1048,67 +1106,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "フィラメント直径を変更を取り消す" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "{0}にプロファイルを書き出すのに失敗しました: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr " {0}にプロファイルを書き出すことに失敗しました。:ライタープラグイン失敗の報告" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "{0}にプロファイルを書き出しました。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "書き出し完了" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "{0}: {1}からプロファイルを取り込むことに失敗しました。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "プロファイル {0}の取り込み完了" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "プロファイル{0}は不特定なファイルまたは破損があります。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "カスタムプロファイル" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "プロファイルはクオリティータイプが不足しています。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "進行中のプリント構成にあったクオリティータイプ{0}が見つかりませんでした。" +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1119,142 +1199,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "造形サイズ" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "造形データを増やす、配置する。" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "造形データを配置" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "全ての造形物の造形サイズに対し、適切な位置が確認できません" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "造形物のために新しい位置を探索中" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "位置確認" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "位置を確保できません。" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "クラッシュ報告" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    致命的な例外が発生しました。問題解決のためこのクラッシュレポートを送信してください

    \n

    「レポート送信」ボタンを使用してバグレポートが自動的にサーバーに送られるようにしてください

    \n " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "システム情報" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "不明" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Curaバージョン: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "プラットフォーム: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Qtバージョン: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "PyQtバージョン: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • OpenGLバージョン: {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • OpenGLベンダー: {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • OpenGLレンダラー: {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "例外トレースバック" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "ログ" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "ユーザー詳細" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "レポート送信" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "プリンターを読み込み中…" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "シーンをセットアップ中…" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "インターフェイスを読み込み中…" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "一度に一つのG-codeしか読み取れません。{0}の取り込みをスキップしました。" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "G-codeを読み込み中は他のファイルを開くことができません。{0}の取り込みをスキップしました。" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "選択したモデルは読み込むのに小さすぎます。" @@ -1283,12 +1388,11 @@ msgstr "X(幅)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1378,68 +1482,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "(X 軸及びY軸)ノズルの先端とガントリーシステムの高さに相違があります。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "エクストルーダーの数" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "プリンターに対応したフィラメントの直径。正確な直径はフィラメント及びまたはプロファイルに変動します。" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "フィラメント直径" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "ノズルサイズ" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "G-codeをスタートします。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "G-codeが最初に起動するようにします。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "G-codeを終了" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "G-codeが最後にに起動するようにします。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "ノズル設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "ノズルサイズ" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "プリンターに対応したフィラメントの直径。正確な直径はフィラメント及びまたはプロファイルに変動します。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "ノズルオフセットX" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "ノズルオフセットY" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "エクストルーダーがGcodeを開始します。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "エクストルーダーがGcodeを終了します。" @@ -1452,8 +1555,9 @@ msgstr "Changelogの表示" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1534,7 +1638,7 @@ msgstr "編集" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "取り除く" @@ -1556,14 +1660,14 @@ msgid "Type" msgstr "タイプ" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Extended" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1607,8 +1711,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "ネットワーク内のプリンターのIPアドレスまたはホストネームを入力してください。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1629,6 +1731,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1は、繋がっているUltimaker3プリンターのグループをホストするために設定されていません。" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1659,11 +1766,16 @@ msgid "Available" msgstr "利用可能" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "プリンターへの接続が切断されました。" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1755,138 +1867,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "プリント構成をアクティベートする" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Curaソリッドワークスプラグインコンフィグレーション" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "書き出されたSTLのクオリティーデフォルト" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "毎回確認" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "常にファインクオリティーを使用する" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "常に粗めのクオリティーを使用する" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "ソリッドワークスのファイルをSTLとして取り込む" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "書き出されたSTLのクオリティー" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "クオリティー" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "粗い" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "ファイン" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "選択を記憶させる" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "保存" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "カラースキーム" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "フィラメントの色" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "ラインタイプ" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "送り速度" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "レイヤーの厚さ" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "コンパティビリティモード" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "移動を表示する" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "ヘルプを表示する" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "シェルを表示する" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "インフィルを表示する" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "トップのレイヤーを表示する" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "トップの5レイヤーの詳細を表示する" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "トップ/ボトム" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "インナーウォール" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "最小" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "最大" @@ -1911,7 +2135,7 @@ msgctxt "@label" msgid "Settings" msgstr "設定" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "処理したスクリプトを変更する" @@ -1986,23 +2210,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "スムージング" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "設定を選択する" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "このモデルをカスタマイズする設定を選択する" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "フィルター…" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "すべて表示する" @@ -2172,7 +2426,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "このプラグインにはライセンスが含まれています。\nこのプラグインをインストールするにはこのライセンスに同意する必要があります。\n下の利用規約に同意しますか?" +msgstr "" +"このプラグインにはライセンスが含まれています。\n" +"このプラグインをインストールするにはこのライセンスに同意する必要があります。\n" +"下の利用規約に同意しますか?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2366,66 +2623,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "すべてに異常はありません。チェックアップを終了しました。" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "プリンターにつながっていません。" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "今プリンタはコマンドを処理できません。" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "メンテナンス。プリンターをチェックしてください。" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "プリント中" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "一時停止しました" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "準備中" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "造形物を取り出してください。" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "再開" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "一時停止" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "プリント中止" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "プリント中止" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "本当にプリントを中止してもいいですか。" @@ -2458,19 +2715,19 @@ msgid "Customized" msgstr "カスタマイズ" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "毎回確認する" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "取り消し、再度確認しない。" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "キープし、再度確認しない。" @@ -2505,72 +2762,72 @@ msgctxt "@label" msgid "Brand" msgstr "ブランド" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "フィラメントタイプ" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "色" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "プロパティ" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "密度" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "直径" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "フィラメントコスト" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "フィラメントの重さ" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "フィラメントの長さ" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "毎メーターコスト" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "このフィラメントは %1にリンクすプロパティーを共有する。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "フィラメントをリンクを外す" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "記述" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "接着のインフォメーション" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "プリント設定" @@ -2611,7 +2868,7 @@ msgid "Unit" msgstr "ユニット" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "一般" @@ -2626,230 +2883,255 @@ msgctxt "@label" msgid "Language:" msgstr "言語:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "通貨:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "テーマ:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "それらの変更を有効にするためにはアプリケーションを再起動しなけらばなりません。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "セッティングを変更すると自動にスライスします。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "自動的にスライスする" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "ビューポイント機能" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "赤でサポートができないエリアをハイライトしてください。サポートがない場合、正確にプリントができない場合があります。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "ディスプレイオーバーハング" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "モデルの選択時にモデルがカメラの中心に見えるようにカメラを移動する" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "アイテムを選択するとカメラが中心にきます" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "Curaのデフォルトのズーム機能は変更できるべきか?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "カメラのズーム方向を反転する" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "ズームはマウスの方向に動くべきか?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "マウスの方向にズームする" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "交差を避けるためにプラットホーム上のモデルを移動するべきですか?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "モデルの距離が離れているように確認する" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "プラットホーム上のモデルはブルドプレートに触れるように下げるべきか?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "自動的にモデルをビルドプレートに落とす" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "gcodeリーダーに注意メッセージを表示する" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "gcodeリーダーの注意メッセージ" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "レイヤーはコンパティビリティモードに強制されるべきか?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "レイヤービューコンパティビリティモードを強制する。(再起動が必要)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "ファイルを開くまた保存" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "モデルがビルドボリュームに対して大きすぎる場合はスケールされるべきか?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "大きなモデルをスケールする" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "ユニット値がミリメートルではなくメートルの場合、モデルが極端に小さく現れる場合があります。モデルはスケールアップされるべきですか?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "極端に小さなモデルをスケールアップする" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "プリンター名の敬称はプリントジョブの名前に自動的に加えられるべきか?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "プリンターの敬称をジョブネームに加える" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "プロジェクトファイルを保存時にサマリーを表示するべきか?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "プロジェクトを保存時にダイアログサマリーを表示する" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "プロジェクトファイルを開く際のデフォルト機能" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "プロジェクトファイル開く際のデフォルト機能:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "いつもお尋ねください。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "常にプロジェクトとして開く" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "常にモデルを取り込む" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "プロファイル内を変更し異なるプロファイルにしました、どこの変更点を保持、破棄したいのダイアログが表示されます、また何度もダイアログが表示されないようにデフォルト機能を選ぶことができます。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "プロファイルを無効にする" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "プライバシー" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "Curaのプログラム開始時にアップデートがあるかチェックしますか?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "スタート時にアップデートあるかどうかのチェック" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "プリンターの不明なデータをUltimakerにおくりますか?メモ、モデル、IPアドレス、個人的な情報は送信されたり保存されたりはしません。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr " (不特定な) プリントインフォメーションを送信" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "プリンター" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "アクティベート" @@ -2892,7 +3174,7 @@ msgid "Waiting for a printjob" msgstr "プリントジョブの待機中" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "プロファイル" @@ -2918,13 +3200,13 @@ msgid "Duplicate" msgstr "複製" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "取り込む" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "書き出す" @@ -2990,7 +3272,7 @@ msgid "Export Profile" msgstr "プロファイルを書き出す" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "マテリアル" @@ -3005,60 +3287,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "プリンター:%1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "作成する" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "複製" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "フィラメントを取り込む" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr " %1フィラメントを取り込むことができない: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "フィラメント%1の取り込みに成功しました。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "フィラメントを書き出す" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "フィラメントの書き出しに失敗しました %1: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "フィラメントの%1への書き出しが完了ました。" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "プリンターを追加する" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "プリンター名:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "プリンターについて" @@ -3185,158 +3467,163 @@ msgctxt "@label" msgid "Profile:" msgstr "プロファイル:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "利用可能なプロファイルがありません" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 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 "いくらかの設定プロファイルにある値とことなる場合無効にします。\nプロファイルマネージャーをクリックして開いてください。" +msgstr "" +"いくらかの設定プロファイルにある値とことなる場合無効にします。\n" +"プロファイルマネージャーをクリックして開いてください。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "検索…" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "すべてのエクストルーダーの値をコピーする" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "この設定を非表示にする" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "この設定を表示しない" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "常に見えるように設定する" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "視野のセッティングを構成する" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n表示されるようにクリックしてください。" +msgstr "" +"いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n" +"表示されるようにクリックしてください。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "影響" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "次によって影響を受ける" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "この設定は常に全てのエクストルーダーに共有されています。ここですべてのエクストルーダーの数値を変更できます。" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "この値は各エクストルーダーの値から取得します。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 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 "この設定にプロファイルと異なった値があります。\nプロファイルの値を戻すためにクリックしてください。" +msgstr "" +"この設定にプロファイルと異なった値があります。\n" +"プロファイルの値を戻すためにクリックしてください。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 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 "このセッティングは通常計算されます、今は絶対値に固定されています。\n計算された値に変更するためにクリックを押してください。" +msgstr "" +"このセッティングは通常計算されます、今は絶対値に固定されています。\n" +"計算された値に変更するためにクリックを押してください。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "プリントセットアップ" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "プリントセットアップが無効\nG-codeファイルを修正することができません。" +msgstr "" +"プリントセットアップが無効\n" +"G-codeファイルを修正することができません。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00時間 00分" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "時間仕様
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "コスト仕様" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "合計:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "おすすめプリントセットアップ

    選択されたプリンターにておすすめの設定、フィラメント、質にてプリントしてください。 " -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "カスタムプリントセットアップ

    スライス処理のきめ細かなコントロールにてプリントする" -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "自動選択: %1" @@ -3346,6 +3633,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&ビュー" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3359,13 +3656,13 @@ msgid_plural "Print Selected Models With:" msgstr[0] "選択したモデルで印刷:" # can’t eneter japanese texts -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "選択した複数のモデル" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "コピーの数" @@ -3381,7 +3678,7 @@ msgid "No printer connected" msgstr "接続中のプリンターはありません。" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "エクストルーダー" @@ -3491,254 +3788,294 @@ msgctxt "@label" msgid "Estimated time left" msgstr "残り時間" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "留め金 フルスクリーン" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&取り消す" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&やりなおす" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&やめる" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "&カメラ位置のリセット" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Curaを構成する…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&プリンターを追加する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "プリンターを管理する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "フィラメントを管理する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&現在の設定/無効にプロファイルをアップデートする" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&変更を破棄する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&今の設定/無効からプロファイルを作成する…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "プロファイルを管理する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "オンラインドキュメントを表示する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "報告&バグ" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "アバウト..." # can’t enter japanese text -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "&選択したモデルを削除" # can’t enter japanese text -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "選択したモデルを中央に移動" # can’t edit japanese text -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "選択した複数のモデル" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "モデルを消去する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "プラットホームの中心にモデルを配置" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&モデルグループ" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "モデルを非グループ化" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&モデルの合体" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&モデルを増倍する…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&すべてのモデル選択" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&ビルドプレート上のクリア" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "すべてのモデルを読み込む" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "すべてのモデルをアレンジする" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "選択をアレンジする" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "すべてのモデルのポジションをリセットする" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "すべてのモデル&変更点をリセットする" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&ファイルを開く(s)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&新しいプロジェクト…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "エンジン&ログを表示する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "コンフィグレーションのフォルダーを表示する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "視野のセッティングを構成する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "プラグインをみる" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "インストールされたプラグイン" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "3Dモデルをロードしてください。" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "スライスの準備ができました。" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "スライス中…" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "%1の準備完了" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "スライスできません。" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "スライスが利用不可能" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "準備する" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "キャンセル" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "アクティブなアウトプットデバイスを選択する" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "ファイルを開く(s)" @@ -3758,114 +4095,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&ファイル" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&ファイルに選択したものを保存" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "名前をつけて保存" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "プロジェクトを保存" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&編集" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "&ビュー" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "&設定" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&プリンター" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "&フィラメント" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "&プロファイル" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "アクティブエクストルーダーとしてセットする" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "拡張子" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "プラグイン" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "プレファレンス" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "ヘルプ" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "ファイルを開く" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "設定" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "新しいプロジェクト…" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "新しいプロジェクトを開始しますか?この作業では保存していない設定やビルドプレートをクリアします。" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "プラグインをインストール" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "ファイルを開く(s)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "選択したファイルの中に複数のG-codeが存在します。1つのG-codeのみ一度に開けます。G-codeファイルを開く場合は、1点のみ選んでください。" @@ -3890,97 +4227,82 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "保存中のプロジェクトサマリーを非表示にする" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "保存" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "準備する" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "モニター" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "レイヤーの高さ" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "カスタムプロファイルが有効になっています。品質スライダーを有効にするには、カスタムタブでデフォルトの品質プロファイルを選択してください" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "プリントスピード" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "ゆっくり" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "早く" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "プロファイルの設定がいくつか変更されました。変更を有効にするにはカスタムモードに移動してください。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "インフィル" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "グラデュアルインフィルはトップに向かうに従ってインフィルの量を増やします。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "グラデュアルを有効にする" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "サポートを生成します。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "オーバーハングがあるモデルにサポートを生成します。このサポート構造なしでは、プリント中にオーバーハングのパーツが崩壊してしまいます。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "サポートエクストルーダー" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "サポートに使うエクストルーダーを選択してください。モデルの垂れや中空プリントを避けるためにモデルの下にサポート構造を生成します。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "ビルドプレートの接着" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "ブリムまたはラフトのプリントの有効化。それぞれ、プリントの周り、また造形物の下に底面を加え切り取りやすくします。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "プリントにヘルプが必要ですか?
    Ultimakerトラブルシューティングガイドを読んでください。" @@ -3997,17 +4319,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "プロジェクトを開く" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "これはCuraのプロジェクトファイルです。プロジェクトとしてあけますか、それともモデルのみ取り込みますか?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "選択を記憶させる" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "プロジェクトを開く" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "モデルを取り込む" @@ -4017,21 +4344,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "エンジンログ" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "フィラメント" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "互換性の確認" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Ultimaker.comにてマテリアルのコンパティビリティを調べるためにクリック" +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4122,6 +4464,26 @@ msgctxt "name" msgid "USB printing" msgstr "USBプリンティング" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4142,6 +4504,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3ネットワークコネクション" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4154,8 +4526,8 @@ msgstr "ファームウェアアップデートチェッカー" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "ソリッドワークスにて特定のファイルを開くことが可能です。その後変換され、Curaに取り込めます。" +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4222,6 +4594,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "レガシーCuraプロファイルリーダー" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4382,6 +4764,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Curaプロファイルライター" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4422,6 +4814,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Curaプロファイルリーダー" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "不明" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "ソリッドワークスのファイルを開く際にエラーが発生しました!ソリッドワークスで、問題なく開くことができるか確認してください。" + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "%sを開始中にエラーが発生" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "シミュレーションビュー" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Curaが非特定なスライスされた数字を集めました。プレファレンス内で無効にできます。" + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "却下する" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "グローバル" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    致命的な例外が発生しました。問題解決のためこのクラッシュレポートを送信してください

    \n" +#~ "

    「レポート送信」ボタンを使用してバグレポートが自動的にサーバーに送られるようにしてください

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Curaバージョン: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "プラットフォーム: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Qtバージョン: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "PyQtバージョン: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "例外トレースバック" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "フィラメント直径" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker 3 Extended" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Curaソリッドワークスプラグインコンフィグレーション" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "書き出されたSTLのクオリティーデフォルト" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "毎回確認" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "常にファインクオリティーを使用する" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "常に粗めのクオリティーを使用する" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "ソリッドワークスのファイルをSTLとして取り込む" + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "書き出されたSTLのクオリティー" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "クオリティー" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "粗い" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "ファイン" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "利用可能なプロファイルがありません" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "この設定は常に全てのエクストルーダーに共有されています。ここですべてのエクストルーダーの数値を変更できます。" + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "時間仕様
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "&カメラ位置のリセット" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "プロジェクトを保存" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "準備する" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "モニター" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "互換性の確認" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "ソリッドワークスにて特定のファイルを開くことが可能です。その後変換され、Curaに取り込めます。" + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "ブロックされました" @@ -4442,13 +4984,9 @@ msgstr "Curaプロファイルリーダー" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "{machine_name}が最新の機能を得るために、定期的にファームウェアをアップデートすることをお勧めします。{machine_name}(ネットワーク上で接続)またはUSBにて行ってください。 " -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "レイヤービュー" - -msgctxt "@info:title" -msgid "Layer View" -msgstr "レイヤービュー" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "レイヤービュー" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4550,6 +5088,6 @@ msgstr "レイヤービュー" #~ msgid "Provides the Layer view." #~ msgstr "レイヤービューを供給する" -msgctxt "name" -msgid "Layer View" -msgstr "レイヤービュー" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "レイヤービュー" diff --git a/resources/i18n/ja_JP/fdmextruder.def.json.po b/resources/i18n/ja_JP/fdmextruder.def.json.po index d1ff38fcf2..69c13959bd 100644 --- a/resources/i18n/ja_JP/fdmextruder.def.json.po +++ b/resources/i18n/ja_JP/fdmextruder.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" diff --git a/resources/i18n/ja_JP/fdmprinter.def.json.po b/resources/i18n/ja_JP/fdmprinter.def.json.po index 56ba768bc9..d35db7f4fd 100644 --- a/resources/i18n/ja_JP/fdmprinter.def.json.po +++ b/resources/i18n/ja_JP/fdmprinter.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" @@ -62,7 +62,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "Gcodeのコマンドは −で始まり\nで区切られます。" +msgstr "" +"Gcodeのコマンドは −で始まり\n" +"で区切られます。" #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -75,7 +77,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "Gcodeのコマンドは −で始まり\nで区切られます。" +msgstr "" +"Gcodeのコマンドは −で始まり\n" +"で区切られます。" #: fdmprinter.def.json msgctxt "material_guid label" @@ -377,6 +381,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + # msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" @@ -641,31 +655,6 @@ 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 "初期レイヤーの高さ(mm)。厚い初期層はビルドプレートへの接着を容易にする。" -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "スライス公差" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "表面を斜めにスライスする方法を指定します。レイヤーの領域は、レイヤーの中央がサーフェス(中央)と交差する位置に基づいて生成できます。また、各層は、レイヤーの高さを通してボリュームの内側に収まる領域を持つ(排他)か、またはレイヤー内の任意の場所内に収まる領域を持っています(包括)。排他は最も細かく、包括は最もフィットし、中間は時間がかかります。" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "中間" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "排他" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "包括" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -706,17 +695,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "一番外側のウォールラインを除くすべてのウォールラインのラインの幅。" -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "最上面のライン幅" - -# msgstr "上表面スキンの線幅" -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "プリントの上部の 線の幅。" - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -907,46 +885,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "上部表面のレイヤー数。通常一層で綺麗に出来上がります" -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "上部表面パターン" - -# msgstr "上層表面スキンパターン" -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "上層のパターン" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "直線" - -# msgstr "線" -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "同心円" - -# msgstr "同心" -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "ジグザグ" - -# msgstr "ジグザグ" -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "最上面のラインの向き" - -# msgstr "上層表面スキンラインの方向" -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "トップ表面層に縦かジグザグパターンを利用する時に使用する整数の行方向のリスト。リスト内から順番に使われていき、リストの最後に達するとまた最初の設定値に戻ります。リストアイテムはカンマで区切られ、全体はカッコで括られています。デフォルトでは何も入っておらず、設定角度は (45 度と 135 度)になっています。" - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1079,6 +1017,17 @@ 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 "外壁の経路にはめ込む。外壁がノズルよりも小さく、内壁の後に造形されている場合は、オフセットを使用して、ノズルの穴をモデルの外側ではなく内壁と重なるようにします。" +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "壁印刷順序の最適化" + +# msgstr "壁のプリントの順番を最適化する" +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "撤回と移動距離を減らすために、壁のプリント順序を最適化します。ほとんどの部品がこの設定を有効にしている方が良い印刷結果につながりますが、実際には時間がかかることがありますので、最適化の有無に関わらず印刷時間を比較してください。" + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1149,6 +1098,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "全対象" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1220,7 +1179,9 @@ msgstr "ZシームX" #: 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 "レイヤー内の各印刷を開始するX座\n標の位置。" +msgstr "" +"レイヤー内の各印刷を開始するX座\n" +"標の位置。" #: fdmprinter.def.json msgctxt "z_seam_y label" @@ -1561,8 +1522,8 @@ msgstr "インフィルXオフセット" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "インフィルパターンはX軸に沿ってこの距離を移動します。" +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1571,8 +1532,8 @@ msgstr "インフィルYオフセット" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "インフィルパターンはY軸に沿ってこの距離を移動します。" +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1589,11 +1550,10 @@ msgctxt "infill_overlap label" msgid "Infill Overlap Percentage" msgstr "インフィル公差量" -# 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 "インフィルと壁が交差する量、わずかな交差によって壁がインフィルにしっかりつながります。" +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1613,8 +1573,8 @@ msgstr "表面公差量" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "表面と壁の交わる量。ラインの幅の%で設定。少しの接触でしっかりと繋がります。表面と内壁の交わる量の平均値になります。" +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1676,7 +1636,9 @@ 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 "壁より前にインフィルをプリントします はじめに壁をプリントするとより精密な壁になりますが、オーバーハングのプリントは悪化します\nはじめにインフィルをプリントすると丈夫な壁になりますが、インフィルの模様が時折表面から透けて表れます" +msgstr "" +"壁より前にインフィルをプリントします はじめに壁をプリントするとより精密な壁になりますが、オーバーハングのプリントは悪化します\n" +"はじめにインフィルをプリントすると丈夫な壁になりますが、インフィルの模様が時折表面から透けて表れます" #: fdmprinter.def.json msgctxt "min_infill_area label" @@ -1783,16 +1745,6 @@ msgctxt "material description" msgid "Material" msgstr "マテリアル" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -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 "その画層の平均流速で自動的にレイヤーごとに温度を変更します。" - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1843,16 +1795,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "印刷終了直前に冷却を開始する温度。" -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "フロー温度グラフ" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "マテリアルフロー(毎秒 3mm) と温度 (° c) をリンクします。" - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1870,8 +1812,8 @@ 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 "加熱式ビルドプレート温度。これが 0 の場合、ベッドは加熱しません。" +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3586,6 +3528,17 @@ 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 "タワーの屋上の角度。値が高いほど尖った屋根が得られ、値が低いほど屋根が平らになります。" +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "サポートメッシュの下処理" + +# 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 "サポートメッシュの下のサポート材を全箇所に作ります、これはサポートメッシュ下にてオーバーハングしないようにするためです。" + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -3691,7 +3644,9 @@ 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 "スカートと印刷の最初の層の間の水平距離。\nこれは最小距離です。複数のスカートラインがこの距離から外側に展開されます。" +msgstr "" +"スカートと印刷の最初の層の間の水平距離。\n" +"これは最小距離です。複数のスカートラインがこの距離から外側に展開されます。" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4224,16 +4179,6 @@ 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 "通常、Curaはメッシュ内の小さな穴をスティッチし、大きな穴のあるレイヤーの部分を削除しようとします。このオプションを有効にすると、スティッチできない部分が保持されます。このオプションは、他のすべてが適切なGCodeを生成できない場合の最後の手段として使用する必要があります。" -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "最大解像度" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "スライス後の線分の最小サイズ。これを増やすと、メッシュの解像度が低くなります。これにより、プリンタが g コードの処理速度に追いつくことができ、処理できないメッシュの詳細を取り除いてスライス速度を速めます。" - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4389,17 +4334,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "このメッシュを使用してサポート領域を指定します。これは、サポート構造を生成するために使用できます。" -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -msgstr "サポートメッシュの下処理" - -# 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 "サポートメッシュの下のサポート材を全箇所に作ります、これはサポートメッシュ下にてオーバーハングしないようにするためです。" - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4478,15 +4412,200 @@ msgid "experimental!" msgstr "実験的" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "壁印刷順序の最適化" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" -# msgstr "壁のプリントの順番を最適化する" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "撤回と移動距離を減らすために、壁のプリント順序を最適化します。ほとんどの部品がこの設定を有効にしている方が良い印刷結果につながりますが、実際には時間がかかることがありますので、最適化の有無に関わらず印刷時間を比較してください。" +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "スライス公差" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "表面を斜めにスライスする方法を指定します。レイヤーの領域は、レイヤーの中央がサーフェス(中央)と交差する位置に基づいて生成できます。また、各層は、レイヤーの高さを通してボリュームの内側に収まる領域を持つ(排他)か、またはレイヤー内の任意の場所内に収まる領域を持っています(包括)。排他は最も細かく、包括は最もフィットし、中間は時間がかかります。" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "中間" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "排他" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "包括" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "最上面のライン幅" + +# msgstr "上表面スキンの線幅" +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "プリントの上部の 線の幅。" + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "上部表面パターン" + +# msgstr "上層表面スキンパターン" +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "上層のパターン" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "直線" + +# msgstr "線" +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "同心円" + +# msgstr "同心" +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "ジグザグ" + +# msgstr "ジグザグ" +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "最上面のラインの向き" + +# msgstr "上層表面スキンラインの方向" +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "トップ表面層に縦かジグザグパターンを利用する時に使用する整数の行方向のリスト。リスト内から順番に使われていき、リストの最後に達するとまた最初の設定値に戻ります。リストアイテムはカンマで区切られ、全体はカッコで括られています。デフォルトでは何も入っておらず、設定角度は (45 度と 135 度)になっています。" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +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 "その画層の平均流速で自動的にレイヤーごとに温度を変更します。" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "フロー温度グラフ" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "マテリアルフロー(毎秒 3mm) と温度 (° c) をリンクします。" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "最大解像度" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "スライス後の線分の最小サイズ。これを増やすと、メッシュの解像度が低くなります。これにより、プリンタが g コードの処理速度に追いつくことができ、処理できないメッシュの詳細を取り除いてスライス速度を速めます。" #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -5097,6 +5216,46 @@ 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 "ノズルと水平方向に下向きの線間の距離。大きな隙間がある場合、急な角度で斜め下方線となり、次の層が上方接続しずらくなる。ワイヤ印刷にのみ適用されます。" +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -5157,6 +5316,27 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "ファイルから読み込むときに、モデルに適用するトランスフォーメーションマトリックス。" +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "インフィルパターンはX軸に沿ってこの距離を移動します。" + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "インフィルパターンはY軸に沿ってこの距離を移動します。" + +# msgstr "インフィルのオーバーラップ率" +#~ 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 "インフィルと壁が交差する量、わずかな交差によって壁がインフィルにしっかりつながります。" + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "表面と壁の交わる量。ラインの幅の%で設定。少しの接触でしっかりと繋がります。表面と内壁の交わる量の平均値になります。" + +#~ 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 "加熱式ビルドプレート温度。これが 0 の場合、ベッドは加熱しません。" + #~ 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, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." #~ msgstr "印刷物のインフィルのパターン。線とジグザグのインフィルはレイヤーごとに交互に方向を変え、材料費を削減します。グリッド、三角形、キュービック、オクテット、クォーターキュービック、同心円のパターンは、すべてのレイヤーにて完全に印刷されます。キュービック、クォーターキュービック、オクテットのインフィルは各レイヤーごとに変化し、各方向の強度が均等になるように分布します。" diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index a72274dc2c..851c59526b 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -2,12 +2,12 @@ # 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 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" @@ -18,7 +18,7 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 2.0.4\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "기계 설정" @@ -55,12 +55,11 @@ msgstr "Doodle3D Connect에 연결" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -100,7 +99,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Doodle3D Connect 웹 인터페이스 열기" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "변경 내역 표시" @@ -115,78 +114,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "프로필이 병합되고 활성화되었습니다." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "USB 인쇄" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "USB를 통해 인쇄" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "USB를 통해 인쇄" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "USB를 통해 연결" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "프린터가 사용 중이거나 연결되어 있지 않아 새 작업을 시작할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "프린터 사용 불가" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "이 프린터는 UltiGCode flavor를 사용하기 때문에 USB 인쇄를 지원하지 않습니다." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "USB 인쇄" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "프린터가 USB 인쇄를 지원하지 않기 때문에 새 작업을 시작할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "경고" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "프린터가 연결되어 있지 않으므로 펌웨어를 업데이트 할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "프린터에 필요한 펌웨어를 찾을 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "프린터 펌웨어" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -230,11 +234,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "이동식 드라이브에 저장할 수 없습니다 :" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "에러" @@ -284,7 +288,7 @@ msgid "Removable Drive" msgstr "이동식 드라이브" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "네트워크를 통해 인쇄" @@ -398,110 +402,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "프린터 상태" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "새 인쇄 작업을 시작할 수 없습니다. 슬롯 {0}에로드 된 Printcore가 없습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "새 인쇄 작업을 시작할 수 없습니다. 슬롯 {0}에로드 된 자료 없음" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "스풀 {0}의 재료가 충분하지 않습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "압출기 {2}에 대해 선택된 다른 PrintCore (Cura : {0}, Printer : {1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "압출기 {2}에 대해 선택된 다른 재료 (Cura : {0}, Printer : {1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "PrintCore가 올바르게 조정되지 않았습니다. XY 교정은 프린터에서 수행해야합니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "선택한 구성으로 인쇄 하시겠습니까?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "프린터 및 Cura의 구성 또는 교정간에 불일치가 있습니다. 최상의 결과를 얻으려면 프린터에 삽입 된 PrintCores 및 재료를 항상 슬라이스하십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "일치하지 않는 구성" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "새 작업 전송 (일시적)이 차단되어 이전 인쇄 작업을 계속 보냅니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "프린터로 데이터 보내기" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "데이터 전송 중" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "프린터로 데이터를 보낼 수 없습니다. 다른 작업이 여전히 작동중인가요?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "인쇄 중단 중 ..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "인쇄가 중단되었습니다. 프린터를 확인하십시오" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "인쇄 일시 중지 중 ..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "인쇄 재개 중 ..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "프린터와 동기화" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Cura에서 현재 프린터 구성을 사용 하시겠습니까?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "프린터의 PrintCores 및 / 또는 자료는 현재 프로젝트 내의 자료와 다릅니다. 최상의 결과를 얻으려면 프린터에 삽입 된 PrintCores 및 재료를 항상 슬라이스하십시오." @@ -522,145 +526,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "인쇄를 완료했습니다. 인쇄물을 수거하고 빌드 플레이트를 지우십시오." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "?을 인쇄하기 위해 예약되어 있습니다. 인쇄를 시작하려면 프린터의 구성을 작업에 맞게 변경하십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "새로운 인쇄 작업을 보낼 수 없습니다 :이 3D 프린터는 아직 연결된 Ultimaker 3 프린터 그룹을 호스트하도록 설정되지 않았습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "{cluster_name} 그룹에 인쇄 작업을 보낼 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "파일이름을 cluster_name 그룹에 보냈습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "인쇄 작업 표시" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "브라우저에서 인쇄 작업 인터페이스를 엽니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "알 수 없는" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, fuzzy, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "프린터가 인쇄를 완료했습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "프린트가 완료됐습니다" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "필요한 조치" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "{filename} {file_name} 을 {cluster_name} 그룹에 보냄" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "네트워크를 통해 연결" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "{machine_name}의 새로운 기능을 사용할 수 있습니다! 프린터의 펌웨어를 업데이트하는 것이 좋습니다." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "새로운 펌웨어를 사용할 수 있습니다." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "업데이트 방법" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "업데이트 정보에 액세스 할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "SolidWorks 파일을 여는 중 오류가 발생했습니다! 문제없이 SolidWorks에서 파일을 열 수 있는지 확인하십시오" +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "SolidWorks 파트 파일" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "SolidWorks 어셈블리 파일" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "구성" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "시작하는 도중 오류가 발생했습니다!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "시뮬레이션 보기" +msgid "Layer view" +msgstr "레이어 보기" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "와이어 인쇄가 활성화되어있을 때 Cura는 레이어를 정확하게 표시하지 않습니다" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "시뮬레이션 보기" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "G 코드 수정" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "Cura는 익명의 슬라이싱 통계를 수집합니다. 환경 설정에서 이 기능을 비활성화 할 수 있습니다." +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -669,14 +716,41 @@ msgstr "데이터 수집" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "버리다" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Cura 15.04 프로필" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -708,49 +782,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "GIF 이미지" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "선택한 소재 또는 구성과 호환되지 않기 때문에 현재 소재로 슬라이스 할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "슬라이스 할 수 없습니다" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "현재 설정으로 슬라이스 할 수 없습니다. 다음 설정에는 오류가 있습니다 : {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "일부 모델별 설정으로 인해 슬라이스할 수 없습니다. 하나 이상의 모델에서 다음 설정에 오류가 있습니다. {error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "프라임 탑 또는 주요 위치가 유효하지 않아 슬라이스 할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "어떤 모델도 빌드 볼륨에 맞지 않으므로 슬라이스 할 수 없습니다. 크기에 맞게 모형을 회전하거나 회전하십시오." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "레이어 처리 중" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "정보" @@ -787,14 +861,14 @@ msgstr "Siemens NX 플러그인 파일을 복사하지 못했습니다. UGII_USE msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Siemens NX 플러그인을 설치하지 못했습니다. Siemens NX의 환경 변수 UGII_USER_DIR을 설정할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "추천" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "관습" @@ -805,24 +879,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF 파일" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "노즐" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "?에서 플러그인 ID를 가져 오는 데 실패했습니다" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "경고" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "플러그인 브라우저" @@ -837,18 +911,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G파일" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "G 코드 파싱" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "G 코드 세부 정보" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "파일을 보내기 전에 g 코드가 프린터 및 프린터 구성에 적합한 지 확인하십시오. g 코드 표현이 정확하지 않을 수 있습니다." @@ -859,6 +933,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Cura 프로필" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -890,142 +974,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "레벨 빌드 플레이트" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "외벽" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "내벽" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "외판" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "빈 공간 채우기" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "빈 공간 채우기 지지" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "지원 인터페이스" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "지지물" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "둘러싸다" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "움직여 가다" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "취소" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "다른" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "알 수 없음" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "미리 잘라낸 파일 {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "로드 된 자료 없음" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "알 수없는 자료" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "객체의 새 위치 삽입" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "위치 찾기" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "모든 개체에 대한 빌드 볼륨 내의 위치를 찾을 수 없습니다" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "위치를 찾을 수 없음" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "파일이 이미 있습니다" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "파일이 이미 있습니다. 덮어 쓰시겠습니까?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "맞춤" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "맞춤 소재" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "전역" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "재정의되지 않음" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "선택한 재료가 선택한 기계 또는 구성과 호환되지 않습니다." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1046,67 +1104,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "재료 직경 변경을 취소하십시오." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "프로필을 ?로 내보내는데 실패했습니다" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "프로필을 ?로 내보내지 못했습니다. Writer 플러그인이 오류를 보고했습니다." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "프로파일을 ?에 내보냅니다" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "내보내기 완료" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "?에서 프로필을 가져 오지 못했습니다" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "프로필 {0}을 (를) 성공적으로 가져 왔습니다." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "프로파일 {0}에 알 수없는 파일 유형이 있거나 손상되었습니다." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "사용자 정의 프로필" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "프로필에 품질 유형이 누락되었습니다." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "현재 구성에 대해 품질 유형 {0}을 (를) 찾을 수 없습니다." +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1117,142 +1197,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "빌드 볼륨" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "객체 곱하기 및 배치" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "개체 배치 중" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "모든 개체에 대한 빌드 볼륨 내의 위치를 찾을 수 없습니다" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "객체의 새 위치 삽입" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "위치 찾기" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "위치를 찾을 수 없음" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "오류 보고서" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    치명적인 예외가 발생했습니다. 문제를 해결할 수 있도록 이 충돌 보고서를 보내주십시오.

    \n

    \"보고서 전송\" 버튼을 사용하면 버그 보고서가 서버에 자동으로 보고됩니다.

    \n " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "시스템 정보" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "알 수 없음" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Cura 버전: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "플랫폼: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Qt 버전: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "PyQt 버전: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • OpenGL 버전: {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • OpenGL 공급업체: {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • OpenGL Renderer: {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "예외 역추적" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "로그" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "사용자 설명" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "보고서 전송" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "기계로드 중 ..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "장면 설정 중 ..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "인터페이스로드 중 ..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "% (너비) .1f x % (깊이) .1f x % (높이) .1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "한 번에 하나의 G 코드 파일만 로드 할 수 있습니다. 가져 오기를 건너 뛰었습니다." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "G 코드가 로드되어 있으면 다른 파일을 열 수 없습니다. 가져 오기를 건너 뛰었습니다." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "선택한 모델이 너무 작아서 로드할 수 없습니다." @@ -1281,12 +1386,11 @@ msgstr "X (너비)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1376,68 +1480,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "노즐 끝과 갠트리 시스템 사이의 높이 차이 (X 및 Y 축). \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 갠트리 사이의 충돌을 방지하는 데 사용됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "압출기의 수" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "프린터가 지원하는 필라멘트의 공칭 직경. 정확한 직경은 소재 및 / 또는 프로파일에 의해 무시됩니다." - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "재료 직경" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "노즐 크기" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "Gcode 시작" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "시작시 Gcode 명령이 실행됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "Gcode 끝내기" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Gcode 명령어가 맨 마지막에 실행됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "노즐 설정" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "노즐 크기" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "프린터가 지원하는 필라멘트의 공칭 직경. 정확한 직경은 소재 및 / 또는 프로파일에 의해 무시됩니다." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "노즐 오프셋 X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "노즐 오프셋 Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "압출기 시작 Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "압출기 종료 Gcode" @@ -1450,8 +1553,9 @@ msgstr "변경 내역" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1516,7 +1620,10 @@ 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 ":네트워크를 통해 프린터로 직접 인쇄하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n\n아래 목록에서 프린터를 선택하십시오" +msgstr "" +":네트워크를 통해 프린터로 직접 인쇄하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n" +"\n" +"아래 목록에서 프린터를 선택하십시오" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1532,7 +1639,7 @@ msgstr "편집" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "제거" @@ -1554,14 +1661,14 @@ msgid "Type" msgstr "유형" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "얼티메이커 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "얼티메이커 3 확장판" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1605,8 +1712,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "네트워크에 프린터의 IP 주소 또는 호스트 이름을 입력하십시오." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1627,6 +1732,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "?은 연결된 Ultimaker 3에 연결된 프린터 그룹을 호스트하도록 설정되지 않았습니다" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1657,11 +1767,16 @@ msgid "Available" msgstr "유효한" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "프린터와의 연결이 끊어졌습니다" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1753,138 +1868,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "구성 활성화" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Cura SolidWorks Plugin 설정" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "내 보낸 STL의 기본 품질 :" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "항상 물어보다" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "항상 좋은 품질을 사용하십시오" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "거친 품질을 항상 사용하십시오" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "SolidWorks 파일을 STL로 가져 오기 ..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "내보낸 STL의 품질" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "품질" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "결이 거친" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "우수한" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "내 선택을 기억하라" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "저장하다" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "색 구성표" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "재질 색상" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "라인 유형" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "이송 속도" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "레이어 두께" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "호환 모드" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "이동 표시" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "도움말 보이기" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "셸 표시" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "충전물 표시" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "상단 레이어 만 표시" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "상단에 5 개의 세부 레이어 표시" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "위 / 아래" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "내벽" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "최소" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "최대" @@ -1909,7 +2136,7 @@ msgctxt "@label" msgid "Settings" msgstr "설정" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "활성 사후 처리 스크립트 변경" @@ -1984,23 +2211,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "부드럽게하기" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "설정 선택" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "이 모델에 맞게 사용자 정의 설정을 선택하십시오" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "필터..." -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "모두 보이기" @@ -2168,7 +2425,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "이 플러그인에는 라이선스가 포함되어 있습니다.\n이 플러그인을 설치하려면 이 라이선스를 수락해야 합니다.\n아래의 약관에 동의하시겠습니까?" +msgstr "" +"이 플러그인에는 라이선스가 포함되어 있습니다.\n" +"이 플러그인을 설치하려면 이 라이선스를 수락해야 합니다.\n" +"아래의 약관에 동의하시겠습니까?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2359,66 +2619,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "당신의 점검으로 모든 것이 순조롭게 끝났습니다." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "프린터에 연결되지 않음" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "프린터가 명령을 받아들이지 않습니다" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "유지 보수 중. 프린터를 확인하십시오" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "인쇄..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "일시 중지됨" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "준비 중 ..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "인쇄를 제거하십시오" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "다시 시작하다" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "중지" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "인쇄 중단" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "인쇄 중단" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "인쇄를 중단 하시겠습니까?" @@ -2433,7 +2693,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "일부 프로필 설정을 사용자 지정했습니다.\n이러한 설정을 유지하거나 삭제 하시겠습니까?" +msgstr "" +"일부 프로필 설정을 사용자 지정했습니다.\n" +"이러한 설정을 유지하거나 삭제 하시겠습니까?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2451,19 +2713,19 @@ msgid "Customized" msgstr "맞춤형" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "항상 이걸 내게 부탁해" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "버리고 다시 묻지 마십시오" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "계속하고 다시 묻지 마라" @@ -2498,72 +2760,72 @@ msgctxt "@label" msgid "Brand" msgstr "상표" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "자재 유형" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "색깔" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "속성" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "밀도" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "직경" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "필라멘트 비용" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "필라멘트 무게" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "필라멘트 길이" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "미터 당 비용" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "이 자료는 ?에 연결되어 있으며 일부 속성을 공유합니다." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "재질 연결 해제" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "기술" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "접착 정보" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "인쇄 설정" @@ -2604,7 +2866,7 @@ msgid "Unit" msgstr "단위" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "일반" @@ -2619,230 +2881,255 @@ msgctxt "@label" msgid "Language:" msgstr "언어:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "통화:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "테마:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "이러한 변경 사항을 적용하려면 응용 프로그램을 다시 시작해야합니다." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "설정을 변경할 때 자동으로 슬라이스합니다." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "자동으로 슬라이스" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "뷰포트 동작" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "지원되지 않는 모델 영역을 빨간색으로 강조 표시하십시오. 지지무이 없으면 이 영역이 제대로 인쇄되지 않습니다." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "오버행 표시" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "모델을 선택하면 모델이 뷰의 가운데에 오도록 카메라를 이동합니다" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "항목을 선택하면 중앙 카메라" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "cura의 기본 확대 / 축소 동작을 반전시켜야합니까" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "카메라 줌의 방향을 반전시킵니다." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "확대 / 축소가 마우스 방향으로 이동해야합니까?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "마우스 방향으로 확대 / 축소" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "플랫폼의 모델을 더 이상 교차시키지 않도록 이동해야합니까?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "모델이 분리되어 있는지 확인하십시오" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "플랫폼의 모델을 빌드 플레이트에 닿도록 아래로 움직여야합니까?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "모델을 빌드 플레이트에 자동으로 놓기" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "gcode 리더에 주의 메시지를 표시하십시오" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "gcode 리더의 주의 메시지" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "레이어가 호환 모드로 강제 설정되어야합니까?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "강제 레이어보기 호환성 모드 (다시 시작해야 함)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "파일 열기 및 저장" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "크기가 너무 큰 경우 모델을 빌드 볼륨에 맞게 조정해야합니까?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "대형 모델 확장" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "단위가 밀리미터가 아닌 미터 단위 인 경우 모델이 매우 작게 나타날 수 있습니다. 이 모델을 확장해야합니까?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "매우 작은 모델의 크기 조정" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "프린터 이름에 기반한 접두어가 인쇄 작업 이름에 자동으로 추가되어야합니까?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "작업 이름에 기계 접두어 추가" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "프로젝트 파일을 저장할 때 요약이 표시되어야합니까?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "프로젝트 저장시 요약 대화 상자 표시" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "프로젝트 파일을 열 때 기본 동작" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "프로젝트 파일을 열 때 기본 동작 " -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "항상 물어보다" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "항상 프로젝트로 여십시오" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "항상 모델 가져 오기" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "프로필을 변경하고 다른 프로필로 전환하면 수정 사항을 유지할지 여부를 묻는 대화 상자가 표시되거나 기본 행동을 선택하고 해당 대화 상자를 다시 표시 할 수 없습니다." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "프로필 재정의" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "은둔" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "Cura가 프로그램이 시작될 때 업데이트를 확인해야합니까?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "시작시 업데이트 확인" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "인쇄물에 대한 익명의 데이터를 Ultimaker로 보내야합니까? 모델, IP 주소 또는 기타 개인 식별 정보는 전송되거나 저장되지 않습니다." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "인쇄 (익명) 인쇄 정보" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "프린터" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "활성화" @@ -2885,7 +3172,7 @@ msgid "Waiting for a printjob" msgstr "인쇄거리를 기다리는 중" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "프로필" @@ -2911,13 +3198,13 @@ msgid "Duplicate" msgstr "복제" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "가져오다" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "내보내다" @@ -2983,7 +3270,7 @@ msgid "Export Profile" msgstr "프로필 내보내기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "자재" @@ -2998,60 +3285,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "프린터" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "창조하다" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "복제" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "재료 가져 오기" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr "자재를 가져올 수 없습니다" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "자재를 성공적으로 가져왔습니다" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "자재 내보내기" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "자재를 내보내는데 실패했습니다" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "자재를 성공적으로 내보냈습니다" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "프린터 추가" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "프린터 이름 :" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "프린터 추가" @@ -3076,7 +3363,9 @@ 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는 커뮤니티와 공동으로 Ultimaker B.V.에 의해 개발되었습니다\nCura는 다음 오픈 소스 프로젝트를 자랑스럽게 사용합니다" +msgstr "" +"Cura는 커뮤니티와 공동으로 Ultimaker B.V.에 의해 개발되었습니다\n" +"Cura는 다음 오픈 소스 프로젝트를 자랑스럽게 사용합니다" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3178,158 +3467,171 @@ msgctxt "@label" msgid "Profile:" msgstr "윤곽:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "프로필을 사용할 수 없음" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 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 "일부 설정 / 대체 값은 프로파일에 저장된 값과 다릅니다.\n\n프로파일 매니저를 열려면 클릭하십시오." +msgstr "" +"일부 설정 / 대체 값은 프로파일에 저장된 값과 다릅니다.\n" +"\n" +"프로파일 매니저를 열려면 클릭하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "찾다..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "모든 압출기에 값 복사" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "이 설정 숨기기" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "이 설정을 표시하지 않음" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "이 설정을 계속 표시하십시오" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "설정 표시 설정 ..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "일부 숨겨진 설정은 정상 계산 값과 다른 값을 사용합니다.\n\n이 설정을 표시하려면 클릭하십시오." +msgstr "" +"일부 숨겨진 설정은 정상 계산 값과 다른 값을 사용합니다.\n" +"\n" +"이 설정을 표시하려면 클릭하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "영향" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "영향을 받다" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "이 설정은 항상 모든 압출기간에 공유됩니다. 여기에서 변경하면 모든 압출기의 값이 변경됩니다" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "이 값은 압출기 값마다 결정됩니다 " -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 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 "이 설정에는 프로필과 다른 값이 있습니다.\n\n프로필 값을 복원하려면 클릭하십시오." +msgstr "" +"이 설정에는 프로필과 다른 값이 있습니다.\n" +"\n" +"프로필 값을 복원하려면 클릭하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 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 "이 설정은 일반적으로 계산되지만 현재는 절대 값이 설정되어 있습니다.\n\n계산 된 값을 복원하려면 클릭하십시오." +msgstr "" +"이 설정은 일반적으로 계산되지만 현재는 절대 값이 설정되어 있습니다.\n" +"\n" +"계산 된 값을 복원하려면 클릭하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "인쇄 설정" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "인쇄 설정 사용 안 함\nG 코드 파일은 수정할 수 없습니다" +msgstr "" +"인쇄 설정 사용 안 함\n" +"G 코드 파일은 수정할 수 없습니다" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00h 00min" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "시간 사양
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "비용 사양" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "총계:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 -msgctxt "@tooltip" -msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." -msgstr "권장 인쇄 설정\n선택한 프린터, 재질 및 품질에 대한 권장 설정으로 인쇄하십시오." - #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" -msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." -msgstr "사용자 정의 인쇄 설정\n마지막 스플 라이스 프로세스의 모든 비트를 미세하게 제어하여 인쇄하십시오." +msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." +msgstr "" +"권장 인쇄 설정\n" +"선택한 프린터, 재질 및 품질에 대한 권장 설정으로 인쇄하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 +msgctxt "@tooltip" +msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." +msgstr "" +"사용자 정의 인쇄 설정\n" +"마지막 스플 라이스 프로세스의 모든 비트를 미세하게 제어하여 인쇄하십시오." + +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "자동" @@ -3339,6 +3641,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "조망" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3351,14 +3663,14 @@ msgid_plural "Print Selected Models With:" msgstr[0] "선택된 모델 인쇄 :" msgstr[1] "선택된 모델ㄷ 인쇄 :" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "선택한 모델 곱하기" msgstr[1] "선택한 모델ㄷ 곱하기" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "매수" @@ -3374,7 +3686,7 @@ msgid "No printer connected" msgstr "연결된 프린터 없음" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "압출기" @@ -3484,254 +3796,294 @@ msgctxt "@label" msgid "Estimated time left" msgstr "예상 남은 시간" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Fu & ll 화면 토글" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "풀어 놓다" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "다시하다" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "그만두다" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "카메라 위치 재설정(&R)" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura 구성 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "프린터 추가 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "프린터 관리 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "자료 관리 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "현재 설정 / 재정의로 프로필 업데이트" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "현재 변경 사항 무시" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "현재 설정 / 재정의 프로필 작성" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "프로필 관리 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "온라인 및 문서 표시" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "버그보고" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "대략..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "선택한 모델 삭제 및 선택" msgstr[1] "선택한 모델들 삭제 및 선택" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "선택한 모델 중심" msgstr[1] "선택한 모델들 중심" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "선택한 모델 곱하기" msgstr[1] "선택한 모델ㄷ 곱하기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "모델 삭제" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "플랫폼에 대한 모델" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "그룹 모델" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "모델 그룹 해제" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "모델 합치기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "모델 곱하기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "모든 모델 선택" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "빌드 플레이트 지우기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "모든 모델 새로고치" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "모든 모델 정렬" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "선택 정렬" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "모든 모델 위치 재설정" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "모든 모델 및 변환 재설정" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "파일 열기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "새 프로젝트..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "엔진 및 로그 표시" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "구성 폴더 표시" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "설정 표시 설정 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "플러그인 찾아보기 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "설치된 플러그인 ..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "3D 모델을 로드하십시오" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "슬라이스 준비 완료" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "슬라이싱 ..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "준비 완료" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "슬라이스 할 수 없음" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "슬라이스 사용 불가" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "준비하다" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "취소하다" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "활성 출력 장치 선택" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "열린 파일" @@ -3751,114 +4103,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "파일" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "선택 사항을 파일에 저장" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "다른 이름으로 저장..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "프로젝트 저장" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "편집하다" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "조망" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "설정" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "프린터" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "자재" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "윤곽" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "활성 압출기로 설정" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "확장 프로그램" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "플러그인" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "환경 설정" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "도움" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "파일 열기" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "설정" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "새 프로젝트" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "새 프로젝트를 시작 하시겠습니까? 빌드 플레이트 및 저장하지 않은 설정이 지워집니다." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "플러그인 설치" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "파일 열기" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "선택한 파일 내에 하나 이상의 G 코드 파일이 있습니다. 한 번에 하나의 G 코드 파일 만 열 수 있습니다. G 코드 파일을 열려면 하나만 선택하십시오." @@ -3883,100 +4235,87 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "프로젝트 요약을 다시 저장하지 마십시오" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "저장하다" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "준비하다" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "감시 장치" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "층 높이" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "사용자 지정 프로필이 현재 활성 상태입니다. 품질 슬라이더를 실행하려면 사용자 지정 탭에서 기본 품질 프로필을 선택하십시오." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "인쇄 속도" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "천천히" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "빨리" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "일부 프로필 설정을 수정했습니다. 이러한 설정을 변경하려면 사용자 지정 모드로 이동하십시오." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "빈 공간 채우기" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "점차적인 빈 공간 채우기는 점차적으로 빈 공간 채우기의 양을 증가시킵니다." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "점진적으로 사용" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "지지물 생성" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "돌출부가있는 모델의 부분을 지원하는 구조를 생성합니다. 이러한 구조가 없으면 이러한 부분이 인쇄 중에 붕괴됩니다." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "압출기 지지물" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "지원할 압출기를 선택하십시오. 이렇게하면 모형 아래에 지지 구조가 만들어져 모델이 중간 공기에서 처지거나 인쇄되는 것을 방지합니다." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "플레이트 접착력 강화" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "테두리 또는 raft 인쇄를 사용합니다. 이렇게하면 개체 주변이나 아래에 평평한 영역이 추가되어 나중에 쉽게자를 수 있습니다." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" -msgstr "인쇄물 개선에 도움이 필요하십니까?\nUltimaker 문제 해결 가이드 읽기" +msgstr "" +"인쇄물 개선에 도움이 필요하십니까?\n" +"Ultimaker 문제 해결 가이드 읽기" #: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 msgctxt "@label %1 is filled in with the name of an extruder" @@ -3990,17 +4329,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "프로젝트 파일 열기" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "이 파일은 Cura 프로젝트 파일입니다. 프로젝트로 열거나 모델을 가져 오시겠습니까?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "내 선택을 기억하라" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "프로젝트로 열기" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "모델 가져 오기" @@ -4010,21 +4354,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "엔진 로그" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "자재" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "호환성 확인" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Ultimaker.com의 재질 호환성을 확인하려면 클릭하십시오." +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4115,6 +4474,26 @@ msgctxt "name" msgid "USB printing" msgstr "USB 인쇄" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4135,6 +4514,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3 네트워크 연결" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4147,8 +4536,8 @@ msgstr "펌웨어 업데이트 검사기" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "SolidWorks 자체를 통해 특정 파일을 열 수 있습니다. 이것들은 변환되어 Cura에 로드됩니다" +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4215,6 +4604,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "레거시 Cura 프로필 리더" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4375,6 +4774,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Cura 프로필 작성자" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4415,6 +4824,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura 프로필 판독기" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "알 수 없는" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "SolidWorks 파일을 여는 중 오류가 발생했습니다! 문제없이 SolidWorks에서 파일을 열 수 있는지 확인하십시오" + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "시작하는 도중 오류가 발생했습니다!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "시뮬레이션 보기" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Cura는 익명의 슬라이싱 통계를 수집합니다. 환경 설정에서 이 기능을 비활성화 할 수 있습니다." + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "버리다" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "전역" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    치명적인 예외가 발생했습니다. 문제를 해결할 수 있도록 이 충돌 보고서를 보내주십시오.

    \n" +#~ "

    \"보고서 전송\" 버튼을 사용하면 버그 보고서가 서버에 자동으로 보고됩니다.

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Cura 버전: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "플랫폼: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Qt 버전: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "PyQt 버전: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "예외 역추적" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "재료 직경" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "얼티메이커 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "얼티메이커 3 확장판" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Cura SolidWorks Plugin 설정" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "내 보낸 STL의 기본 품질 :" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "항상 물어보다" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "항상 좋은 품질을 사용하십시오" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "거친 품질을 항상 사용하십시오" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "SolidWorks 파일을 STL로 가져 오기 ..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "내보낸 STL의 품질" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "품질" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "결이 거친" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "우수한" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "프로필을 사용할 수 없음" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "이 설정은 항상 모든 압출기간에 공유됩니다. 여기에서 변경하면 모든 압출기의 값이 변경됩니다" + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "시간 사양
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "카메라 위치 재설정(&R)" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "프로젝트 저장" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "준비하다" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "감시 장치" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "호환성 확인" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "SolidWorks 자체를 통해 특정 파일을 열 수 있습니다. 이것들은 변환되어 Cura에 로드됩니다" + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "막힘" @@ -4435,13 +4994,9 @@ msgstr "Cura 프로필 판독기" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "{machine_name}에 최신 기능이 탑재되어 있는지 확인하려면 정기적으로 펌웨어를 업데이트하는 것이 좋습니다. 이 작업은 {machine_name} (네트워크에 연결된 경우) 또는 USB를 통해 수행 할 수 있습니다." -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "레이어 보기" - -msgctxt "@info:title" -msgid "Layer View" -msgstr "레이어 보기" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "레이어 보기" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4534,6 +5089,6 @@ msgstr "레이어 보기" #~ msgid "Provides the Layer view." #~ msgstr "레이어 보기를 제공합니다." -msgctxt "name" -msgid "Layer View" -msgstr "레이어보기" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "레이어보기" diff --git a/resources/i18n/ko_KR/fdmextruder.def.json.po b/resources/i18n/ko_KR/fdmextruder.def.json.po index 2d9cffc0dc..e928a43967 100644 --- a/resources/i18n/ko_KR/fdmextruder.def.json.po +++ b/resources/i18n/ko_KR/fdmextruder.def.json.po @@ -2,12 +2,12 @@ # 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 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 0af3a1bb27..6b504c74de 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" @@ -347,6 +347,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "반복기" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -607,31 +617,6 @@ 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 "초기 레이어의 높이 (mm)입니다. 두꺼운 초기 레이어는 빌드 플레이트에 쉽게 접착합니다. " -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "슬라이싱 허용 오차" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "레이어를 대각선 서피스로 슬라이스하는 방법 레이어 영역은 레이어의 중앙이 서피스와 교차하는 부분(중간)을 기준으로 생성됩니다. 또는 각 레이어에 레이어의 높이 전체의 볼륨에 들어가는 영역(배타)이나 레이어 안의 어느 지점에 들어가는 영역(중복)이 있을 수 있습니다. 배타는 가장 많은 디테일을 포함하고, 중복은 베스트 피트를 만들 수 있으며, 중간은 처리 시간이 가장 짧습니다." - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "중간" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "배타" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "중복" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -672,16 +657,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "가장 바깥 쪽 벽 선을 제외한 모든 벽 선에 대해 단일 벽 선의 폭입니다. " -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "상단 표면 스킨 선 너비" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "인쇄 상단 부분의 한 줄 너비. " - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -862,41 +837,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "최상층의 스킨 층의 수. 일반적으로 고품질 맨 위 표면을 생성하는 데 최상위 레이어 하나만 있으면 충분합니다. " -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "탑 표면 스킨 패턴" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "최상위 레이어의 패턴입니다. " - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "윤곽" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "동심원의" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "지그재그" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "상단 표면 스킨 라인 방향" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "상단 표면 스킨 층이 선 또는 지그재그 패턴을 사용할 때 사용할 정수선 방향 목록. 목록의 요소는 레이어가 진행됨에 따라 순차적으로 사용되며 목록의 끝에 도달하면 처음부터 다시 시작됩니다. 목록 항목은 쉼표로 구분되며 전체 목록은 대괄호로 묶여 있습니다. 기본값은 전통적인 기본 각도 (45도 및 135도)를 사용하는 빈 목록입니다. " - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1027,6 +967,16 @@ 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 "외벽의 경로에 삽입이 적용됩니다. 외벽이 노즐보다 작고 내벽 다음에 인쇄 된 경우이 옵셋을 사용하여 노즐의 구멍이 모델 외부가 아닌 내벽과 겹치도록하십시오. " +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "벽면 인쇄 명령 최적화" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "수축 및 이동 거리를 줄이도록 벽이 인쇄되는 순서를 최적화하십시오. 대부분의 부품은이 기능을 사용하면 도움이되지만, 실제로는 시간이 오래 걸릴 수 있으므로, 최적화 여부에 관계없이 인쇄 시간을 비교하십시오. " + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1097,6 +1047,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "어디에나" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1479,8 +1439,8 @@ msgstr "충진 X 오프셋" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "충진 패턴이 X축을 따라 이 거리만큼 이동합니다." +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1489,8 +1449,8 @@ msgstr "충진 Y 오프셋" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "충진 패턴이 Y축을 따라 이 거리만큼 이동합니다." +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1509,8 +1469,8 @@ 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 "충진재와 벽 사이의 겹침 정도. 약간 겹치면 벽이 충전재에 단단히 연결됩니다." +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1529,8 +1489,8 @@ msgstr "피부 겹침 비율" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "선 두께의 백분율로 스킨과 벽 사이의 겹치는 정도입니다. 약간 겹치면 벽이 피부에 단단히 연결됩니다. 이것은 스킨 라인과 가장 안쪽 벽의 평균 라인 폭의 백분율입니다. " +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1692,16 +1652,6 @@ msgctxt "material description" msgid "Material" msgstr "재료 " -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -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 "해당 레이어의 평균 유속으로 각 레이어의 온도를 자동으로 변경하십시오. " - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1752,16 +1702,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "인쇄 종료 직전에 이미 냉각이 시작될 온도입니다. " -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "유동 온도 그래프" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "데이터 흐름 (mm3 / 초) - 온도 (섭씨). " - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1779,8 +1719,8 @@ 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 "가열 된 빌드 플레이트에 사용되는 온도. 이 값이 0이면이 인쇄물에 침대가 가열되지 않습니다. " +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3452,6 +3392,16 @@ 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 "타워 옥상의 각도입니다. 높은 값을 지정하면 뾰족한 타워 지붕이되고, 값이 낮을수록 평평한 타워 지붕이됩니다. " +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +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 "지지 메쉬 아래의 모든 부분을 지원하여지지 메쉬에 돌출이 없어야 합니다. " + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -3552,7 +3502,9 @@ 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 "프린트의 스커트와 첫 번째 레이어 사이의 수직 거리입니다.\n이는 최소 거리입니다. 여러 개의 스커트 선이 이 거리에서 바깥쪽으로 연장됩니다." +msgstr "" +"프린트의 스커트와 첫 번째 레이어 사이의 수직 거리입니다.\n" +"이는 최소 거리입니다. 여러 개의 스커트 선이 이 거리에서 바깥쪽으로 연장됩니다." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4084,16 +4036,6 @@ 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 "일반적으로 큐라(Cura)는 메쉬의 작은 구멍을 꿰매 붙이고 큰 구멍이있는 레이어의 부분을 제거하려고합니다. 이 옵션을 활성화하면 스티칭 할 수없는 파트가 유지됩니다. 이 옵션은 다른 모든 것이 올바른 GCode를 생성하지 못할 때 최후의 수단으로 사용해야합니다. " -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "최대 해상도" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "슬라이딩 후의 선분의 최소 크기입니다. 이 값을 높이면 메쉬의 해상도가 낮아집니다. 그러면 프린터가 G 코드를 처리하는 데 필요한 속도를 유지할 수 있으며 처리할 수 없는 메쉬의 디테일이 제거되므로 슬라이드 속도가 높아집니다." - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4244,16 +4186,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "본 메시를 사용하여 지원 영역을 지정하십시오. 이것은 지원 구조를 생성하는 데 사용할 수 있습니다. " -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -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 "지지 메쉬 아래의 모든 부분을 지원하여지지 메쉬에 돌출이 없어야 합니다. " - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4330,14 +4262,194 @@ msgid "experimental!" msgstr "실험적인 " #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "벽면 인쇄 명령 최적화" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "수축 및 이동 거리를 줄이도록 벽이 인쇄되는 순서를 최적화하십시오. 대부분의 부품은이 기능을 사용하면 도움이되지만, 실제로는 시간이 오래 걸릴 수 있으므로, 최적화 여부에 관계없이 인쇄 시간을 비교하십시오. " +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "슬라이싱 허용 오차" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "레이어를 대각선 서피스로 슬라이스하는 방법 레이어 영역은 레이어의 중앙이 서피스와 교차하는 부분(중간)을 기준으로 생성됩니다. 또는 각 레이어에 레이어의 높이 전체의 볼륨에 들어가는 영역(배타)이나 레이어 안의 어느 지점에 들어가는 영역(중복)이 있을 수 있습니다. 배타는 가장 많은 디테일을 포함하고, 중복은 베스트 피트를 만들 수 있으며, 중간은 처리 시간이 가장 짧습니다." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "중간" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "배타" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "중복" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "상단 표면 스킨 선 너비" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "인쇄 상단 부분의 한 줄 너비. " + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "탑 표면 스킨 패턴" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "최상위 레이어의 패턴입니다. " + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "윤곽" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "동심원의" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "지그재그" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "상단 표면 스킨 라인 방향" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "상단 표면 스킨 층이 선 또는 지그재그 패턴을 사용할 때 사용할 정수선 방향 목록. 목록의 요소는 레이어가 진행됨에 따라 순차적으로 사용되며 목록의 끝에 도달하면 처음부터 다시 시작됩니다. 목록 항목은 쉼표로 구분되며 전체 목록은 대괄호로 묶여 있습니다. 기본값은 전통적인 기본 각도 (45도 및 135도)를 사용하는 빈 목록입니다. " + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +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 "해당 레이어의 평균 유속으로 각 레이어의 온도를 자동으로 변경하십시오. " + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "유동 온도 그래프" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "데이터 흐름 (mm3 / 초) - 온도 (섭씨). " + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "최대 해상도" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "슬라이딩 후의 선분의 최소 크기입니다. 이 값을 높이면 메쉬의 해상도가 낮아집니다. 그러면 프린터가 G 코드를 처리하는 데 필요한 속도를 유지할 수 있으며 처리할 수 없는 메쉬의 디테일이 제거되므로 슬라이드 속도가 높아집니다." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4936,6 +5048,46 @@ 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 "노즐과 수평 아래쪽 라인 사이의 거리. 클리어런스가 클수록 비스듬한 각도에서 비스듬히 아래쪽으로 선이 그어져 다음 층과의 연결이보다 적어집니다. 와이어 인쇄에만 적용됩니다. " +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4996,6 +5148,26 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "파일로부터 로드 하는 경유, 모델에 적용될 변환 행렬입니다. " +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "충진 패턴이 X축을 따라 이 거리만큼 이동합니다." + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "충진 패턴이 Y축을 따라 이 거리만큼 이동합니다." + +#~ 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 "충진재와 벽 사이의 겹침 정도. 약간 겹치면 벽이 충전재에 단단히 연결됩니다." + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "선 두께의 백분율로 스킨과 벽 사이의 겹치는 정도입니다. 약간 겹치면 벽이 피부에 단단히 연결됩니다. 이것은 스킨 라인과 가장 안쪽 벽의 평균 라인 폭의 백분율입니다. " + +#~ 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 "가열 된 빌드 플레이트에 사용되는 온도. 이 값이 0이면이 인쇄물에 침대가 가열되지 않습니다. " + #~ msgctxt "wall_x_extruder_nr label" #~ msgid "Inner Walls Extruder" #~ msgstr "내벽 압출기" diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index a6021b3ce0..0c2d0236bc 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "Machine-instellingen" @@ -53,12 +53,11 @@ msgstr "Verbinding maken met Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -98,7 +97,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "De Doodle3D Connect-webinterface openen" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Wijzigingenlogboek Weergeven" @@ -113,78 +112,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "Profiel is gevlakt en geactiveerd." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "USB-printen" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "Printen via USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "Via USB Printen" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "Aangesloten via USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Er kan geen nieuwe taak worden gestart omdat de printer bezig is of niet aangesloten is." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "Printer is niet beschikbaar" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "De printer biedt geen ondersteuning voor USB-printen omdat deze de codeversie UltiGCode gebruikt." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "USB-printen" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Er kan geen nieuwe taak worden gestart omdat de printer geen ondersteuning biedt voor USB-printen." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "Waarschuwing" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "De firmware kan niet worden bijgewerkt omdat er geen printers zijn aangesloten." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "De voor de printer benodigde software is niet op %s te vinden." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "Firmware van uw printer" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -228,11 +232,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Kan niet opslaan op verwisselbaar station {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "Fout" @@ -282,7 +286,7 @@ msgid "Removable Drive" msgstr "Verwisselbaar Station" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Printen via netwerk" @@ -396,110 +400,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "Printerstatus" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Er kan geen nieuwe taak worden gestart. Er is geen PrintCore geladen in de sleuf {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Er kan geen nieuwe taak worden gestart. Er is geen materiaal geladen in de sleuf {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Er is onvoldoende materiaal voor de spool {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Afwijkende PrintCore (Cura: {0}, Printer: {1}) geselecteerd voor de extruder {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Afwijkend materiaal (Cura: {0}, Printer: {1}) geselecteerd voor de extruder {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "De PrintCore {0} is niet correct gekalibreerd. Op de printer moet XY-kalibratie worden uitgevoerd." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Weet u zeker dat u met de geselecteerde configuratie wilt printen?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "De configuratie of kalibratie van de printer komt niet overeen met de configuratie van Cura. Slice voor het beste resultaat altijd voor de PrintCores en materialen die in de printer zijn ingevoerd." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "De configuratie komt niet overeen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "Het verzenden van nieuwe taken is (tijdelijk) geblokkeerd. Nog bezig met het verzenden van de vorige printtaak." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "De gegevens worden naar de printer verzonden" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "Gegevens Verzenden" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Kan geen gegevens naar de printer verzenden. Is er nog een andere taak actief?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Printen afbreken..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Print afgebroken. Controleer de printer" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Print onderbreken..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Print hervatten..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Synchroniseren met de printer" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Wilt u uw huidige printerconfiguratie gebruiken in Cura?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "De PrintCores en/of materialen in de printer wijken af van de PrintCores en/of materialen in uw huidige project. Slice voor het beste resultaat altijd voor de PrintCores en materialen die in de printer zijn ingevoerd." @@ -520,145 +524,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "{printer_name} heeft '{job_name}' voltooid. Haal de print op en bevestig dat het platform is leeggemaakt." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} is gereserveerd voor het printen van '{job_name}'. Wijzig de instellingen van de printer zodanig dat ze aansluiten bij de taak, zodat u kunt beginnen met printen." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Kan geen nieuwe printtaak verzenden: deze 3D-printer is (nog) niet ingesteld voor het hosten van een groep aangesloten Ultimaker 3-printers." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Kan de printtaak niet naar groep {cluster_name} verzenden." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "{file_name} is verzonden naar groep {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "Printtaken weergeven" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "Opent de printtaken-interface in uw browser." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "Onbekend" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "Printer '{printer_name}' is klaar met het printen van '{job_name}'." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "Print klaar" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "Handeling nodig" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "Bezig met verzenden van {file_name} naar groep {cluster_name}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "Verbinding Maken via Netwerk" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "Er zijn nieuwe functies beschikbaar voor uw {machine_name}! Het wordt aanbevolen de firmware van uw printer bij te werken." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Nieuwe firmware voor %s beschikbaar" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "Instructies voor bijwerken" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "Geen toegang tot update-informatie." -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "Er zijn fouten opgetreden tijdens het openen van het SolidWorks-bestand. Controleer of u het bestand zonder problemen in SolidWorks kunt openen." +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "Onderdelenbestand SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "Montagebestand SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "Configureren" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "Er is een fout opgetreden tijdens het starten van %s!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "Simulatieweergave" +msgid "Layer view" +msgstr "Laagweergave" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "Als draadprinten is ingeschakeld, geeft Cura lagen niet nauwkeurig weer" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "Simulatieweergave" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "G-code wijzigen" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "Cura verzamelt geanonimiseerde slicing-statistieken. Dit kan bij de voorkeuren worden uitgeschakeld." +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -667,14 +714,41 @@ msgstr "Gegevens verzamelen" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "Verwijderen" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Cura 15.04-profielen" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -706,49 +780,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "GIF-afbeelding" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "Met het huidige materiaal is slicen niet mogelijk, omdat het materiaal niet compatibel is met de geselecteerde machine of configuratie." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "Kan niet slicen" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Met de huidige instellingen is slicing niet mogelijk. De volgende instellingen bevatten fouten: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "Slicing is niet mogelijk vanwege enkele instellingen per model. De volgende instellingen bevatten fouten voor een of meer modellen: {error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Slicen is niet mogelijk omdat de terugduwpijler of terugduwpositie(s) ongeldig zijn." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Er valt niets te slicen omdat geen van de modellen in het bouwvolume past. Schaal of roteer de modellen totdat deze passen." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "Lagen verwerken" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "Informatie" @@ -785,14 +859,14 @@ msgstr "Kan de bestanden voor de Siemens NX-invoegtoepassingen niet installeren. msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Kan de Siemens NX-invoegtoepassing niet installeren. Het instellen van de omgevingsvariabele UGII_USER_DIR voor Siemens NX is mislukt." -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "Aanbevolen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "Aangepast" @@ -803,24 +877,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF-bestand" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "Nozzle" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Kan de invoegtoepassing-ID van {0} niet vinden" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "Waarschuwing" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "Invoegtoepassingbrowser" @@ -835,18 +909,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G-bestand" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "G-code parseren" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "Details van de G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "Zorg ervoor dat de G-code geschikt is voor uw printer en de printerconfiguratie voordat u het bestand verzendt. Mogelijk is de weergave van de G-code niet nauwkeurig." @@ -857,6 +931,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Cura-profiel" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -888,142 +972,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "Platform kalibreren" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Buitenwand" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Binnenwanden" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "Skin" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "Vulling" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "Supportvulling" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "Verbindingsstructuur" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "Supportstructuur" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "Skirt" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "Beweging" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "Intrekkingen" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "Overig(e)" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "Onbekend" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Vooraf geslicet bestand {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "Geen materiaal ingevoerd" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "Onbekend materiaal" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "Nieuwe locatie vinden voor objecten" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "Locatie vinden" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "Kan binnen het werkvolume niet voor alle objecten een locatie vinden" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "Kan locatie niet vinden" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "Het Bestand Bestaat Al" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "Het bestand {0} bestaat al. Weet u zeker dat u dit bestand wilt overschrijven?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "Aangepast" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "Aangepast materiaal" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "Algemeen" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "Niet overschreven" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Het geselecteerde materiaal is niet compatibel met de geselecteerde machine of configuratie." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1044,67 +1102,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Maak wijzigen van de materiaaldiameter ongedaan." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Kan het profiel niet exporteren als {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Kan het profiel niet exporteren als {0}: Invoegtoepassing voor de schrijver heeft een fout gerapporteerd." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Het profiel is geëxporteerd als {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "De export is voltooid" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Kan het profiel niet importeren uit {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Het profiel {0} is geïmporteerd" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Het profiel {0} heeft een onbekend bestandstype of is beschadigd." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "Aangepast profiel" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Er ontbreekt een kwaliteitstype in het profiel." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "Kan geen kwaliteitstype {0} vinden voor de huidige configuratie." +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1115,142 +1195,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "Werkvolume" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Objecten verveelvoudigen en plaatsen" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "Object plaatsen" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "Kan binnen het werkvolume niet voor alle objecten een locatie vinden" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "Nieuwe locatie vinden voor objecten" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "Locatie vinden" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "Kan locatie niet vinden" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "Crashrapport" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    Er is een fatale uitzondering opgetreden. Stuur ons het Crashrapport om het probleem op te lossen

    \n

    Druk op de knop \"Rapport verzenden\" om het foutenrapport automatisch naar onze servers te verzenden

    \n " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "Systeeminformatie" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "Onbekend" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Cura-versie: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "Platform: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Qt-versie: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "PyQt-versie: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • OpenGL-versie: {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • OpenGL-leverancier: {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • OpenGL-renderer: {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "Traceback van uitzondering" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "Logboeken" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "Gebruikersbeschrijving" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "Rapport verzenden" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Machines laden..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Scene instellen..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Interface laden..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Er kan slechts één G-code-bestand tegelijkertijd worden geladen. Het importeren van {0} is overgeslagen" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Kan geen ander bestand openen als G-code wordt geladen. Het importeren van {0} is overgeslagen" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "Het geselecteerde model is te klein om te laden." @@ -1279,12 +1384,11 @@ msgstr "X (Breedte)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1374,68 +1478,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "Het hoogteverschil tussen de punt van de nozzle en het rijbrugsysteem (X- en Y-as). Wordt tijdens \"een voor een\"-printen gebruikt om botsingen tussen eerder geprinte voorwerpen en het rijbrugsysteem te voorkomen" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "Aantal extruders" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "De nominale diameter van het filament dat wordt ondersteund door de printer. De exacte diameter wordt overschreven door het materiaal en/of het profiel." - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "Materiaaldiameter" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "Maat nozzle" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "Start G-code" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "G-code-opdrachten die aan het begin worden uitgevoerd." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "Eind G-code" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "G-code-opdrachten die aan het eind worden uitgevoerd." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "Nozzle-instellingen" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Maat nozzle" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "De nominale diameter van het filament dat wordt ondersteund door de printer. De exacte diameter wordt overschreven door het materiaal en/of het profiel." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "Nozzle-offset X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Nozzle-offset Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Start-G-code van extruder" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Eind-G-code van extruder" @@ -1448,8 +1551,9 @@ msgstr "Wijzigingenlogboek" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1514,7 +1618,10 @@ 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 "Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n\nSelecteer uw printer in de onderstaande lijst:" +msgstr "" +"Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n" +"\n" +"Selecteer uw printer in de onderstaande lijst:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1530,7 +1637,7 @@ msgstr "Bewerken" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "Verwijderen" @@ -1552,14 +1659,14 @@ msgid "Type" msgstr "Type" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Extended" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1603,8 +1710,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "Voer het IP-adres of de hostnaam van de printer in het netwerk in." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1625,6 +1730,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 is niet ingesteld voor het hosten van een groep aangesloten Ultimaker 3-printers" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1655,11 +1765,16 @@ msgid "Available" msgstr "Beschikbaar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "Verbinding met de printer is verbroken" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1751,138 +1866,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "Configuratie Activeren" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Configuratie Cura SolidWorks-invoegtoepassing" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "Standaard kwaliteit van de geëxporteerde STL:" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "Altijd vragen" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "Altijd Fijne kwaliteit gebruiken" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "Altijd Grove kwaliteit gebruiken" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "SolidWorks-bestand importeren als STL..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "Kwaliteit van de geëxporteerde STL" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "Kwaliteit" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "Grof" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "Fijn" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "Mijn keuze onthouden" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "Opslaan" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "Kleurenschema" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "Materiaalkleur" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "Lijntype" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "Doorvoersnelheid" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "Laagdikte" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "Compatibiliteitsmodus" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "Bewegingen weergeven" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "Helpers weergeven" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "Shell weergeven" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "Vulling weergeven" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "Alleen bovenlagen weergegeven" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "5 gedetailleerde lagen bovenaan weergeven" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "Boven-/onderkant" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "Binnenwand" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "min." -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "max." @@ -1907,7 +2134,7 @@ msgctxt "@label" msgid "Settings" msgstr "Instellingen" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Actieve scripts voor nabewerking wijzigen" @@ -1982,23 +2209,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "Effenen" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "Instellingen selecteren" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "Instellingen Selecteren om Dit Model Aan te Passen" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "Filteren..." -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "Alles weergeven" @@ -2166,7 +2423,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Deze invoegtoepassing bevat een licentie.\nU moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\nGaat u akkoord met de onderstaande voorwaarden?" +msgstr "" +"Deze invoegtoepassing bevat een licentie.\n" +"U moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\n" +"Gaat u akkoord met de onderstaande voorwaarden?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2357,66 +2617,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "Alles is in orde! De controle is voltooid." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "Niet met een printer verbonden" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "Printer accepteert geen opdrachten" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "In onderhoud. Controleer de printer" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Printen..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Gepauzeerd" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Voorbereiden..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "Verwijder de print" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "Hervatten" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "Pauzeren" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "Printen Afbreken" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "Printen afbreken" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "Weet u zeker dat u het printen wilt afbreken?" @@ -2431,7 +2691,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "U hebt enkele profielinstellingen aangepast.\nWilt u deze instellingen behouden of verwijderen?" +msgstr "" +"U hebt enkele profielinstellingen aangepast.\n" +"Wilt u deze instellingen behouden of verwijderen?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2449,19 +2711,19 @@ msgid "Customized" msgstr "Aangepast" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "Altijd vragen" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "Verwijderen en nooit meer vragen" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "Behouden en nooit meer vragen" @@ -2496,72 +2758,72 @@ msgctxt "@label" msgid "Brand" msgstr "Merk" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "Type Materiaal" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "Kleur" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "Eigenschappen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "Dichtheid" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "Diameter" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "Kostprijs Filament" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "Gewicht filament" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "Lengte filament" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "Kostprijs per meter" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "Dit materiaal is gekoppeld aan %1 en deelt hiermee enkele eigenschappen." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "Materiaal ontkoppelen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "Beschrijving" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "Gegevens Hechting" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "Instellingen voor printen" @@ -2602,7 +2864,7 @@ msgid "Unit" msgstr "Eenheid" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "Algemeen" @@ -2617,230 +2879,255 @@ msgctxt "@label" msgid "Language:" msgstr "Taal:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "Valuta:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "Thema:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "U moet de toepassing opnieuw starten voordat deze wijzigingen van kracht worden." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "Automatisch slicen bij wijzigen van instellingen." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "Automatisch slicen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "Gedrag kijkvenster" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "Geef niet-ondersteunde gedeelten van het model een rode markering. Zonder ondersteuning zullen deze gedeelten niet goed worden geprint." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "Overhang weergeven" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "Verplaatst de camera zodanig dat wanneer een model wordt geselecteerd, het model in het midden van het beeld wordt weergegeven" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "Camera centreren wanneer een item wordt geselecteerd" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "Moet het standaard zoomgedrag van Cura worden omgekeerd?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "Keer de richting van de camerazoom om." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "Moet het zoomen in de richting van de muis gebeuren?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "Zoomen in de richting van de muis" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "Moeten modellen op het platform zodanig worden verplaatst dat ze elkaar niet meer doorsnijden?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "Modellen gescheiden houden" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "Moeten modellen in het printgebied omlaag worden gebracht zodat ze het platform raken?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "Modellen automatisch op het platform laten vallen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "Toon het waarschuwingsbericht in de G-code-lezer." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "Waarschuwingsbericht in de G-code-lezer" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "Moet de laag in de compatibiliteitsmodus worden geforceerd?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "Compatibiliteitsmodus voor laagweergave forceren (opnieuw opstarten vereist)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "Bestanden openen en opslaan" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "Moeten modellen worden geschaald naar het werkvolume als ze te groot zijn?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "Grote modellen schalen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "Een model wordt mogelijk extreem klein weergegeven als de eenheden bijvoorbeeld in meters zijn in plaats van in millimeters. Moeten dergelijke modellen worden opgeschaald?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "Extreem kleine modellen schalen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "Moet er automatisch een op de printernaam gebaseerde voorvoegsel aan de naam van de printtaak worden toegevoegd?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "Machinevoorvoegsel toevoegen aan taaknaam" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "Dient er een samenvatting te worden weergegeven wanneer een projectbestand wordt opgeslagen?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "Dialoogvenster voor samenvatting weergeven tijdens het opslaan van een project" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "Standaardgedrag tijdens het openen van een projectbestand" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "Standaardgedrag tijdens het openen van een projectbestand: " -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "Altijd vragen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "Altijd als project openen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "Altijd modellen importeren" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "Wanneer u wijzigingen hebt aangebracht aan een profiel en naar een ander profiel wisselt, wordt een dialoogvenster weergegeven waarin u wordt gevraagd of u de aanpassingen wilt behouden. U kunt ook een standaardgedrag kiezen en het dialoogvenster nooit meer laten weergeven." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "Profiel overschrijven" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "Privacy" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "Moet Cura op updates controleren wanneer het programma wordt gestart?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "Bij starten op updates controleren" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "Mogen anonieme gegevens over uw print naar Ultimaker worden verzonden? Opmerking: er worden geen modellen, IP-adressen of andere persoonlijk identificeerbare gegevens verzonden of opgeslagen." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "(Anonieme) printgegevens verzenden" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "Printers" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "Activeren" @@ -2883,7 +3170,7 @@ msgid "Waiting for a printjob" msgstr "Wachten op een printtaak" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "Profielen" @@ -2909,13 +3196,13 @@ msgid "Duplicate" msgstr "Dupliceren" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "Importeren" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "Exporteren" @@ -2981,7 +3268,7 @@ msgid "Export Profile" msgstr "Profiel exporteren" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "Materialen" @@ -2996,60 +3283,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "Printer: %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "Maken" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "Dupliceren" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "Materiaal Importeren" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr "Kon materiaal %1 niet importeren: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "Materiaal %1 is geïmporteerd" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "Materiaal Exporteren" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "Exporteren van materiaal naar %1 is mislukt: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "Materiaal is geëxporteerd naar %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "Printer Toevoegen" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "Printernaam:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "Printer Toevoegen" @@ -3074,7 +3361,9 @@ 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 is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\nCura maakt met trots gebruik van de volgende opensourceprojecten:" +msgstr "" +"Cura is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\n" +"Cura maakt met trots gebruik van de volgende opensourceprojecten:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3176,158 +3465,167 @@ msgctxt "@label" msgid "Profile:" msgstr "Profiel:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "Er is geen profiel beschikbaar" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 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 "Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n\nKlik om het profielbeheer te openen." +msgstr "" +"Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n" +"\n" +"Klik om het profielbeheer te openen." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "Zoeken..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Waarde naar alle extruders kopiëren" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Deze instelling verbergen" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Deze instelling verbergen" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Deze instelling zichtbaar houden" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Zichtbaarheid van instelling configureren..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n\nKlik om deze instellingen zichtbaar te maken." +msgstr "" +"Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n" +"\n" +"Klik om deze instellingen zichtbaar te maken." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "Beïnvloedt" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "Beïnvloed door" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "Deze instelling wordt altijd door alle extruders gedeeld. Als u hier de instelling wijzigt, wordt de waarde voor alle extruders gewijzigd" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "De waarde wordt afgeleid van de waarden per extruder " -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 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 "Deze instelling heeft een andere waarde dan in het profiel.\n\nKlik om de waarde van het profiel te herstellen." +msgstr "" +"Deze instelling heeft een andere waarde dan in het profiel.\n" +"\n" +"Klik om de waarde van het profiel te herstellen." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 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 "Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n\nKlik om de berekende waarde te herstellen." +msgstr "" +"Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n" +"\n" +"Klik om de berekende waarde te herstellen." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Instelling voor Printen" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Instelling voor printen uitgeschakeld\nG-code-bestanden kunnen niet worden aangepast" +msgstr "" +"Instelling voor printen uitgeschakeld\n" +"G-code-bestanden kunnen niet worden aangepast" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00u 00min" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "Tijdspecificatie
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "Kostenspecificatie" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1 m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1 g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "Totaal:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1 m / ~ %2 g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1 m / ~ %2 g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Aanbevolen instellingen voor printen

    Print met de aanbevolen instellingen voor de geselecteerde printer en kwaliteit, en het geselecteerde materiaal." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Aangepaste instellingen voor printen

    Print met uiterst precieze controle over elk detail van het slice-proces." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automatisch: %1" @@ -3337,6 +3635,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "Beel&d" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3349,14 +3657,14 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Geselecteerd model printen met:" msgstr[1] "Geselecteerde modellen printen met:" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Geselecteerd model verveelvoudigen" msgstr[1] "Geselecteerde modellen verveelvoudigen" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "Aantal exemplaren" @@ -3372,7 +3680,7 @@ msgid "No printer connected" msgstr "Er is geen printer aangesloten" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "Extruder" @@ -3482,254 +3790,294 @@ msgctxt "@label" msgid "Estimated time left" msgstr "Geschatte resterende tijd" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Vo&lledig Scherm In-/Uitschakelen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "Ongedaan &Maken" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Opnieuw" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Afsluiten" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "Camerapositie he&rstellen" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura Configureren..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Printer Toevoegen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Pr&inters Beheren..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Materialen Beheren..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "Profiel bijwerken met h&uidige instellingen/overschrijvingen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "Hui&dige wijzigingen verwijderen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "Profiel maken op basis van huidige instellingen/overs&chrijvingen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profielen Beheren..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Online &Documentatie Weergeven" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Een &Bug Rapporteren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&Over..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Ge&selecteerd model verwijderen" msgstr[1] "Ge&selecteerde modellen verwijderen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Geselecteerd model centreren" msgstr[1] "Geselecteerde modellen centreren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Geselecteerd model verveelvoudigen" msgstr[1] "Geselecteerde modellen verveelvoudigen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Model Verwijderen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Model op Platform Ce&ntreren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Modellen &Groeperen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Groeperen van Modellen Opheffen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Modellen Samen&voegen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Model verveelvoudigen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "Alle Modellen &Selecteren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Platform Leegmaken" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Alle Modellen Opnieuw &Laden" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Alle modellen schikken" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Selectie schikken" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Alle Modelposities Herstellen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Alle Model&transformaties Herstellen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "Bestand(en) &openen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nieuw project..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Engine-&logboek Weergeven..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Open Configuratiemap" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Zichtbaarheid Instelling Configureren..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "Door invoegtoepassingen bladeren..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "Geïnstalleerde plugins..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Laad een 3D-model" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Gereed om te slicen" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Slicen..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Gereed voor %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Kan Niet Slicen" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Slicen is niet beschikbaar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Voorbereiden" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Annuleren" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Actief Uitvoerapparaat Selecteren" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "Bestand(en) openen" @@ -3749,114 +4097,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Bestand" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&Selectie Opslaan naar Bestand" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Opslaan &als..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "Project opslaan" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "B&ewerken" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "Beel&d" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "In&stellingen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&Printer" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "&Materiaal" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profiel" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Instellen als Actieve Extruder" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "E&xtensies" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "&Plugins" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "Voo&rkeuren" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Help" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "Bestand Openen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "Instellingen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "Nieuw project" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "Weet u zeker dat u een nieuw project wilt starten? Hiermee wordt het platform leeggemaakt en worden eventuele niet-opgeslagen instellingen verwijderd." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "Invoegtoepassing installeren" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "Bestand(en) openen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "Binnen de door u geselecteerde bestanden zijn een of meer G-code-bestanden aangetroffen. U kunt maximaal één G-code-bestand tegelijk openen. Selecteer maximaal één bestand als u dit wilt openen als G-code-bestand." @@ -3881,97 +4229,82 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Bij opnieuw opslaan projectsamenvatting niet weergeven" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "Opslaan" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "Voorbereiden" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "Controleren" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "Laaghoogte" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "Er is momenteel een aangepast profiel actief. Als u de kwaliteitsschuifregelaar wilt gebruiken, kiest u een standaard kwaliteitsprofiel op het tabblad Aangepast" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "Printsnelheid" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "Langzamer" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "Sneller" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "U hebt enkele profielinstellingen aangepast. Ga naar de aangepaste modus als u deze wilt wijzigen." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "Vulling" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Met geleidelijke vulling neemt de hoeveelheid vulling naar boven toe." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "Geleidelijke vulling" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "Support genereren" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Genereer structuren om delen van het model met overhang te ondersteunen. Zonder deze structuren zakken dergelijke delen in tijdens het printen." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "Extruder voor supportstructuur" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "Selecteren welke extruder voor support wordt gebruikt. Deze optie zorgt ervoor dat onder het model ondersteuning wordt geprint, om te voorkomen dat dit doorzakt of dat er midden in de lucht moet worden geprint." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Hechting aan platform" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "Het printen van een brim of raft inschakelen. Deze optie zorgt ervoor dat er extra materiaal rondom of onder het object wordt neergelegd, dat er naderhand eenvoudig kan worden afgesneden." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Hebt u hulp nodig om betere prints te krijgen?
    Lees de Ultimaker Troubleshooting Guides (Handleiding voor probleemoplossing)" @@ -3988,17 +4321,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Projectbestand openen" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "Dit is een Cura-projectbestand. Wilt u dit openen als project of de modellen eruit importeren?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Mijn keuze onthouden" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "Openen als project" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "Modellen importeren" @@ -4008,21 +4346,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Engine-logboek" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "Materiaal" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "Compatibiliteit controleren" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Klik om de materiaalcompatibiliteit te controleren op Ultimaker.com." +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4113,6 +4466,26 @@ msgctxt "name" msgid "USB printing" msgstr "USB-printen" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4133,6 +4506,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3-netwerkverbinding" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4145,8 +4528,8 @@ msgstr "Firmware-updatecontrole" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "Hiermee hebt u de mogelijkheid bepaalde bestanden via SolidWorks te openen. De bestanden worden vervolgens geconverteerd en in Cura geladen" +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4213,6 +4596,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "Lezer voor Profielen van oudere Cura-versies" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4373,6 +4766,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Cura-profielschrijver" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4413,6 +4816,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura-profiellezer" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "Onbekend" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "Er zijn fouten opgetreden tijdens het openen van het SolidWorks-bestand. Controleer of u het bestand zonder problemen in SolidWorks kunt openen." + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "Er is een fout opgetreden tijdens het starten van %s!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "Simulatieweergave" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Cura verzamelt geanonimiseerde slicing-statistieken. Dit kan bij de voorkeuren worden uitgeschakeld." + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "Verwijderen" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "Algemeen" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    Er is een fatale uitzondering opgetreden. Stuur ons het Crashrapport om het probleem op te lossen

    \n" +#~ "

    Druk op de knop \"Rapport verzenden\" om het foutenrapport automatisch naar onze servers te verzenden

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Cura-versie: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "Platform: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Qt-versie: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "PyQt-versie: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "Traceback van uitzondering" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "Materiaaldiameter" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker 3 Extended" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Configuratie Cura SolidWorks-invoegtoepassing" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "Standaard kwaliteit van de geëxporteerde STL:" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "Altijd vragen" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "Altijd Fijne kwaliteit gebruiken" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "Altijd Grove kwaliteit gebruiken" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "SolidWorks-bestand importeren als STL..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "Kwaliteit van de geëxporteerde STL" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "Kwaliteit" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "Grof" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "Fijn" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "Er is geen profiel beschikbaar" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "Deze instelling wordt altijd door alle extruders gedeeld. Als u hier de instelling wijzigt, wordt de waarde voor alle extruders gewijzigd" + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "Tijdspecificatie
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "Camerapositie he&rstellen" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "Project opslaan" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "Voorbereiden" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "Controleren" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "Compatibiliteit controleren" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "Hiermee hebt u de mogelijkheid bepaalde bestanden via SolidWorks te openen. De bestanden worden vervolgens geconverteerd en in Cura geladen" + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "Geblokkeerd" @@ -4433,13 +4986,9 @@ msgstr "Cura-profiellezer" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Om ervoor te zorgen dat uw {machine_name} van de nieuwste functies is voorzien, wordt aanbevolen om de firmware regelmatig bij te werken. U kunt dit doen op de {machine_name} (wanneer deze is verbonden met het netwerk) of via USB." -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Laagweergave" - -msgctxt "@info:title" -msgid "Layer View" -msgstr "Laagweergave" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Laagweergave" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4541,9 +5090,9 @@ msgstr "Laagweergave" #~ msgid "Provides the Layer view." #~ msgstr "Biedt een laagweergave." -msgctxt "name" -msgid "Layer View" -msgstr "Laagweergave" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Laagweergave" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4883,9 +5432,9 @@ msgstr "Laagweergave" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Deze optie biedt ondersteuning voor het importeren van profielen uit G-code-bestanden." -msgctxt "@label" -msgid "Layer View" -msgstr "Laagweergave" +#~ msgctxt "@label" +#~ msgid "Layer View" +#~ msgstr "Laagweergave" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/nl_NL/fdmextruder.def.json.po b/resources/i18n/nl_NL/fdmextruder.def.json.po index 63bd64cd8c..31192bc8a0 100644 --- a/resources/i18n/nl_NL/fdmextruder.def.json.po +++ b/resources/i18n/nl_NL/fdmextruder.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" diff --git a/resources/i18n/nl_NL/fdmprinter.def.json.po b/resources/i18n/nl_NL/fdmprinter.def.json.po index 8d25da1379..eb846edf25 100644 --- a/resources/i18n/nl_NL/fdmprinter.def.json.po +++ b/resources/i18n/nl_NL/fdmprinter.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" @@ -345,6 +345,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -605,31 +615,6 @@ 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 "De hoogte van de eerste laag in mm. Met een dikkere eerste laag hecht het object beter aan het platform." -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "Slicetolerantie" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "Geeft aan hoe lagen met een diagonaal oppervlak worden geslicet. De gebieden van een laag kunnen worden gegenereerd op basis van de locatie waar het midden van de laag het oppervlak snijdt (Midden). Daarnaast kan elke laag gebieden hebben die over de gehele hoogte van de laag binnen het volume vallen (Exclusief), of kan een laag gebieden hebben die overal binnen de laag vallen (Inclusief). Met Exclusief worden de meeste details behouden, met Inclusief verkrijgt u de beste pasvorm en met Midden is de verwerkingstijd het kortst." - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "Midden" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "Exclusief" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "Inclusief" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -670,16 +655,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "Breedte van een enkele wandlijn voor alle wandlijnen, behalve de buitenste." -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "Lijnbreedte bovenskin" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "Breedte van een enkele lijn aan de bovenkant van de print." - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -860,41 +835,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "Het aantal bovenste skinlagen. Doorgaans is één bovenste skinlaag voldoende om oppervlakken van hogere kwaliteit te verkrijgen." -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "Patroon bovenskin" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "Het patroon van de bovenste lagen." - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "Lijnen" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "Concentrisch" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zigzag" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "Lijnrichting bovenskin" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "Een lijst met gehele getallen voor lijnrichtingen die moet worden gebruikt wanneer voor de bovenste skinlagen een lijn- of zigzagpatroon wordt gebruikt. Elementen uit de lijst worden tijdens het printen van de lagen opeenvolgend gebruikt. Wanneer het einde van de lijst is bereikt, wordt deze weer van voren af aan gestart. De lijstitems zijn gescheiden door komma's en de hele lijst is binnen vierkante haken geplaatst. Standaard wordt een lege lijst gebruikt, wat inhoudt dat de traditionele standaardhoeken (45 en 135 graden) worden gebruikt." - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1025,6 +965,16 @@ 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 "Uitsparing die wordt toegepast in de buitenwand. Als de buitenwand smaller is dan de nozzle en na de binnenwand wordt geprint, gebruikt u deze offset om het gat in de nozzle te laten overlappen met de binnenwanden in plaats van met de buitenkant van het model." +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "Printvolgorde van wanden optimaliseren" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "Optimaliseer de volgorde waarin wanden worden geprint om het aantal intrekbewegingen en de afgelegde afstand te verkleinen. Deze instelling is gunstig voor de meeste onderdelen. Bij sommige onderdelen duurt het printen echter langer. Controleer daarom de verwachte printtijd met en zonder optimalisatie." + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1095,6 +1045,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "Overal" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1477,8 +1437,8 @@ msgstr "Vulling X-offset" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "Het vulpatroon wordt over deze afstand verplaatst over de X-as." +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1487,8 +1447,8 @@ msgstr "Vulling Y-offset" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "Het vulpatroon wordt over deze afstand verplaatst over de Y-as." +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1507,8 +1467,8 @@ msgstr "Overlappercentage vulling" #: 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 "De mate van overlap tussen de vulling en de wanden. Met een lichte overlap kunnen de wanden goed hechten aan de vulling." +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1527,8 +1487,8 @@ msgstr "Overlappercentage Skin" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "De mate van overlap tussen de skin en de wanden als percentage van de lijnbreedte. Met een lichte overlap kunnen de wanden goed hechten aan de skin. Dit is een percentage van de gemiddelde lijnbreedte van de skinlijnen en de binnenste wand." +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1690,16 +1650,6 @@ msgctxt "material description" msgid "Material" msgstr "Materiaal" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -msgstr "Automatische Temperatuurinstelling" - -#: 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 "Pas de temperatuur voor elke laag automatisch aan aan de gemiddelde doorvoersnelheid van de laag." - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1750,16 +1700,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "De temperatuur waarnaar alvast kan worden afgekoeld net voordat het printen wordt beëindigd." -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "Grafiek Doorvoertemperatuur" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "Grafiek om de materiaaldoorvoer (in mm3 per seconde) te koppelen aan de temperatuur (graden Celsius)." - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1777,8 +1717,8 @@ msgstr "Platformtemperatuur" #: 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 "De temperatuur van het verwarmde platform. Als deze waarde ingesteld is op 0, wordt het bed voor deze print niet verwarmd." +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3450,6 +3390,16 @@ 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 "De hoek van een dak van een pijler. Een hogere waarde zorgt voor een spits pijlerdak, een lagere waarde zorgt voor een plat pijlerdak." +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "Supportraster verlagen" + +#: 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 "Maak overal onder het supportraster support zodat er in het supportraster geen overhang is." + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -3550,7 +3500,9 @@ 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 "De horizontale afstand tussen de skirt en de eerste laag van de print.\nDit is de minimumafstand. Als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint." +msgstr "" +"De horizontale afstand tussen de skirt en de eerste laag van de print.\n" +"Dit is de minimumafstand. Als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4082,16 +4034,6 @@ 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 "Normaal probeert Cura kleine gaten in het raster te hechten en delen van een laag met grote gaten te verwijderen. Als u deze optie inschakelt, behoudt u deze delen die niet kunnen worden gehecht. Deze optie kan als laatste redmiddel worden gebruikt als er geen andere manier meer is om correcte G-code te genereren." -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "Maximale resolutie" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "Het minimale formaat van een lijnsegment na het slicen. Als u deze waarde verhoogt, wordt het model met een lagere resolutie geprint. Hiermee kan de printer de verwerkingssnelheid van de G-code bijhouden en wordt de slicesnelheid verhoogd doordat details van het raster worden verwijderd die niet kunnen worden verwerkt." - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4242,16 +4184,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "Gebruik dit raster om steunvlakken op te geven. Deze functie kan worden gebruikt om supportstructuur te genereren." -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -msgstr "Supportraster verlagen" - -#: 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 "Maak overal onder het supportraster support zodat er in het supportraster geen overhang is." - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4328,14 +4260,194 @@ msgid "experimental!" msgstr "experimenteel!" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "Printvolgorde van wanden optimaliseren" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "Optimaliseer de volgorde waarin wanden worden geprint om het aantal intrekbewegingen en de afgelegde afstand te verkleinen. Deze instelling is gunstig voor de meeste onderdelen. Bij sommige onderdelen duurt het printen echter langer. Controleer daarom de verwachte printtijd met en zonder optimalisatie." +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "Slicetolerantie" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "Geeft aan hoe lagen met een diagonaal oppervlak worden geslicet. De gebieden van een laag kunnen worden gegenereerd op basis van de locatie waar het midden van de laag het oppervlak snijdt (Midden). Daarnaast kan elke laag gebieden hebben die over de gehele hoogte van de laag binnen het volume vallen (Exclusief), of kan een laag gebieden hebben die overal binnen de laag vallen (Inclusief). Met Exclusief worden de meeste details behouden, met Inclusief verkrijgt u de beste pasvorm en met Midden is de verwerkingstijd het kortst." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "Midden" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "Exclusief" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "Inclusief" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "Lijnbreedte bovenskin" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "Breedte van een enkele lijn aan de bovenkant van de print." + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "Patroon bovenskin" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "Het patroon van de bovenste lagen." + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "Lijnen" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "Concentrisch" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zigzag" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "Lijnrichting bovenskin" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "Een lijst met gehele getallen voor lijnrichtingen die moet worden gebruikt wanneer voor de bovenste skinlagen een lijn- of zigzagpatroon wordt gebruikt. Elementen uit de lijst worden tijdens het printen van de lagen opeenvolgend gebruikt. Wanneer het einde van de lijst is bereikt, wordt deze weer van voren af aan gestart. De lijstitems zijn gescheiden door komma's en de hele lijst is binnen vierkante haken geplaatst. Standaard wordt een lege lijst gebruikt, wat inhoudt dat de traditionele standaardhoeken (45 en 135 graden) worden gebruikt." + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Automatische Temperatuurinstelling" + +#: 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 "Pas de temperatuur voor elke laag automatisch aan aan de gemiddelde doorvoersnelheid van de laag." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "Grafiek Doorvoertemperatuur" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "Grafiek om de materiaaldoorvoer (in mm3 per seconde) te koppelen aan de temperatuur (graden Celsius)." + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "Maximale resolutie" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "Het minimale formaat van een lijnsegment na het slicen. Als u deze waarde verhoogt, wordt het model met een lagere resolutie geprint. Hiermee kan de printer de verwerkingssnelheid van de G-code bijhouden en wordt de slicesnelheid verhoogd doordat details van het raster worden verwijderd die niet kunnen worden verwerkt." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4827,7 +4939,9 @@ 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 "De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\nHierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten." +msgstr "" +"De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\n" +"Hierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4934,6 +5048,46 @@ 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 "De afstand tussen de nozzle en horizontaal neergaande lijnen. Een grotere tussenruimte zorgt voor diagonaal neerwaarts gaande lijnen met een minder steile hoek. Hierdoor ontstaan minder opwaartse verbindingen met de volgende laag. Alleen van toepassing op Draadprinten." +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4994,6 +5148,26 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Omzettingsmatrix die moet worden toegepast op het model wanneer dit wordt geladen vanuit een bestand." +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "Het vulpatroon wordt over deze afstand verplaatst over de X-as." + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "Het vulpatroon wordt over deze afstand verplaatst over de Y-as." + +#~ 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 "De mate van overlap tussen de vulling en de wanden. Met een lichte overlap kunnen de wanden goed hechten aan de vulling." + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "De mate van overlap tussen de skin en de wanden als percentage van de lijnbreedte. Met een lichte overlap kunnen de wanden goed hechten aan de skin. Dit is een percentage van de gemiddelde lijnbreedte van de skinlijnen en de binnenste wand." + +#~ 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 "De temperatuur van het verwarmde platform. Als deze waarde ingesteld is op 0, wordt het bed voor deze print niet verwarmd." + #~ msgctxt "wall_x_extruder_nr label" #~ msgid "Inner Walls Extruder" #~ msgstr "Extruder binnenwand" diff --git a/resources/i18n/pl_PL/cura.po b/resources/i18n/pl_PL/cura.po index 19b4c72931..7cf338b1e7 100644 --- a/resources/i18n/pl_PL/cura.po +++ b/resources/i18n/pl_PL/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-22 16:19+0100\n" "Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" "Language-Team: reprapy.pl\n" @@ -18,7 +18,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.0.4\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "Ustawienia drukarki" @@ -55,12 +55,11 @@ msgstr "Łączenie z Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -100,7 +99,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Otwórz interfejs Doodle3D Connect" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Pokaż Dziennik" @@ -115,78 +114,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "Profil został spłaszczony i aktywowany." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "Drukowanie USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "Drukuj przez USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "Drukuj przez USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "Połączono przez USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 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:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "Drukarka Niedostępna" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 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ż korzysta z UltiGCode." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "Drukowanie przez USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 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 poprzez USB." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "Ostrzeżenie" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 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:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, 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/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "Oprogramowanie Drukarki" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -230,11 +234,11 @@ 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:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "Błąd" @@ -284,7 +288,7 @@ msgid "Removable Drive" msgstr "Dysk wymienny" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Drukuj przez sieć" @@ -398,110 +402,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "Status Drukarki" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, 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. Brak Printcore w slocie {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, 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. Brak materiału w slocie {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Nie ma wystarczającej ilości materiału na szpuli {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Różne PrintCore (Cura: {0}, Drukarka: {1}) wybrane dla ekstrudera {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, 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:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "PrintCore {0} nie jest poprawnie skalibrowany. Kalibracja XY musi zostać wykonana na tej drukarce." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 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:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 Curą. Aby uzyskać najlepszy rezultat, zawsze tnij dla Print core'ów i materiałów włożonych do drukarki." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Niedopasowana konfiguracja" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "Wysyłanie nowych zadań (tymczasowo) zostało zablokowane, dalej wysyłane jest poprzednie zadanie." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Wysyłanie danych do drukarki" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "Wysyłanie danych" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 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:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Przerywanie drukowania..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Wydruk został przerwany. Sprawdź drukarkę" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Wstrzymywanie drukowania..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Wznawianie drukowania ..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Synchronizuj się z drukarką" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 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:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "PrintCore'y i/lub materiały w drukarce różnią się od tych w obecnym projekcie. Dla najlepszego rezultatu, zawsze tnij dla wybranych PrinCore'ów i materiałów, które są umieszczone w drukarce." @@ -522,145 +526,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "{printer_name} skończyła drukowanie '{job_name}'. Proszę zabrać wydruk i potwierdzić oczyszczenie platformy roboczej." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} jest zarezerwowana do druku '{job_name}'. Proszę zmień konfigurację drukarki, żeby pasowała do zadania dla niej, aby rozpocząć drukowanie." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Nie można wysłać nowego zadania: ta drukarka 3D nie jest (jeszcze) ustawiona jako gospodarz grupy podłączonych drukarek Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Nie można wysłać zadania do grupy {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "Wysłano {file_name} do grupy {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "Pokaż zadania druku" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "Otwiera interfejs zadań druku w przeglądarce." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "Nieznany" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "{printer_name} skończyła drukowanie '{job_name}'." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "Drukowanie zakończone" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "Konieczne są działania" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "Wysyłanie {file_name} do grupy {cluster_name}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "Połącz przez sieć" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "Nowe funkcje są dostępne dla twojej {machine_name}! Rekomendowane jest zaktualizowanie oprogramowania drukarki." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Nowe oprogramowanie %s jest dostępne" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "Jak zaktualizować" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "Nie można uzyskać dostępu do informacji o aktualizacji" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "Wystąpił błąd podczas otwierania pliku SolidWorks! Proszę sprawdź, czy możesz otworzyć plik SolidWorks bez żadnych problemów!" +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "Plik części SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "Plik złożenia SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "Konfiguruj" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "Błąd podczas rozpoczynania %s!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "Widok symulacji" +msgid "Layer view" +msgstr "Widok warstwy" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "Cura nie wyświetla dokładnie warstw kiedy drukowanie przewodowe jest włączone" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "Widok symulacji" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "Modyfikuj G-Code" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "Cura zbiera anonimowe statystyki cięcia. Możesz wyłączyć to w ustawieniach." +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -669,14 +716,41 @@ msgstr "Zbieranie Danych" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "Anuluj" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Profile Cura 15.04 " +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -708,49 +782,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "Obraz GIF" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "Nie można pociąć z obecnym materiałem, ponieważ nie jest on kompatybilny z wybraną maszyną lub konfiguracją." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "Nie można pociąć" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Nie można pociąć z bieżącymi ustawieniami. Następujące ustawienia mają błędy: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "Nie można pokroić przez ustawienia osobne dla modelu. Następujące ustawienia mają błędy w jednym lub więcej modeli: {error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Nie można pociąć, ponieważ wieża czyszcząca lub jej pozycja(e) są niewłaściwe." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 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 do pocięcia, ponieważ żaden z modeli nie pasuje do obszaru roboczego. Proszę o przeskalowanie lub obrócenie modelu, żeby pasował." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "Przetwarzanie warstw" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "Informacja" @@ -787,14 +861,14 @@ msgstr "Nie udało się skopiować plików pluginu Siemens NX. Proszę sprawdź msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Nie udało się zainstalować pluginu Siemens NX. Nie można ustawić zmiennej środowiskowej UGII_USER_DIR dla Siemens NX." -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "Zalecane" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "Niestandardowe" @@ -805,24 +879,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "Plik 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "Dysza" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Nie udało się uzyskać ID wtyczki z {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "Ostrzeżenie" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "Przeglądarka wtyczek" @@ -837,18 +911,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Plik G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "Analizowanie G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "Szczegóły G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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-code jest odpowiedni do konfiguracji drukarki. Przedstawienie G-kodu może nie być dokładne." @@ -859,6 +933,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Profile Cura" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -890,142 +974,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "Wypoziomuj stół" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Zewnętrzna ściana" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Ściany wewnętrzne" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "Skin" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "Wypełnienie" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "Wypełnienie podpór" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "Łączenie podpory" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "Podpory " -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "Obwódka" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "Ruch jałowy" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "Retrakcja" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "Inny" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "Nieznany" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Plik pocięty wcześniej {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "Nie załadowano materiału" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 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:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "Szukanie Lokalizacji" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 obszaru roboczego dla wszystkich obiektów" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "Nie można Znaleźć Lokalizacji" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "Plik już istnieje" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" 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:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "Niestandardowy" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "Niestandardowy materiał" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "Globalny" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "Nie zastąpione" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 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/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1046,67 +1104,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Cofnij zmianę średnicy materiału." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Nie udało się wyeksportować profilu do {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Nie można eksportować profilu do {0}: Wtyczka pisarza zgłosiła błąd." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Wyeksportowano profil do {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "Eksport udany" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Nie udało się zaimportować profilu z {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Profil zaimportowany {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, 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:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "Niestandardowy profil" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Profilowi brakuje typu jakości." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, 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/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1117,145 +1197,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "Obszar Roboczy" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Zwielokrotnienie i umieszczanie przedmiotów" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "Rozmieszczenie Obiektów" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +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 obszaru roboczego dla wszystkich obiektów" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "Znajdowanie nowej lokalizacji obiektów" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "Szukanie Lokalizacji" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "Nie można Znaleźć Lokalizacji" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "Raport awarii" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " msgstr "" -"

    Wystąpił fatalny błąd. Proszę wyślij do nas ten Raport Błędu, abyśmy mogli naprawić błąd

    \n" -"

    Proszę użyj przycisku \"Wyślij raport\", aby wysłać raport błędu automatycznie na nasze serwery.

    \n" -" " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "Informacje o systemie" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "Nieznany" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Wersja Cura: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "Platforma: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Wersja Qt: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "Wersja PyQt: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • Wersja OpenGL: {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • Wydawca OpenGL: {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • OpenGL Renderer: {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "Śledzenie błędów" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "Logi" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "Opis użytkownika" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "Wyślij raport" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Ładowanie drukarek..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Ustawianie sceny ..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Ładowanie interfejsu ..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, 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 G-code. Pominięto importowanie {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, 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ę G-code. Pominięto importowanie {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "Wybrany model był zbyta mały do załadowania." @@ -1284,12 +1386,11 @@ msgstr "X (Szerokość)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1379,68 +1480,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "Różnica w wysokości pomiędzy końcówką dyszy i systemem suwnym (osie X i Y). Używane do unikania kolizji z poprzednimi wydrukami podczas drukowania \"Jeden na Raz\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "Liczba ekstruderów" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "Nominalna średnica filamentu wspierana przez drukarkę. Dokładna średnica będzie nadpisana przez materiał i/lub profil." - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "Średnica materiału" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "Rozmiar dyszy" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "Początk. Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Komendy Gcode wykonywane na samym początku." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "Końcowy Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Komendy Gcode wykonywane na samym początku." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "Ustawienia dyszy" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Rozmiar dyszy" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "Nominalna średnica filamentu wspierana przez drukarkę. Dokładna średnica będzie nadpisana przez materiał i/lub profil." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "Korekcja dyszy X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Korekcja dyszy Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Początkowy Gcode ekstrudera" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Końcowy Gcode ekstrudera" @@ -1453,8 +1553,9 @@ msgstr "Dziennik" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1538,7 +1639,7 @@ 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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "Usunąć" @@ -1560,14 +1661,14 @@ msgid "Type" msgstr "Rodzaj" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Extended" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1611,8 +1712,6 @@ 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:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1633,6 +1732,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 nie została ustawiona do hostowania grupy podłączonych drukarek Ultimaker 3" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1663,11 +1767,16 @@ msgid "Available" msgstr "Dostępna" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "Utracone połączenie z drukarką" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1759,138 +1868,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "Uaktywnij konfigurację" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Konfiguracja Wtyczki Cura SolidWorks" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "Domyślna jakość eksportowanego STL:" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "Zawsze pytaj" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "Zawsze używaj Dobrej jakości" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "Zawsze używaj Słabej jakości" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "Importuj Plik SolidWorks jako STL..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "Jakość Eksportowanego STL" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "Jakość" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "Słaba" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "Dobra" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "Zapamiętaj mój wybór" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "Zapisz" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "Schemat kolorów" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "Kolor materiału" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "Rodzaj linii" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "Szybkość Posuwu" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "Grubość warstwy" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "Tryb zgodności" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "Pokaż ruch jałowy" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "Pokaż pomocnik" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "Pokaż powłokę" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "Pokaż wypełnienie" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "Pokaż tylko najwyższe warstwy" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "Pokaż 5 Szczegółowych Warstw" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "Góra/ Dół" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "Wewnętrzna ściana" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "min" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "max" @@ -1915,7 +2136,7 @@ msgctxt "@label" msgid "Settings" msgstr "Ustawienia" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Zmień aktywne skrypty post-processingu" @@ -1990,23 +2211,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "Wygładzanie" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "Wybierz ustawienia" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 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:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /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:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "Pokaż wszystko" @@ -2368,66 +2619,66 @@ 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:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "Nie podłączono do drukarki" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "Drukarka nie akceptuje poleceń" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "W naprawie. Sprawdź drukarkę" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Drukowanie..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Wstrzymano" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Przygotowywanie ..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "Usuń wydruk" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "Wznów" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "Wstrzymaj" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "Przerwij wydruk" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "Przerwij wydruk" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "Czy na pewno chcesz przerwać drukowanie?" @@ -2462,19 +2713,19 @@ msgid "Customized" msgstr "Dostosowane" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "Zawsze pytaj o to" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 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:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "Zachowaj i nigdy nie pytaj" @@ -2509,72 +2760,72 @@ msgctxt "@label" msgid "Brand" msgstr "Marka" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "Typ Materiału" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "Kolor" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "Właściwości" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "Gęstość" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "Średnica" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "Koszt Filamentu" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "Waga filamentu" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "Długość Filamentu" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "Koszt na metr" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 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ę niekórymi swoimi właściwościami." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "Odłącz materiał" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "Opis" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "Informacje dotyczące przyczepności" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "Ustawienia druku" @@ -2615,7 +2866,7 @@ msgid "Unit" msgstr "Jednostka" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "Ogólny" @@ -2630,230 +2881,255 @@ msgctxt "@label" msgid "Language:" msgstr "Język:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "Waluta:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "Motyw:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 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:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "Tnij automatycznie podczas zmiany ustawień." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "Automatyczne Cięcie" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "Zachowanie okna edycji" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 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:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "Wyświetl zwis" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 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:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "Wyśrodkuj kamerę kiedy przedmiot jest zaznaczony" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "Czy domyślne zachowanie zoomu powinno zostać odwrócone?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "Odwróć kierunek zoomu kamery." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "Czy przybliżanie powinno poruszać się w kierunku myszy?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "Przybliżaj w kierunku myszy" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 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:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 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:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" 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:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "Automatycznie upuść modele na stół roboczy" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "Pokaż komunikat ostrzegawczy w tekście G-code." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "Komunikat ostrzegawczy w tekście G-code" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 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:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "Wymuszenie widoku warstw w trybie zgodności (wymaga ponownego uruchomienia)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "Otwieranie i zapisywanie plików" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" 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:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "Skaluj duże modele" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 takie modele powinny być skalowane?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "Skaluj bardzo małe modele" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 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 powinien być automatycznie dodawany do nazwy zadania?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 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:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "Czy podsumowanie powinno być wyświetlane podczas zapisu projektu?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "Pokaż okno podsumowania podczas zapisywaniu projektu" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 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:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 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:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "Zawsze pytaj" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "Zawsze otwieraj jako projekt" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "Zawsze importuj modele" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "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:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "Nadpisz profil" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "Prywatność" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "Czy Cura ma sprawdzać dostępność aktualizacji podczas uruchamiania programu?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "Sprawdź, dostępność aktualizacji podczas uruchamiania" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 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:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "Wyślij (anonimowe) informacje o drukowaniu" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "Aktywuj" @@ -2896,7 +3172,7 @@ 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:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "Profile" @@ -2922,13 +3198,13 @@ msgid "Duplicate" msgstr "Duplikuj" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "Importuj" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "Eksportuj" @@ -2994,7 +3270,7 @@ msgid "Export Profile" msgstr "Eksportuj Profil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "Materiał" @@ -3009,60 +3285,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "Drukarka: %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "Stwórz" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "Duplikuj" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "Importuj Materiał" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" 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:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "Udało się zaimportować materiał %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "Eksportuj Materiał" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "Nie udało się wyeksportować materiału do %1: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" 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:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "Dodaj drukarkę" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "Nazwa drukarki:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "Dodaj drukarkę" @@ -3191,12 +3467,7 @@ msgctxt "@label" msgid "Profile:" msgstr "Profil:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "Brak Dostępnego Profilu" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" @@ -3207,37 +3478,37 @@ msgstr "" "\n" "Kliknij, aby otworzyć menedżer profili." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "Szukanie..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Skopiuj wartość do wszystkich ekstruderów" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Ukryj tę opcję" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Nie pokazuj tej opcji" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Pozostaw tę opcję widoczną" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Skonfiguruj widoczność ustawień..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" @@ -3248,27 +3519,27 @@ msgstr "" "\n" "Kliknij, aby te ustawienia były widoczne." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "Wpływać" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "Pod wpływem" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 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 ekstrudery. Zmiana jego wartości tutaj spowoduje zmianę dla wszystkich ekstruderów" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "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:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 msgctxt "@label" msgid "" "This setting has a value that is different from the profile.\n" @@ -3279,7 +3550,7 @@ msgstr "" "\n" "Kliknij, aby przywrócić wartość z profilu." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" @@ -3290,12 +3561,12 @@ msgstr "" "\n" "Kliknij, aby przywrócić wartość obliczoną." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Ustawienia druku" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" @@ -3304,59 +3575,59 @@ msgstr "" "Konfiguracja wydruku jest wyłączona\n" "Pliki G-code nie mogą zostać zmodyfikowane" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00godz. 00min." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "Szacowany czas
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "Szacowanie kosztów" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "Razem:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 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:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 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 elementem procesu cięcia." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automatyczny: %1" @@ -3366,6 +3637,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Widok" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3378,14 +3659,14 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Wydrukuj wybrany model z:" msgstr[1] "Wydrukuj wybrane modele z:" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Zduplikuj wybrany model" msgstr[1] "Zduplikuj wybrane modele" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "Liczba kopii" @@ -3401,7 +3682,7 @@ msgid "No printer connected" msgstr "Nie podłączono drukarki" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "Ekstruder" @@ -3511,254 +3792,294 @@ msgctxt "@label" msgid "Estimated time left" msgstr "Szacowany czas pozostały" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Przełącz tryb pełnoekranowy" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Cofnij" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Ponów" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Zamknij" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "&Zresetuj pozycję kamery" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Konfiguruj Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Dodaj drukarkę..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Zarządzaj drukarkami..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Zarządzaj materiałami..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Aktualizuj profil z bieżącymi ustawieniami" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Odrzuć bieżące zmiany" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Utwórz profil z bieżących ustawień..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Zarządzaj profilami..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Pokaż dokumentację internetową" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Zgłoś błąd" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&O..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Usuń &wybrany model" msgstr[1] "Usuń &wybrane modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Wyśrodkuj wybrany model" msgstr[1] "Wyśrodkuj wybrane modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Rozmnóż wybrany model" msgstr[1] "Rozmnóż wybrane modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Usuń model" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Wyśrodkuj model na platformie" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Grupuj modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Rozgrupuj modele " -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Połącz modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Powiel model..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Wybierz wszystkie modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Wyczyść stół" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Przeładuj wszystkie modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Ułóż wszystkie modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Wybór ułożenia" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Zresetuj wszystkie pozycje modelu" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Zresetuj wszystkie przekształcenia modelu" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Otwórz plik(i)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nowy projekt..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Pokaż &dziennik silnika..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Pokaż folder konfiguracji" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Skonfiguruj widoczność ustawień ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "Przeglądaj wtyczki..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "Zainstalowane wtyczki..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Proszę załaduj model 3D" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Gotowy do cięcia" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Cięcie..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Gotowy do %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Nie można pociąć" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Cięcie niedostępne" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Przygotuj" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Anuluj" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 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:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "Otwórz plik(i)" @@ -3778,114 +4099,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Cura Ultimaker" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Plik" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&Zapisz wybór w pliku" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Zapisz &jako..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "Zapisz projekt" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Edytuj" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "&Widok" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "&Ustawienia" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&Drukarka" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "&Materiał" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Ustaw jako aktywną głowicę" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "&Rozszerzenia" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "W&tyczki" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "Preferencje" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Pomoc" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "Otwórz plik" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "Ustawienia" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "Nowy projekt" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "Zainstaluj Wtyczkę" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "Otwórz plik(i)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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-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." @@ -3910,97 +4231,82 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Nie pokazuj podsumowania projektu podczas ponownego zapisywania" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "Zapisz" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "Przygotuj" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "Monitor" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "Wysokość warstwy" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "Niestandardowy profil jest obecnie aktywny. Aby włączyć pasek jakości, wybierz domyślny profil w zakładce Niestandardowe" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "Prędkość Druku" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "Wolniej" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "Szybciej" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "Zmodyfikowałeś ustawienia profilu. Jeżeli chcesz je zmienić, przejdź do trybu niestandardowego." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "Wypełnienie" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 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:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "Włącz stopniowane" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "Generuj podpory" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." 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:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "Ekstruder od podpór" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "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:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Popraw przycz. modelu" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 usunięcia po wydruku." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Potrzebujesz pomocy w ulepszaniu wydruków?
    Przeczytaj instrukcje dotyczące rozwiązywania problemów" @@ -4017,17 +4323,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Otwórz plik projektu" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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, czy zaimportować z niego modele?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Zapamiętaj mój wybór" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "Otwórz jako projekt" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "Importuj modele" @@ -4037,21 +4348,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Dziennik silnika" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "Materiał" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "Sprawdź kompatybilność" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Kliknij, aby sprawdzić zgodność materiału na Ultimaker.com." +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4142,6 +4468,26 @@ msgctxt "name" msgid "USB printing" msgstr "Drukowanie USB" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4162,6 +4508,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Połączenie Sieciowe UM3" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4174,8 +4530,8 @@ msgstr "Sprawdzacz Aktualizacji Oprogramowania" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "Daje tobie możliwość otwierania plików poprzez SolidWorks. Pliki są potem konwertowane i ładowane do Cura" +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4242,6 +4598,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "Czytnik Profili Starszej Cura" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4402,6 +4768,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Cura Profile Writer" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4442,6 +4818,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Czytnik Profili Cura" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "Nieznany" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "Wystąpił błąd podczas otwierania pliku SolidWorks! Proszę sprawdź, czy możesz otworzyć plik SolidWorks bez żadnych problemów!" + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "Błąd podczas rozpoczynania %s!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "Widok symulacji" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Cura zbiera anonimowe statystyki cięcia. Możesz wyłączyć to w ustawieniach." + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "Anuluj" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "Globalny" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    Wystąpił fatalny błąd. Proszę wyślij do nas ten Raport Błędu, abyśmy mogli naprawić błąd

    \n" +#~ "

    Proszę użyj przycisku \"Wyślij raport\", aby wysłać raport błędu automatycznie na nasze serwery.

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Wersja Cura: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "Platforma: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Wersja Qt: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "Wersja PyQt: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "Śledzenie błędów" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "Średnica materiału" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker 3 Extended" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Konfiguracja Wtyczki Cura SolidWorks" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "Domyślna jakość eksportowanego STL:" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "Zawsze pytaj" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "Zawsze używaj Dobrej jakości" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "Zawsze używaj Słabej jakości" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "Importuj Plik SolidWorks jako STL..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "Jakość Eksportowanego STL" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "Jakość" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "Słaba" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "Dobra" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "Brak Dostępnego Profilu" + +#~ 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 ekstrudery. Zmiana jego wartości tutaj spowoduje zmianę dla wszystkich ekstruderów" + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "Szacowany czas
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "&Zresetuj pozycję kamery" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "Zapisz projekt" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "Przygotuj" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "Monitor" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "Sprawdź kompatybilność" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "Daje tobie możliwość otwierania plików poprzez SolidWorks. Pliki są potem konwertowane i ładowane do Cura" + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "Zablokowany" @@ -4462,13 +4988,9 @@ msgstr "Czytnik Profili Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Aby upewnić się że twoja {machine_name} jest wyposażona w najnowsze opcje rekomendowane jest aktualizowanie oprogramowania regularnie. Może to być wykonane na {machine_name} (kiedy jest podłączona do sieci) lub przez USB." -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Widok warstwy" - -msgctxt "@info:title" -msgid "Layer View" -msgstr "Widok warstwy" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Widok warstwy" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4570,9 +5092,9 @@ msgstr "Widok warstwy" #~ msgid "Provides the Layer view." #~ msgstr "Zapewnia widok warstw." -msgctxt "name" -msgid "Layer View" -msgstr "Widok Warstw" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Widok Warstw" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4893,9 +5415,9 @@ msgstr "Widok Warstw" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Zapewnia obsługę importowania profili z plików g-code." -msgctxt "@label" -msgid "Layer View" -msgstr "Widok warstwy" +#~ msgctxt "@label" +#~ msgid "Layer View" +#~ msgstr "Widok warstwy" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/pl_PL/fdmextruder.def.json.po b/resources/i18n/pl_PL/fdmextruder.def.json.po index 8e7a8c2084..3bed2b64ff 100644 --- a/resources/i18n/pl_PL/fdmextruder.def.json.po +++ b/resources/i18n/pl_PL/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-22 15:00+0100\n" "Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" "Language-Team: reprapy.pl\n" diff --git a/resources/i18n/pl_PL/fdmprinter.def.json.po b/resources/i18n/pl_PL/fdmprinter.def.json.po index 4803933a28..5d886b3789 100644 --- a/resources/i18n/pl_PL/fdmprinter.def.json.po +++ b/resources/i18n/pl_PL/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-22 19:41+0100\n" "Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" "Language-Team: reprapy.pl\n" @@ -350,6 +350,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -610,31 +620,6 @@ 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 początkowa warstwa powoduje lepszą przyczepność do stołu." -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "Tolerancja Cięcia" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "Jak ciąć warstwy z ukośnymi powierzchniami. Obszary warstwy mogą być generowane na podstawie miejsca gdzie środek warstwy przecina się z powierzchnią (Środek). Alternatywnie każda warstwa może mieć obszary, które wpadają do środka objętości poprzez wysokość warstwy (Wyłączne) lub warstwa ma obszary, które wpadają do środka w każdym miejscu na warstwie (Włącznie). Wyłącznie zatrzymuje najwięcej detali, Włącznie powoduje najlepsze dopasowanie, a Środek wymaga najmniej czasu do przetworzenia." - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "Środek" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "Wyłącznie" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "Włącznie" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -675,16 +660,6 @@ 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." -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "Szerokość Linii Powierzchni Skóry" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "Szerokość pojedynczej linii na obszarach na górze wydruku." - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -865,41 +840,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "Liczba warstw górnej skóry. Zazwyczaj tylko jedna górna warstwa poprawia jakość górnych powierzchni." -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "Wzór Górnej Pow. Skóry" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "Wzór najwyższych warstw." - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "Linie" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "Koncentryczny" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zygzak" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "Kierunki Linii Górnej Pow. Skóry" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "Lista całkowitych kierunków linii używana kiedy skóra górnej powierzchni używa wzoru linii lub zygzaka. Elementy z listy są używane po kolei na każdej warstwie, a kiedy lista się skończy, zaczyna się od nowa. Elementy listy są oddzielone przecinkami, a cała lista zawarta jest w nawiasach kwadratowych. Domyślnie lista jest pusta co oznacza używanie tradycyjnych, domyślnych kątów (45 i 135 stopni)." - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1030,6 +970,16 @@ 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 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." +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "Optymalizuj Kolejność Drukowania Ścian" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "Optymalizuj kolejność, według której drukowane są ściany, aby zredukować ilość retrakcji i długości ruchu jałowego. Większość części powinno na tym zyskać, ale niektóre mogą drukować się dłużej, dlatego prosimy o porównaniu czasu drukowania z i bez włączonej opcji." + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1100,6 +1050,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "Wszędzie" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1482,8 +1442,8 @@ msgstr "Przesunięcie Wypełn. w Osi X" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "Wypełnienie jest przesunięte o taką odległość wzdłuż osi X." +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1492,8 +1452,8 @@ msgstr "Przesunięcie Wypełn. w Osi Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "Wypełnienie jest przesunięte o taką odległość wzdłuż osi Y." +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1512,8 +1472,8 @@ msgstr "Procent Nałożenia Wypełn." #: 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 "Ilość nałożenia pomiędzy wypełnieniem a ścianami. Nieznaczne nałożenie pozwala ściśle łączyć się z wypełnieniem." +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1532,8 +1492,8 @@ msgstr "Procent Nakładania się Skóry" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "Wartość nałożenia pomiędzy skórą a ścianami jako procent szerokości linii. Delikatne nałożenie pozwala na dobre połączenie ścian ze skórą. Jest to procent średniej szerokości linii skóry i wewnętrznej ściany." +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1695,16 +1655,6 @@ msgctxt "material description" msgid "Material" msgstr "Materiał" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -msgstr "Auto Temperatura" - -#: 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 "Zmień temperaturę każdej warstwy automatycznie przy średniej prędkości przepływu tej warstwy." - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1755,16 +1705,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "Temperatura, od której zaczyna się chłodzenie tuż przed końcem drukowania." -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "Wykres Temp. Przepływu" - -#: fdmprinter.def.json -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ę) z temperaturą (stopnie Celsjusza)." - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1782,8 +1722,8 @@ msgstr "Temperatura Stołu" #: 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 "Temperatura stosowana przy podgrzewanym stole. Jeśli jest to 0, stół nie rozgrzeje się dla tego wydruku." +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3455,6 +3395,16 @@ 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 wieży. Wyższa wartość powoduje punktowy dach wieży, a niższa wartość powoduje płaskie dachy wieży." +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "Upuść Siatkę Podpory" + +#: 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 "Twórz podpory wszędzie pod siatką podpory, tak aby nie było zwisu w siatce podpory." + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -4089,16 +4039,6 @@ 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 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." -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "Maksymalna Rozdzielczość" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "Minimalny rozmiar linii segmentu po pocięciu. Jeżeli to zwiększysz, siatka będzie miała mniejszą rozdzielczość. Może to spowodować przyspieszenie prędkości przetwarzania g-code i przyspieszenie prędkości cięcia poprzez usunięcie detali siatki, których tak czy tak nie można przetworzyć." - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4249,16 +4189,6 @@ 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 podpory." -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -msgstr "Upuść Siatkę Podpory" - -#: 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 "Twórz podpory wszędzie pod siatką podpory, tak aby nie było zwisu w siatce podpory." - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4335,14 +4265,194 @@ msgid "experimental!" msgstr "eksperymentalne!" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "Optymalizuj Kolejność Drukowania Ścian" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "Optymalizuj kolejność, według której drukowane są ściany, aby zredukować ilość retrakcji i długości ruchu jałowego. Większość części powinno na tym zyskać, ale niektóre mogą drukować się dłużej, dlatego prosimy o porównaniu czasu drukowania z i bez włączonej opcji." +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "Tolerancja Cięcia" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "Jak ciąć warstwy z ukośnymi powierzchniami. Obszary warstwy mogą być generowane na podstawie miejsca gdzie środek warstwy przecina się z powierzchnią (Środek). Alternatywnie każda warstwa może mieć obszary, które wpadają do środka objętości poprzez wysokość warstwy (Wyłączne) lub warstwa ma obszary, które wpadają do środka w każdym miejscu na warstwie (Włącznie). Wyłącznie zatrzymuje najwięcej detali, Włącznie powoduje najlepsze dopasowanie, a Środek wymaga najmniej czasu do przetworzenia." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "Środek" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "Wyłącznie" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "Włącznie" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "Szerokość Linii Powierzchni Skóry" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "Szerokość pojedynczej linii na obszarach na górze wydruku." + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "Wzór Górnej Pow. Skóry" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "Wzór najwyższych warstw." + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "Linie" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "Koncentryczny" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zygzak" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "Kierunki Linii Górnej Pow. Skóry" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "Lista całkowitych kierunków linii używana kiedy skóra górnej powierzchni używa wzoru linii lub zygzaka. Elementy z listy są używane po kolei na każdej warstwie, a kiedy lista się skończy, zaczyna się od nowa. Elementy listy są oddzielone przecinkami, a cała lista zawarta jest w nawiasach kwadratowych. Domyślnie lista jest pusta co oznacza używanie tradycyjnych, domyślnych kątów (45 i 135 stopni)." + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Auto Temperatura" + +#: 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 "Zmień temperaturę każdej warstwy automatycznie przy średniej prędkości przepływu tej warstwy." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "Wykres Temp. Przepływu" + +#: fdmprinter.def.json +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ę) z temperaturą (stopnie Celsjusza)." + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "Maksymalna Rozdzielczość" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "Minimalny rozmiar linii segmentu po pocięciu. Jeżeli to zwiększysz, siatka będzie miała mniejszą rozdzielczość. Może to spowodować przyspieszenie prędkości przetwarzania g-code i przyspieszenie prędkości cięcia poprzez usunięcie detali siatki, których tak czy tak nie można przetworzyć." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4943,6 +5053,46 @@ 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 linie skierowanie w dół o mniej stromym kącie, co z kolei skutkuje mniejszymi połączeniami z następną warstwą. Dotyczy tylko Drukowania Drutu." +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -5003,6 +5153,26 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Forma przesunięcia, która ma być zastosowana do modelu podczas ładowania z pliku." +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "Wypełnienie jest przesunięte o taką odległość wzdłuż osi X." + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "Wypełnienie jest przesunięte o taką odległość wzdłuż osi Y." + +#~ 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ść nałożenia pomiędzy wypełnieniem a ścianami. Nieznaczne nałożenie pozwala ściśle łączyć się z wypełnieniem." + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "Wartość nałożenia pomiędzy skórą a ścianami jako procent szerokości linii. Delikatne nałożenie pozwala na dobre połączenie ścian ze skórą. Jest to procent średniej szerokości linii skóry i wewnętrznej ściany." + +#~ 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 podgrzewanym stole. Jeśli jest to 0, stół nie rozgrzeje się dla tego wydruku." + #~ msgctxt "wall_x_extruder_nr label" #~ msgid "Inner Walls Extruder" #~ msgstr "Esktruder Wewn. Ściany" diff --git a/resources/i18n/pt_BR/cura.po b/resources/i18n/pt_BR/cura.po index e00c6099c4..947ee3416d 100644 --- a/resources/i18n/pt_BR/cura.po +++ b/resources/i18n/pt_BR/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-12-04 10:20-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio and CoderSquirrel \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "Ajustes da Máquina" @@ -54,12 +54,11 @@ msgstr "Conectando ao Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -99,7 +98,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Abrir a interface web do Doodle3D Connect" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Exibir registro de alterações" @@ -114,78 +113,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "O perfil foi achatado & ativado." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "Impressão USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "Imprimir pela USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "Imprimir pela USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "Conectado via USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Incapaz de iniciar novo trabalho porque a impressora está ocupada ou não conectada." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "Impressora Não Disponível" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Esta impressora não suporta impressão USB porque usa G-Code UltiGCode." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "Impressão USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Incapaz de iniciar um novo trabalho porque a impressora não suporta impressão USB." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "Aviso" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "Incapaz de atualizar firmware porque não há impressoras conectadas." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "Não foi possível encontrar o firmware requerido para a impressora em %s." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "Firmware da Impressora" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -229,11 +233,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Não foi possível salvar em unidade removível {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "Erro" @@ -283,7 +287,7 @@ msgid "Removable Drive" msgstr "Unidade Removível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Imprimir pela rede" @@ -397,110 +401,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "Status da Impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Incapaz de iniciar um novo trabalho de impressão. Nenhum Printcore carregado no slot {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Incapaz de iniciar um novo trabalho de impressão. Não há material carregado no slot {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Não há material suficiente para o carretel {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "PrintCore Diferente (Cura: {0}, Impressora: {1}) selecionado para o extrusor {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Material diferente (Cura: {0}, Impressora: {1}) selecionado para o extrusor {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "O PrintCore {0} não está calibrado adequadamente. A calibração XY precisa ser executada na impressora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Tem certeza que quer imprimir com a configuração selecionada?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "Há divergências entre a configuração ou calibração da impressora e do Cura. Para melhores resultados, sempre fatie com os PrintCores e materiais que estão carregados em sua impressora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Configuração divergente" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "Envio de novos trabalhos (temporariamente) bloqueado, ainda enviando o trabalho de impressão anterior." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Enviando dados à impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "Enviando Dados" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Incapaz de enviar dados à impressora. Há outro trabalho de impressão ativo?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Abortando impressão..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Impressão abortada. Por favor verifique a impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Pausando impressão..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Continuando impressão..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Sincronizar com a impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Deseja usar a configuração atual de sua impressora no Cura?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "Os PrintCores e/ou materiais da sua impressora diferem dos que estão dentro de seu projeto atual. Para melhores resultados, sempre fatie para os PrintCores e materiais que estão na sua impressora." @@ -521,145 +525,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "{printer_name} acabou de imprimir '{job_name}'. Por favor colete a impressão e confirme esvaziamento da mesa." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} está reservada para imprimir '{job_name}'. Por favor altere a configuração da impressora para combinar com este trabalho para que ela comece a imprimir." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Incapaz de enviar novo trabalho de impressão: esta impressora 3D (ainda) não está configurada para hospedar um grupo de impressoras Ultimaker 3 conectadas." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Incapaz de enviar trabalho de impressão ao grupo {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "{file_name} enviado ao grupo {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "Exibir trabalhos de impressão" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "Abrir a interface de trabalhos de impressão em seu navegador." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "Desconhecido" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "{printer_name} acabou de imprimir '{job_name}'." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "Impressão Concluída" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "Necessária uma ação" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "Enviando {file_name} ao grupo {cluster_name}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "Conectar pela rede" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "Novos recursos estão disponível para sua {machine_name}! Recomenda-se atualizar o firmware da impressora." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Novo firmware de %s disponível" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "Como atualizar" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "Não foi possível acessar informação de atualização." -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "Erros apareceram ao abrir seu arquivo SolidWorks! Por favor verifique se é possível abrir seu arquivo no próprio SolidWorks sem problema também!" +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "Arquivo de parte de SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "Arquivo de montagem de SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "Configure" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "Erro ao iniciar %s!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "Visão simulada" +msgid "Layer view" +msgstr "Visão de Camadas" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "O Cura não mostra as camadas corretamente quando Impressão em Arame estiver habilitada" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "Visão Simulada" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "Modificar G-Code" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "O Cura coleta estatística de fatiamento anonimizadas. Você pode desabilitar isso nas preferências." +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -668,14 +715,41 @@ msgstr "Coletando Dados" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "Fechar" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Perfis do Cura 15.04" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -707,49 +781,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "Imagem GIF" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "Incapaz de fatiar com o material atual visto que é incompatível com a máquina ou configuração selecionada." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "Incapaz de fatiar" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Incapaz de fatiar com os ajustes atuais. Os seguintes ajustes têm erros: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "Incapaz de fatiar devido a alguns ajustes por modelo. Os seguintes ajustes têm erros em um ou mais dos modelos: {error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Incapaz de fatiar porque a torre de purga ou posição de purga são inválidas." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Nada a fatiar porque nenhum dos modelos cabe no volume de impressão. Por favor redimensione ou rotacione os modelos para caberem." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "Processando Camadas" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "Informação" @@ -786,14 +860,14 @@ msgstr "Erro ao copiar arquivos de plugins Siemens NX. Por favor, verifique seu msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Erro ao instalar arquivos de plugins Siemens NX. Não foi possível ajustar a variável de ambiente UGII_USER_DIR para o Simenes NX." -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "Recomendado" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "Personalizado" @@ -804,24 +878,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "Arquivo 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "Bico" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Falha ao pegar identificador do complemento de {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "Aviso" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "Navegador de complementos" @@ -836,18 +910,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Arquivo G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "Interpretando G-Code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "Detalhes do G-Code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "Assegure-se que o g-code é adequado para sua impressora e configuração antes de enviar o arquivo. A representação de g-code pode não ser acurada." @@ -858,6 +932,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Perfil do Cura" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -889,142 +973,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "Nivelar mesa" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Parede Externa" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Paredes Internas" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "Contorno" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "Preenchimento" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "Preenchimento de Suporte" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "Interface de Suporte" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "Suporte" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "Skirt (Saia)" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "Percurso" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "Retrações" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "Outros" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "Desconhecido" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Arquivo pré-fatiado {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "Não há material carregado" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "Material desconhecido" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "Achando novos lugares para objetos" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "Buscando Localização" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "Incapaz de achar um lugar dentro do volume de construção para todos os objetos" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "Não Foi Encontrada Localização" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "O Arquivo Já Existe" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "O arquivo {0} já existe. Tem certeza que quer sobrescrevê-lo?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "Personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "Material Personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "Global" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "Não sobrepujado" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "O material selecionado é incompatível com a máquina ou configuração selecionada." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1045,67 +1103,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Desfaz a mudança no diâmetro do material." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Falha ao exportar perfil para {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Falha ao exportar perfil para {0}: complemento escritor relatou erro." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Perfil exportado para {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "Exportação concluída" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Falha ao importa perfil de {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Perfil {0} importado com sucesso" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "O Perfil {0} tem tipo de arquivo desconhecido ou está corrompido." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "Perfil personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Falta um tipo de qualidade ao Perfil." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "Não foi possível encontrar tipo de qualidade {0} para a configuração atual." +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1116,145 +1196,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "Volume de Impressão" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Multiplicando e colocando objetos" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "Colocando Objeto" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "Incapaz de achar um lugar dentro do volume de construção para todos os objetos" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "Achando novos lugares para objetos" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "Buscando Localização" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "Não Foi Encontrada Localização" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "Relatório de Problema" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " msgstr "" -"

    Uma exceção fatal aocorreu. Por favor nos envie este Relatório de Erros para consertarmos o problema

    \n" -"

    Por favor use o botão \"Enviar relatório\" para postar um relato de bug automaticamente em nossos servidores

    \n" -" " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "Informação do Sistema" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "Desconhecida" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Versão do Cura: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "Plataforma: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Versão da Qt: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "Versão da PyQt: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • Versão da OpenGL: {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • Fornecedor da OpenGL: {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • Renderizador da OpenGL: {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "Traceback de exceção" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "Registros" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "Descrição do usuário" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "Enviar relatório" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Carregando máquinas..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Configurando cena..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Carregando interface..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Somente um arquivo G-Code pode ser carregado por vez. Pulando importação de {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Não é possível abrir nenhum outro arquivo se G-Code estiver sendo carregado. Pulando importação de {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "O modelo selecionado é pequenos demais para carregar." @@ -1283,12 +1385,11 @@ msgstr "X (largura)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1378,68 +1479,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "A diferença de altura entre a ponta do bico e o sistema de eixos X e Y. Usado para prevenir colisões entre impressões e a cabeça ao imprimir \"Um de cada Vez\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "Número de Extrusores" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "O diâmetro nominal do filamento suportado pela impressora. O diâmetro exato será sobrepujado pelo material e/ou perfil." - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "Diâmetro do material" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "Tamanho do bico" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "G-Code Inicial" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Comandos de G-Code a serem executados no início da impressão." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "G-Code Final" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Comandos de G-Code a serem executados no final da impressão." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "Ajustes do Bico" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Tamanho do bico" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "O diâmetro nominal do filamento suportado pela impressora. O diâmetro exato será sobrepujado pelo material e/ou perfil." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "Deslocamento X do Bico" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Deslocamento Y do Bico" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "G-Code Inicial do Extrusor" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "G-Code Final do Extrusor" @@ -1452,8 +1552,9 @@ msgstr "Registro de alterações" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1537,7 +1638,7 @@ msgstr "Editar" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "Remover" @@ -1559,14 +1660,14 @@ msgid "Type" msgstr "Tipo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Extended" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1610,8 +1711,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "Introduza o endereço IP ou hostname da sua impressora na rede." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1632,6 +1731,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 não está configurada para hospedar um grupo de impressora Ultimaker 3 conectadas" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1662,11 +1766,16 @@ msgid "Available" msgstr "Disponível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "A conexão à impressora foi perdida" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1758,138 +1867,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "Ativar Configuração" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Configuração do Complemento de Solidworks do Cura" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "Qualidade default do STL exportado:" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "Sempre perguntar" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "Sempre usar qualidade Alta" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "Sempre usar qualidade Baixa" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "Importar Arquivo SolidWorks como STL..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "Qualidade do STL Exportado" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "Qualidade" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "Baixa" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "Alta" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "Lembrar minha escolha" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "Salvar" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "Esquema de Cores" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "Cor do Material" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "Tipo de Linha" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "Taxa de alimentação" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "Largura de camada" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "Modo de Compatibilidade" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "Exibir Percursos" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "Exibir Assistentes" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "Exibir Perímetro" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "Exibir Preenchimento" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "Somente Exibir Camadas Superiores" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "Exibir 5 Camadas Superiores Detalhadas" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "Topo / Base" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "Parede Interna" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "mín" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "máx" @@ -1914,7 +2135,7 @@ msgctxt "@label" msgid "Settings" msgstr "Ajustes" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Troca os scripts de pós-processamento ativos" @@ -1989,23 +2210,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "Suavização" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "Selecionar ajustes" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "Selecionar Ajustes a Personalizar para este modelo" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "Filtrar..." -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "Exibir tudo" @@ -2367,66 +2618,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "Tudo está em ordem! A verificação terminou." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "Não conectado a nenhuma impressora." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "A impressora não aceita comandos" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "Em manutenção. Por favor verifique a impressora" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Imprimindo..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Pausado" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Preparando..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "Por favor remova a impressão" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "Continuar" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "Pausar" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "Abortar Impressão" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "Abortar impressão" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "Tem certeza que deseja abortar a impressão?" @@ -2461,19 +2712,19 @@ msgid "Customized" msgstr "Personalizado" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "Sempre perguntar" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "Descartar e não perguntar novamente" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "Manter e não perguntar novamente" @@ -2508,72 +2759,72 @@ msgctxt "@label" msgid "Brand" msgstr "Marca" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "Tipo de Material" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "Cor" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "Propriedades" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "Densidade" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "Diâmetro" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "Custo do Filamento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "Peso do Filamento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "Comprimento do Filamento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "Custo por Metro" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "Este material está vinculado a %1 e compartilha algumas de suas propriedades." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "Desvincular Material" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "Descrição" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "Informação sobre Aderência" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "Ajustes de impressão" @@ -2614,7 +2865,7 @@ msgid "Unit" msgstr "Unidade" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "Geral" @@ -2629,230 +2880,255 @@ msgctxt "@label" msgid "Language:" msgstr "Idioma:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "Moeda:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "Tema:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "Você precisará reiniciar a aplicação para que essas mudanças tenham efeito." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "Fatiar automaticamente quando mudar ajustes." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "Fatiar automaticamente" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "Comportamento da área de visualização" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "Ressaltar áreas sem suporte do modelo em vermelho. Sem suporte, estas áreas não serão impressas corretamente." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "Exibir seções pendentes" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "Move a câmera de modo que o modelo fique no centro da visão quando for selecionado." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "Centralizar câmera quanto o item é selecionado" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "O comportamento default de ampliação deve ser invertido?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "Inverter a direção da ampliação de câmera." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "A ampliação (zoom) deve se mover na direção do mouse?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "Ampliar na direção do mouse" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "Os modelos devem ser movidos na plataforma de modo que não se sobreponham?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "Assegurar que os modelos sejam mantidos separados" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "Os modelos devem ser movidos pra baixo pra se assentar na plataforma de impressão?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "Automaticamente fazer os modelos caírem na mesa de impressão." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "Exibir mensagem de advertência no leitor de g-code." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "Mensagem de advertência no leitor de g-code" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "A Visão de Camada deve ser forçada a ficar em modo de compatibilidade?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "Forçar modo de compatibilidade da visão de camadas (requer reinício)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "Abrindo e salvando arquivos" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "Os modelos devem ser redimensionados dentro do volume de impressão se forem muito grandes?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "Redimensionar modelos grandes" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "Um modelo pode ser carregado diminuto se sua unidade for por exemplo em metros ao invés de milímetros. Devem esses modelos ser redimensionados?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "Redimensionar modelos minúsculos" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "Um prefixo baseado no nome da impressora deve ser adicionado ao nome do trabalho de impressão automaticamente?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "Adicionar prefixo de máquina ao nome do trabalho" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "Um resumo deve ser exibido ao salvar um arquivo de projeto?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "Exibir diálogo de resumo ao salvar projeto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "Comportamento default ao abrir um arquivo de projeto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "Comportamento default ao abrir um arquivo de projeto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "Sempre perguntar" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "Sempre abrir como projeto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "Sempre importar modelos" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "Quando você faz alterações em um perfil e troca para um diferent, um diálogo aparecerá perguntando se você quer manter ou aplicar suas modificações, ou você pode forçar um comportamento default e não ter o diálogo." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "Sobrepujar Perfil" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "Privacidade" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "O Cura deve verificar novas atualizações quando o programa for iniciado?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "Verificar atualizações na inicialização" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "Dados anônimos sobre sua impressão podem ser enviados para a Ultimaker? Nota: nenhuma informação pessoalmente identificável, modelos ou endereços IP são enviados ou armazenados." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "Enviar informação (anônima) de impressão." +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "Impressoras" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "Ativar" @@ -2895,7 +3171,7 @@ msgid "Waiting for a printjob" msgstr "Esperando um trabalho de impressão" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "Perfis" @@ -2921,13 +3197,13 @@ msgid "Duplicate" msgstr "Duplicar" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "Importar" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "Exportar" @@ -2993,7 +3269,7 @@ msgid "Export Profile" msgstr "Exportar Perfil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "Materiais" @@ -3008,60 +3284,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "Impressora: %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "Criar" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "Duplicar" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "Importar Material" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr "Não foi possível importar material %1: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "Material %1 importado com sucesso" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "Exportar Material" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "Falha em exportar material para %1: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "Material exportado para %1 com sucesso" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "Adicionar Impressora" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "Nome da Impressora:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "Adicionar Impressora" @@ -3190,12 +3466,7 @@ msgctxt "@label" msgid "Profile:" msgstr "Perfil:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "Nenhum Perfil Disponível" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" @@ -3206,37 +3477,37 @@ msgstr "" "\n" "Clique para abrir o gerenciador de perfis." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "Buscar..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Copiar valor para todos os extrusores" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Ocultar este ajuste" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Não exibir este ajuste" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Manter este ajuste visível" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Configurar a visibilidade dos ajustes..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" @@ -3247,27 +3518,27 @@ msgstr "" "\n" "Clique para tornar estes ajustes visíveis. " -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "Afeta" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "Afetado Por" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "Este ajuste é sempre compartilhado entre todos os extrusores. Alterá-lo aqui propagará o valor para todos os outros extrusores" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "O valor é resolvido de valores específicos de cada extrusor" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 msgctxt "@label" msgid "" "This setting has a value that is different from the profile.\n" @@ -3277,7 +3548,7 @@ msgstr "" "Este ajuste tem um valor que é diferente do perfil.\n" "Clique para restaurar o valor do perfil." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" @@ -3287,12 +3558,12 @@ msgstr "" "Este ajuste é normalmente calculado, mas atualmente tem um conjunto absoluto de valores.\n" "Clique para restaurar o valor calculado." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Configuração de Impressão" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" @@ -3301,59 +3572,59 @@ msgstr "" "Configuração de Impressão desabilitada\n" "Arquivos G-Code não podem ser modificados" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00h 00min" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "Especificação de tempo
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "Especificação de custo" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "Total:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Configuração Recomendada de Impressão

    Imprimir com os ajustes recomendados para a impressora, material e qualidade selecionados." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Configuração de Impressão Personalizada

    Imprimir com controle fino sobre cada parte do processo de fatiamento." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automático: %1" @@ -3363,6 +3634,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Ver" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3375,14 +3656,14 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Imprimir Modelo Selecionado Com:" msgstr[1] "Imprimir Modelos Selecionados Com:" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplicar Modelo Selecionado" msgstr[1] "Multiplicar Modelos Selecionados" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "Número de Cópias" @@ -3398,7 +3679,7 @@ msgid "No printer connected" msgstr "Nenhuma impressora conectada" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "Extrusor" @@ -3508,254 +3789,294 @@ msgctxt "@label" msgid "Estimated time left" msgstr "Tempo restante estimado" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "A<ernar Tela Cheia" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "Des&fazer" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Refazer" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Sair" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "&Recompor posições de câmera" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configurar Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Adicionar Impressora..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Adm&inistrar Impressoras..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Administrar Materiais..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Atualizar perfil com valores e sobrepujanças atuais" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Descartar ajustes atuais" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Criar perfil a partir de ajustes atuais..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Administrar perfis..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Exibir &Documentação Online" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Relatar um &Bug" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "S&obre..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Remover Modelo &Selecionado" msgstr[1] "Remover Modelos &Selecionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Centralizar Modelo Selecionado" msgstr[1] "Centralizar Modelos Selecionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplicar Modelo Selecionado" msgstr[1] "Multiplicar Modelos Selecionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Remover Modelo" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ce&ntralizar Modelo na Mesa" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "A&grupar Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Desagrupar Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Co&mbinar Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Multiplicar Modelo..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Selecionar Todos Os Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Esvaziar a mesa de impressão" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "&Recarregar Todos Os Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Posicionar Todos os Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Posicionar Seleção" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Reestabelecer as Posições de Todos Os Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Remover as &Transformações de Todos Os Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "Abrir Arquiv&os(s)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Novo Projeto..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "&Exibir o Registro do Motor de Fatiamento..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Exibir Pasta de Configuração" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configurar a visibilidade dos ajustes..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "Navegar complementos..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "Complementos instalados..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Por favor carregue um modelo 3D" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Pronto para fatiar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Fatiando..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Pronto para %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Incapaz de Fatiar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Fatiamento indisponível" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Preparar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Cancelar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Selecione o dispositivo de saída ativo" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "Abrir arquivo(s)" @@ -3775,114 +4096,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Arquivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "Salvar &Seleção em Arquivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "S&alvar Como..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "Salvar projeto" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Editar" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "&Ver" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "Aju&stes" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "Im&pressora" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "&Material" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "&Perfil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Definir Como Extrusor Ativo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "E&xtensões" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "&Complementos" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "P&referências" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "A&juda" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "Abrir arquivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "Ajustes" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "Novo projeto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "Tem certeza que quer iniciar novo projeto? Isto esvaziará a mesa de impressão e quaisquer ajustes não salvos." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "Instalar Complemento" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "Abrir Arquivo(s)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "Encontramos um ou mais arquivos de G-Code entre os arquivos que você selecionou. Você só pode abrir um arquivo de G-Code por vez. Se você quiser abrir um arquivo de G-Code, por favor selecione somente um." @@ -3907,97 +4228,82 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Não exibir resumo do projeto ao salvar novamente" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "Salvar" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "Preparar" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "Monitorar" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "Altura de Camada" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "Um perfil personalizado está atualmente ativo. Para habilitar o controle deslizante de qualidade, escolha um perfil de qualidade default na aba Personalizado" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "Velocidade de Impressão" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "Mais Lento" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "Mais Rápido" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "Você modificou alguns ajustes de perfil. Se você quiser alterá-los, use o modo personalizado." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "Preenchimento:" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Preenchimento gradual aumentará gradualmente a quantidade de preenchimento em direção ao topo." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "Habilitar gradual" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "Gerar Suportes" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Gera estrutura que suportarão partes do modelo que têm seções pendentes. Sem estas estruturas, tais partes desabariam durante a impressão." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "Extrusor do Suporte" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "Selecione qual extrusor a usar para o suporte. Isto construirá estruturas de suportes abaixo do modelo para prevenir que o modelo desabe ou seja impresso no ar." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Aderência à Mesa de Impressão" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "Habilita imprimir um brim (bainha) ou raft (jangada). Adicionará uma área chata em volta ou sob o objeto que é fácil de remover após a impressão ter finalizado." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Precisa de ajuda para melhorar sua impressões?
    Leia os Guias de Resolução de Problema da Ultimaker" @@ -4014,17 +4320,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Abrir arquivo de projeto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "Este é um arquivo de projeto do Cura. Gostaria de abri-lo como um projeto ou importar os modelos dele?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Lembrar minha escolha" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "Abrir como projeto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "Importar modelos" @@ -4034,21 +4345,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Registro do Motor de Fatiamento" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "Material" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "Verificar compatibilidade" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Clique para verificar a compatibilidade do material em Ultimaker.com." +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4139,6 +4465,26 @@ msgctxt "name" msgid "USB printing" msgstr "Impressão USB" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4159,6 +4505,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Conexão de Rede UM3" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4171,8 +4527,8 @@ msgstr "Verificador de Atualizações de Firmware" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "Te dá a possibilidade de abrir certos arquivos via o próprio SolidWorks. Tais são convertidos e carregados no Cura" +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4239,6 +4595,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "Leitor de Perfis de Cura Legado" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4399,6 +4765,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Gravador de Perfis do Cura" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4439,6 +4815,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Leitor de Perfis do Cura" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "Desconhecido" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "Erros apareceram ao abrir seu arquivo SolidWorks! Por favor verifique se é possível abrir seu arquivo no próprio SolidWorks sem problema também!" + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "Erro ao iniciar %s!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "Visão simulada" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "O Cura coleta estatística de fatiamento anonimizadas. Você pode desabilitar isso nas preferências." + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "Fechar" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "Global" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    Uma exceção fatal aocorreu. Por favor nos envie este Relatório de Erros para consertarmos o problema

    \n" +#~ "

    Por favor use o botão \"Enviar relatório\" para postar um relato de bug automaticamente em nossos servidores

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Versão do Cura: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "Plataforma: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Versão da Qt: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "Versão da PyQt: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "Traceback de exceção" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "Diâmetro do material" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker 3 Extended" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Configuração do Complemento de Solidworks do Cura" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "Qualidade default do STL exportado:" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "Sempre perguntar" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "Sempre usar qualidade Alta" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "Sempre usar qualidade Baixa" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "Importar Arquivo SolidWorks como STL..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "Qualidade do STL Exportado" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "Qualidade" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "Baixa" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "Alta" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "Nenhum Perfil Disponível" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "Este ajuste é sempre compartilhado entre todos os extrusores. Alterá-lo aqui propagará o valor para todos os outros extrusores" + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "Especificação de tempo
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "&Recompor posições de câmera" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "Salvar projeto" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "Preparar" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "Monitorar" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "Verificar compatibilidade" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "Te dá a possibilidade de abrir certos arquivos via o próprio SolidWorks. Tais são convertidos e carregados no Cura" + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "Bloqueado" @@ -4459,13 +4985,9 @@ msgstr "Leitor de Perfis do Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Para assegurar que sua {machine_name} esteja equipada com os recursos mais recentes, é recomendado atualizar o firmware regularmente. Isto pode ser feito na {machine_name} (quando conectado pela rede) ou via USB." -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Visão de Camadas" - -msgctxt "@info:title" -msgid "Layer View" -msgstr "Visão de Camadas" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Visão de Camadas" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4567,9 +5089,9 @@ msgstr "Visão de Camadas" #~ msgid "Provides the Layer view." #~ msgstr "Provê a visão de Camadas." -msgctxt "name" -msgid "Layer View" -msgstr "Visão de Camadas" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Visão de Camadas" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4890,9 +5412,9 @@ msgstr "Visão de Camadas" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Provê suporte para importar perfis de arquivos G-Code." -msgctxt "@label" -msgid "Layer View" -msgstr "Visão de Camadas" +#~ msgctxt "@label" +#~ msgid "Layer View" +#~ msgstr "Visão de Camadas" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/pt_BR/fdmextruder.def.json.po b/resources/i18n/pt_BR/fdmextruder.def.json.po index 1f222f9847..a7609a1ceb 100644 --- a/resources/i18n/pt_BR/fdmextruder.def.json.po +++ b/resources/i18n/pt_BR/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-12-04 09:00-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio and CoderSquirrel \n" diff --git a/resources/i18n/pt_BR/fdmprinter.def.json.po b/resources/i18n/pt_BR/fdmprinter.def.json.po index 4aeea1d2f9..5e2889e0e6 100644 --- a/resources/i18n/pt_BR/fdmprinter.def.json.po +++ b/resources/i18n/pt_BR/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-12-04 10:20-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio and CoderSquirrel \n" @@ -350,6 +350,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -610,31 +620,6 @@ 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 "A altura da camada inicial em mm. Uma camada inicial mais espessa faz a aderência à mesa de impressão ser maior." -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "Tolerância de Fatiamento" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "Como fatiar camadas com superfícies diagonais. As áreas de uma camada podem ser geradas baseadas em onde o meio da camada interseciona a superfície (Meio). Alternativamente, cada camada pode ter as áreas que se encontram dentro do volume por toda a altura da camada (Exclusivo) ou a camada pode abranger todas as áreas que tenham qualquer penetração dentro do volume (Inclusivo). Exclusivo retém mais detalhes, Inclusivo é melhor para encaixes e Meio toma menos tempo para processar." - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "Meio" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "Exclusivo" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "Inclusivo" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -675,16 +660,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "Largura de extrusão das paredes internas (todas menos a mais externa)." -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "Largura de extrusão da Superfície Superior" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "Largura de extrusão de um filete das áreas no topo da peça." - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -865,41 +840,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "O número de camadas da superfície superior. Geralmente somente uma camada é suficiente para gerar superfícies de alta qualidade." -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "Padrão da Superfície Superior" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "O padrão das camadas superiores." - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "Linhas" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "Concêntrico" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Ziguezague" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "Direções dos Filetes da Superfície Superior" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "Uma lista de direções inteiras de filete a usar quando as camadas superiores usam o padrão de linhas ou ziguezague. Elementos desta lista são usados sequencialmente de acordo com o progresso das camadas e quando se chega ao fim da lista, se volta ao começo. Os itens da lista são separados por vírgulas e a lista inteira é contida em colchetes. O default é uma lista vazia que significa o uso dos ângulos default (45 e 135 graus)." - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1030,6 +970,16 @@ 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 "Penetração adicional aplicada ao caminho da parede externa. Se a parede externa for menor que o bico, e impressa depois das paredes internas, use este deslocamento para fazer o orifício do bico se sobrepor às paredes internas ao invés de ao lado de fora do modelo." +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "Otimizar Ordem de Impressão de Paredes" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "Otimiza a ordem em que paredes são impressas de modo a reduzir o número de retrações e a distância percorrida. A maioria das peças se beneficiarão deste ajuste habilitado mas algumas podem acabar levando mais tempo, portanto por favor compare as estimativas de tempo de impressão com e sem otimização." + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1100,6 +1050,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "Em todos os lugares" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1482,8 +1442,8 @@ msgstr "Deslocamento X do Preenchimento" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "O padrão de preenchimento é corrigido/deslocado nesta distância no eixo X." +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1492,8 +1452,8 @@ msgstr "Deslocamento do Preenchimento Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "O padrão de preenchimento é corrigido/deslocado nesta distância no eixo Y." +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1512,8 +1472,8 @@ msgstr "Porcentagem de Sobreposição do Preenchimento" #: 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 "Porcentagem de sobreposição entre o preenchimento e as paredes. Uma leve sobreposição permite que as paredes fiquem firmemente aderidas ao preenchimento." +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1532,8 +1492,8 @@ msgstr "Porcentagem de Sobreposição do Contorno" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "A quantidade de sobreposição entre o contorno e as paredes como uma porcentagem da largura de extrusão. Uma sobreposição leve permite que as paredes se conectem firmemente ao contorno. Este ajuste é uma porcentagem das larguras de extrusão média do contorno e da parede mais interna." +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1695,16 +1655,6 @@ msgctxt "material description" msgid "Material" msgstr "Material" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -msgstr "Temperatura Automática" - -#: 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 "Troca a temperatura para cada camada automaticamente de acordo com a velocidade média de fluxo desta camada." - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1755,16 +1705,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "A temperatura para a qual se deve começar a esfriar pouco antes do fim da impressão." -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "Gráfico de Fluxo de Temperatura" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "Dados relacionando fluxo de material (em mm³ por segundo) a temperatura (graus Celsius)." - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1782,8 +1722,8 @@ msgstr "Temperatura da Mesa de Impressão" #: 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 "A temperatura usada pela mesa aquecida de impressão. Se for 0, a mesa não aquecerá para esta impressão." +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3455,6 +3395,16 @@ 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 "Ângulo do Teto (parte superior) de uma torre. Um valor maior resulta em tetos pontiagudos, um valor menor resulta em tetos achatados." +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "Malha de Suporte Abaixo" + +#: 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 "Cria suport em todo lugar abaixo da malha de suporte de modo que não haja seções pendentes nela." + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -4089,16 +4039,6 @@ 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 "Normalmente o Cura tenta costurar pequenos furos na malha e remover partes de uma camada com grandes furos. Habilitar esta opção mantém aquelas partes que não podem ser costuradas. Este opção deve ser usada somente como uma última alternativa quando tudo o mais falha em produzir G-Code apropriado." -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "Resolução Máxima" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "O tamanho mínimo de um segmento de linha após o fatiamento. Se você aumentar este valor, a malha terá uma resolução menor. Isto pode permitir que a impressora mantenha a velocidade que precisa para processar o G-Code e aumentará a velocidade de fatiamento ao remover detalhes da malha que não poderia processar de qualquer jeito." - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4249,16 +4189,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "Use esta malha para especificar áreas obrigatoriamente suportadas. Isto será usado para gerar estruturas de suporte." -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -msgstr "Malha de Suporte Abaixo" - -#: 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 "Cria suport em todo lugar abaixo da malha de suporte de modo que não haja seções pendentes nela." - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4335,14 +4265,194 @@ msgid "experimental!" msgstr "experimental!" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "Otimizar Ordem de Impressão de Paredes" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "Otimiza a ordem em que paredes são impressas de modo a reduzir o número de retrações e a distância percorrida. A maioria das peças se beneficiarão deste ajuste habilitado mas algumas podem acabar levando mais tempo, portanto por favor compare as estimativas de tempo de impressão com e sem otimização." +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "Tolerância de Fatiamento" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "Como fatiar camadas com superfícies diagonais. As áreas de uma camada podem ser geradas baseadas em onde o meio da camada interseciona a superfície (Meio). Alternativamente, cada camada pode ter as áreas que se encontram dentro do volume por toda a altura da camada (Exclusivo) ou a camada pode abranger todas as áreas que tenham qualquer penetração dentro do volume (Inclusivo). Exclusivo retém mais detalhes, Inclusivo é melhor para encaixes e Meio toma menos tempo para processar." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "Meio" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "Exclusivo" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "Inclusivo" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "Largura de extrusão da Superfície Superior" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "Largura de extrusão de um filete das áreas no topo da peça." + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "Padrão da Superfície Superior" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "O padrão das camadas superiores." + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "Linhas" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "Concêntrico" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Ziguezague" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "Direções dos Filetes da Superfície Superior" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "Uma lista de direções inteiras de filete a usar quando as camadas superiores usam o padrão de linhas ou ziguezague. Elementos desta lista são usados sequencialmente de acordo com o progresso das camadas e quando se chega ao fim da lista, se volta ao começo. Os itens da lista são separados por vírgulas e a lista inteira é contida em colchetes. O default é uma lista vazia que significa o uso dos ângulos default (45 e 135 graus)." + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Temperatura Automática" + +#: 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 "Troca a temperatura para cada camada automaticamente de acordo com a velocidade média de fluxo desta camada." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "Gráfico de Fluxo de Temperatura" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "Dados relacionando fluxo de material (em mm³ por segundo) a temperatura (graus Celsius)." + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "Resolução Máxima" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "O tamanho mínimo de um segmento de linha após o fatiamento. Se você aumentar este valor, a malha terá uma resolução menor. Isto pode permitir que a impressora mantenha a velocidade que precisa para processar o G-Code e aumentará a velocidade de fatiamento ao remover detalhes da malha que não poderia processar de qualquer jeito." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4943,6 +5053,46 @@ 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 "Distância entre o bico e os filetes descendentes horizontais. Espaços livres maiores resultarão em filetes descendentes diagonais com ângulo menos acentuado, o que por sua vez resulta em menos conexões ascendentes à próxima camada. Somente se aplica à Impressão em Arame." +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -5003,6 +5153,26 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Matriz de transformação a ser aplicada ao modelo após o carregamento do arquivo." +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "O padrão de preenchimento é corrigido/deslocado nesta distância no eixo X." + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "O padrão de preenchimento é corrigido/deslocado nesta distância no eixo Y." + +#~ 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 "Porcentagem de sobreposição entre o preenchimento e as paredes. Uma leve sobreposição permite que as paredes fiquem firmemente aderidas ao preenchimento." + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "A quantidade de sobreposição entre o contorno e as paredes como uma porcentagem da largura de extrusão. Uma sobreposição leve permite que as paredes se conectem firmemente ao contorno. Este ajuste é uma porcentagem das larguras de extrusão média do contorno e da parede mais interna." + +#~ 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 "A temperatura usada pela mesa aquecida de impressão. Se for 0, a mesa não aquecerá para esta impressão." + #~ msgctxt "wall_x_extruder_nr label" #~ msgid "Inner Walls Extruder" #~ msgstr "Extrusor das Paredes Internas" diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po index 725ecfc175..1fae4d7adb 100644 --- a/resources/i18n/pt_PT/cura.po +++ b/resources/i18n/pt_PT/cura.po @@ -18,7 +18,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.0.5\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "Definições da Máquina" @@ -55,12 +55,11 @@ msgstr "A ligar ao Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -100,7 +99,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Abrir a interface web do Doodle3D Connect" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Mostrar Lista das Alterações de cada Versão" @@ -118,32 +117,32 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "O perfil foi nivelado & ativado." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "Impressão USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "Imprimir por USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "Imprimir por USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "Ligado via USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Não é possível iniciar um novo trabalho de impressão porque a impressora está ocupada ou não está ligada." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "Impressora Indisponível" @@ -152,17 +151,17 @@ msgstr "Impressora Indisponível" # flavor # variante? # ou só "utilza o UltiGCode" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Esta impressora não suporta impressão por USB porque utiliza a variante UltiGCode." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "Impressão por USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Não é possível iniciar um novo trabalho porque a impressora não suporta impressão por USB." @@ -170,33 +169,38 @@ msgstr "Não é possível iniciar um novo trabalho porque a impressora não supo # rever! # contexto! # Atenção? -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "Aviso" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "Não é possível atualizar o firmware porque não existem impressoras ligadas." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "Não foi possível encontrar o firmware necessário para a impressora em %s." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "Firmware da Impressora" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + # rever! # unidade amovível # disco amovível @@ -222,7 +226,7 @@ msgctxt "@info:title" msgid "Saving" msgstr "A Guardar" -#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99" +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:102 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" @@ -243,11 +247,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Não foi possível guardar no Disco Externo {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "Erro" @@ -297,7 +301,7 @@ msgid "Removable Drive" msgstr "Disco Externo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Imprimir através da rede" @@ -422,14 +426,14 @@ msgid "Printer Status" msgstr "Estado da Impressora" # conforme manual um3 pt v1 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Não é possível iniciar um novo trabalho de impressão. Nenhum Núcleo de Impressão (PrintCore) instalado na ranhura {0}" # rever! -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" @@ -437,36 +441,36 @@ msgstr "Não é possível iniciar um novo trabalho de impressão. Nenhum materia # rever! # ver contexto -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Material insuficiente para a bobina {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Núcleo de Impressão Diferente (Cura: {0}, Impressora: {1}) selecionado para o extrusor {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Material diferente (Cura: {0}, Impressora: {1}) selecionado para o extrusor {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "O núcleo de impressão {0} não está devidamente calibrado. É necessário realizar o processo de calibração XY na impressora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Tem a certeza de que deseja imprimir com a configuração selecionada?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "Existe uma divergência entre a configuração ou calibração da impressora e o Cura. Para se obter os melhores resultados, o seccionamento (no Cura) deve ser sempre feito para os núcleos de impressão e para os materiais que estão introduzidos na impressora." @@ -474,64 +478,64 @@ msgstr "Existe uma divergência entre a configuração ou calibração da impres # rever! # ver contexto! pode querer dizer # Configuração incompatível -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Divergência de Configuração" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "O envio de novos trabalhos está (temporariamente) bloqueado; o trabalho de impressão anterior ainda está a ser enviado." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "A enviar dados para a impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "A Enviar Dados" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Não é possível enviar dados para a impressora. Existe outro trabalho de impressão ainda em curso?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "A cancelar impressão..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Impressão cancelada. Por favor verifique a impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "A colocar a impressão em pausa..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "A recomeçar a impressão..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Sincronizar com a impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Deseja utilizar a configuração atual da impressora no Cura?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "Os núcleos de impressão e/ou materiais na sua impressora são diferentes dos definidos no seu projeto atual. Para se obter os melhores resultados, o seccionamento (no Cura) deve ser sempre feito para os núcleos de impressão e para os materiais que estão introduzidos na impressora." @@ -559,23 +563,23 @@ msgstr "{printer_name} terminou a impressão de \"{job_name}\". Por favor retire # corresponder com? # combinar com #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} está reservada para imprimir \"{job_name}\". Por favor altere a configuração da impressora de forma a corresponder com este trabalho para dar início à impressão." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Não é possível enviar novo trabalho de impressão: esta impressora 3D não está (ainda) configurada para alojar um grupo de impressoras Ultimaker 3 ligadas em rede." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Não é possível enviar o trabalho de impressão para o grupo {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." @@ -583,24 +587,23 @@ msgstr "{file_name} enviado para o grupo {cluster_name}." # rever! # comprimento do texto para button -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "Mostrar trabalhos de impressão" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "Abre a interface dos trabalhos de impressão no seu web browser." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "Desconhecido" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." @@ -608,131 +611,195 @@ msgstr "A impressora {printer_name} terminou a impressão de \"{job_name}\"." # rever! # Concluída? -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "Impressão terminada" # rever! # ver contexto! -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "Ação necessária" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "A enviar {file_name} para o grupo {cluster_name}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "Ligar Através da Rede" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "Estão disponíveis novas funcionalidades para a impressora {machine_name}! É recomendado atualizar o firmware da impressora." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Novo firmware para %s está disponível" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "Como atualizar" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "Não foi possível aceder às informações de atualização." -# rever! -# versão PT do solidworks? -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "Foram encontrados erros ao abrir o seu ficheiro SolidWorks! Verifique se é possível abrir o ficheiro, sem quaisquer problemas, no SolidWorks!" +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" # rever! # versão PT do solidworks? -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "Ficheiro SolidWorks Peça" # rever! # versão PT do solidworks? -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "Ficheiro SolidWorks de montagem" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "Configurar" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "Erro ao iniciar %s!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "Ver Camadas" +msgid "Layer view" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "Quando a opção \"Wire Printing\" está activa, o Cura não permite visualizar as camadas de uma forma precisa" # rever! # ver contexto -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "Visualização por Camadas" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "Modificar G-Code" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "O Cura recolhe, de forma anónima, estatística das opções de seccionamento usadas. Se desejar pode desactivar esta opção nas preferências." +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" msgid "Collecting Data" msgstr "A Recolher Dados" -# rever! -# contexto! -# pode ser _fechar_ -# dispensar -# ignorar #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "Dispensar" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Perfis Cura 15.04" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -764,33 +831,33 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "Imagem GIF" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "Não é possível seccionar com o material atual, uma vez que é incompatível com a impressora ou configuração selecionada." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "Não é possível Seccionar" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Não é possível seccionar com as definições atuais. As seguintes definições apresentam erros: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "Não é possível seccionar devido a algumas definições por modelo. As seguintes definições apresentam erros num ou mais modelos: {error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Não é possível seccionar porque a torre de preparação ou a(s) posição(ões) de preparação é(são) inválidas." @@ -801,18 +868,18 @@ msgstr "Não é possível seccionar porque a torre de preparação ou a(s) posi # contido pelo # se adapta? # cabem no...? -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Sem conteúdo para seccionar porque nenhum dos modelos está dentro do volume de construção. Por favor redimensione, mova ou rode os modelos para os adaptar ao volume de construção." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "A Processar Camadas" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "Informações" @@ -849,14 +916,14 @@ msgstr "Falha ao copiar os ficheiros do plug-in Siemens NX. Verifique o seu UGII msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Falha ao instalar o plug-in Siemens NX. Não foi possível definir a variável do ambiente UGII_USER_DIR para o Siemens NX." -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "Recomendado" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "Personalizado" @@ -867,24 +934,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "Ficheiro 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "Nozzle" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Falha ao obter ID do plug-in de {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "Atenção" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "Browser de plug-ins" @@ -899,18 +966,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Ficheiro G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "A analisar G-Code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "Detalhes do G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "Certifique-se de que o g-code é apropriado para a sua impressora e a respetiva configuração antes de enviar o ficheiro. A visualização do g-code poderá não ser correcta." @@ -921,6 +988,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Perfil Cura" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -952,146 +1029,119 @@ msgctxt "@action" msgid "Level build plate" msgstr "Nivelar base de construção" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Parede Exterior" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Paredes Interiores" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "Revestimento" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "Enchimento" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "Enchimento dos Suportes" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "Interface dos Suportes" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "Suportes" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "Contorno" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "Deslocação" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "Retrações" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "Outro" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "Desconhecido" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Ficheiro pré-seccionado {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "Nenhum material inserido" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "Material desconhecido" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "A procurar nova posição para os objetos" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "A Procurar Posição" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "Não é possível posicionar todos os objetos dentro do volume de construção" - -# rever! -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "Não é Possível Posicionar" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "O Ficheiro Já Existe" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "O ficheiro {0} já existe. Tem a certeza de que deseja substituí-lo?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "Personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "Material Personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "Global" - # rever! # Não substituído? # Sem alterar? -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "Manter" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "O material selecionado é incompatível com a máquina ou a configuração selecionada." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1112,67 +1162,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Desfazer a alteração do diâmetro do material." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Falha ao exportar perfil para {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Falha ao exportar perfil para {0}: O plug-in de gravação comunicou uma falha." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Perfil exportado para {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "Exportação bem-sucedida" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Falha ao importar perfil de {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Perfil {0} importado com êxito" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "O perfil {0} é de um formato de ficheiro desconhecido ou está corrompido." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "Perfil personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "O perfil não inclui qualquer tipo de qualidade." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "Não foi possível encontrar um tipo de qualidade {0} para a configuração atual." +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1183,147 +1255,170 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "Volume de construção" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Multiplicar e posicionar objetos" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "A Posicionar Objeto" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "Não é possível posicionar todos os objetos dentro do volume de construção" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "A procurar nova posição para os objetos" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "A Procurar Posição" + +# rever! +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "Não é Possível Posicionar" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "Relatório de Falhas" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " msgstr "" -"

    Ocorreu uma exceção fatal. Por favor envie-nos este Relatório de Falhas para podermos resolver o problema

    \n" -"

    Utilize o botão \"Enviar relatório\" para publicar um relatório de erros automaticamente nos nossos servidores

    \n" -" " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "Informações do sistema" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "Desconhecido" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Versão do Cura: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "Plataforma: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Versão Qt: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "Versão PyQt: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • Versão do OpenGL: {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • Vendedor do OpenGL: {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • Processador do OpenGL: {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "Determinação da origem da exceção" +msgid "Error traceback" +msgstr "" # rever! # Registos? -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "Relatórios" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "Descrição do utilizador" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "Enviar relatório" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "A carregar máquinas..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "A configurar cenário..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "A carregar interface..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Apenas pode ser carregado um ficheiro G-code de cada vez. Importação {0} ignorada" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Não é possível abrir outro ficheiro enquanto o G-code estiver a carregar. Importação {0} ignorada" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "O modelo selecionado era demasiado pequeno para carregar." @@ -1352,12 +1447,11 @@ msgstr "X (largura)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1447,68 +1541,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "A diferença de altura entre a ponta do nozzle e o sistema de pórtico (eixos X e Y). Utilizado para impedir colisões entre as impressões anteriores e o pórtico ao imprimir \"Individualmente\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "Número de Extrusores" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "O diâmetro nominal do filamento suportado pela impressora. O diâmetro exato será substituído pelo material e/ou perfil." - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "Diâmetro do material" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "Tamanho do nozzle" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "Gcode inicial" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Comandos Gcode a serem executados no início." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "Gcode final" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Comandos Gcode a serem executados no fim." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "Definições do Nozzle" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Tamanho do nozzle" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "O diâmetro nominal do filamento suportado pela impressora. O diâmetro exato será substituído pelo material e/ou perfil." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "Desvio X do Nozzle" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Desvio Y do Nozzle" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Gcode Inicial do Extrusor" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Gcode Final do Extrusor" @@ -1521,8 +1614,9 @@ msgstr "Lista das Alterações" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1606,7 +1700,7 @@ msgstr "Editar" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "Remover" @@ -1628,14 +1722,14 @@ msgid "Type" msgstr "Tipo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Extended" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1679,8 +1773,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "Introduza o endereço IP ou o nome de anfitrião da sua impressora na rede." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1701,6 +1793,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 não está configurado para alojar um grupo de impressoras Ultimaker 3 ligadas em rede" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1731,11 +1828,16 @@ msgid "Available" msgstr "Disponível" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "Perdeu-se a ligação com a impressora" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1827,88 +1929,200 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "Ativar Configuração" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Configuração do plug-in SolidWorks do Cura" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "Qualidade predefinida do STL exportado:" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "Perguntar sempre" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "Utilizar sempre Alta Resolução" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "Utilizar sempre Baixa resolução" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "Importar ficheiro SolidWorks como STL..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "Qualidade do STL Exportado" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "Qualidade" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "Baixa resolução" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "Alta resolução" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "Memorizar a minha escolha" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "Guardar" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "Esquema de cores" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "Cor do Material" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "Tipo de Linha" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "Velocidade de Alimentação" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "Espessura da Camada" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "Modo Compatibilidade" @@ -1916,32 +2130,32 @@ msgstr "Modo Compatibilidade" # rever! # Mostrar...? # Ver...? -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "Deslocações" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "Auxiliares" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "Invólucro" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "Enchimento" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "Mostrar Só Camadas Superiores" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "Mostrar 5 Camadas Superiores Detalhadas" @@ -1949,22 +2163,22 @@ msgstr "Mostrar 5 Camadas Superiores Detalhadas" # rever! # todas as strings com a frase # Topo / Base ?? -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "Superior / Inferior" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "Parede Interior" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "mín" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "máx" @@ -1989,7 +2203,7 @@ msgctxt "@label" msgid "Settings" msgstr "Definições" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Alterar scripts de pós-processamento ativos" @@ -2065,23 +2279,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "Suavização" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "Selecionar definições" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "Selecionar definições a personalizar para este modelo" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "Filtrar..." -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "Mostrar tudo" @@ -2453,66 +2697,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "Está tudo em ordem! O seu exame está concluído." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "Sem ligação a uma impressora" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "A impressora não aceita comandos" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "Em manutenção. Verifique a impressora" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "A imprimir..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Em pausa" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "A preparar..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "Remova a impressão" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "Retomar" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "Colocar em pausa" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "Cancelar impressão" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "Cancelar impressão" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "Tem a certeza de que deseja cancelar a impressão?" @@ -2547,19 +2791,19 @@ msgid "Customized" msgstr "Personalizado" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "Perguntar sempre isto" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "Descartar e não perguntar novamente" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "Manter e não perguntar novamente" @@ -2594,72 +2838,72 @@ msgctxt "@label" msgid "Brand" msgstr "Marca" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "Tipo de Material" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "Cor" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "Propriedades" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "Densidade" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "Diâmetro" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "Custo do Filamento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "Peso do Filamento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "Comprimento do filamento" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "Custo por Metro" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "Este material está associado a %1 e partilha algumas das suas propriedades." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "Desassociar Material" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "Descrição" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "Informações de Aderência" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "Definições de impressão" @@ -2700,7 +2944,7 @@ msgid "Unit" msgstr "Unidade" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "Geral" @@ -2715,234 +2959,259 @@ msgctxt "@label" msgid "Language:" msgstr "Idioma:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "Moeda:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "Tema:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "É necessário reiniciar a aplicação para que estas alterações sejam aplicadas." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "Seccionar automaticamente ao alterar as definições." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "Seccionar automaticamente" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "Comportamento da janela" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "Realçar, a vermelho, as áreas do modelo sem apoio. Sem suporte, estas áreas podem não ser impressas correctamente." # rever! # consolas? -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "Mostrar Saliências (Overhangs)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "Move a câmara de forma que o modelo fique no centro da visualização quando é selecionado um modelo" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "Centrar câmara ao selecionar item" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "O comportamento de zoom predefinido do Cura deve ser invertido?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "Inverta a direção do zoom da câmera." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "O zoom deve deslocar-se na direção do rato?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "Fazer Zoom na direção do rato" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "Os modelos, na plataforma, devem ser movidos para que não se intersectem?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "Garantir que os modelos não se interceptam" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "Pousar os modelos na base de construção?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "Pousar automaticamente os modelos na base de construção" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "Mostrar mensagem de aviso no leitor de gcode." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "Mensagem de aviso no leitor de gcode" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "A camada deve ser forçada a entrar no modo de compatibilidade?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "Forçar o modo de compatibilidade na visualização por camada (é necessário reiniciar)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "Abrir e guardar ficheiros" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "Os modelos devem ser redimensionados até ao volume de construção se forem demasiado grandes?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "Redimensionar modelos demasiado grandes" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "Um modelo pode parecer extremamente pequeno se, por exemplo, este tiver sido criado em metros e não em milímetros. Estes modelos devem ser redimensionados?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "Redimensionar modelos extremamente pequenos" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "Deve um prefixo com base no nome da impressora ser adicionado ao nome do trabalho de impressão automaticamente?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "Adicionar prefixo da máquina ao nome do trabalho" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "Deve ser apresentado um resumo ao guardar um ficheiro de projeto?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "Mostrar caixa de diálogo de resumo ao guardar projeto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "Comportamento predefinido ao abrir um ficheiro de projeto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "Comportamento predefinido ao abrir um ficheiro de projeto: " -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "Perguntar sempre" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "Abrir sempre como projeto" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "Importar sempre modelos" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "Quando tiver realizado alterações a um perfil e mudado para outro, será apresentada uma caixa de diálogo a perguntar se pretende manter as alterações. Caso contrário, pode escolher um comportamento predefinido, sendo que a caixa de diálogo nunca mais é apresentada." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "Substituir perfil" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "Privacidade" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "O Cura deve procurar atualizações quando o programa é iniciado?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "Procurar atualizações ao iniciar" # rever! # legal wording -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "Devem dados anónimos sobre a impressão ser enviados para a Ultimaker? Não são enviadas nem armazenadas quaisquer informações pessoais, incluindo modelos, endereços IP ou outro tipo de identificação pessoal." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "Enviar informações (anónimas) da impressão" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "Impressoras" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "Ativar" @@ -2985,7 +3254,7 @@ msgid "Waiting for a printjob" msgstr "A aguardar por um trabalho de impressão" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "Perfis" @@ -3011,13 +3280,13 @@ msgid "Duplicate" msgstr "Duplicar" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "Importar" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "Exportar" @@ -3083,7 +3352,7 @@ msgid "Export Profile" msgstr "Exportar perfil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "Materiais" @@ -3098,60 +3367,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "Impressora: %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "Criar" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "Duplicar" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "Importar material" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr "Não foi possível importar o material %1: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "Material %1 importado com êxito" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "Exportar Material" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "Falha ao exportar material para %1: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "Material exportado com êxito para %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "Adicionar Impressora" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "Nome da Impressora:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "Adicionar Impressora" @@ -3282,12 +3551,7 @@ msgctxt "@label" msgid "Profile:" msgstr "Perfil:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "Nenhum Perfil Disponível" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" @@ -3298,32 +3562,32 @@ msgstr "" "\n" "Clique para abrir o gestor de perfis." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "Procurar..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Copiar valor para todos os extrusores" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Esconder esta definição" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Não mostrar esta definição" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Manter esta definição visível" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Configurar visibilidade da definição..." @@ -3332,7 +3596,7 @@ msgstr "Configurar visibilidade da definição..." # ocultas? # escondidas? # valor normal? automatico? -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" @@ -3348,31 +3612,31 @@ msgstr "" # Influencia? # Altera? # Modifica? -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "Modifica" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "Modificado Por" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "Esta definição é sempre partilhada entre todos os extrusores. Ao alterá-la aqui, o valor será alterado em todos os extrusores" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" # rever! # contexto?! # resolvido? # por-extrusor -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "O valor é calculado com base nos valores por-extrusor " -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 msgctxt "@label" msgid "" "This setting has a value that is different from the profile.\n" @@ -3383,7 +3647,7 @@ msgstr "" "\n" "Clique para restaurar o valor do perfil." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" @@ -3396,12 +3660,12 @@ msgstr "" # rever! # Configuração da Impressão? -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Configurar Impressão" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" @@ -3410,59 +3674,59 @@ msgstr "" "Configuração da Impressão desativada\n" "Os ficheiros G-code não podem ser modificados" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00h00min" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "Especificação de tempo
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "Especificação de custos" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1 m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1 g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "Total:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1 m/~ %2 g/~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1 m/~ %2 g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Configuração de Impressão Recomendada

    Imprimir com as definições recomendadas para a Impressora, Material e Qualidade selecionadas." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Configuração de Impressão Personalizada

    Imprimir com um controlo detalhado de todas as definições específicas de cada uma das etapas do processo de seccionamento." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automático: %1" @@ -3472,6 +3736,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Visualizar" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3484,14 +3758,14 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Imprimir Modelo Selecionado Com:" msgstr[1] "Imprimir modelos selecionados com:" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplicar Modelo Selecionado" msgstr[1] "Multiplicar modelos selecionados" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "Número de Cópias" @@ -3507,7 +3781,7 @@ msgid "No printer connected" msgstr "Nenhuma impressora ligada" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "Extrusor" @@ -3623,210 +3897,240 @@ msgctxt "@label" msgid "Estimated time left" msgstr "Tempo restante estimado" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Alternar para e&crã inteiro" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Desfazer" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Refazer" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Sair" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "&Repor posição da câmara" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configurar Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Adicionar Impressora..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Gerir Im&pressoras..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Gerir Materiais..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Atualizar perfil com as definições/substituições atuais" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Descartar alterações atuais" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Criar perfil a partir das definições/substituições atuais..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Gerir Perfis..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Mostrar &documentação online" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Reportar um &erro" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&Sobre..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Apagar Modelo &Selecionado" msgstr[1] "Apagar Modelos &Selecionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Centrar modelo selecionado" msgstr[1] "Centrar modelos selecionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplicar modelo selecionado" msgstr[1] "Multiplicar modelos selecionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Apagar Modelo" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ce&ntrar Modelo na Base" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Agrupar Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Desagrupar Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Combinar Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Multiplicar Modelo..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Selecionar todos os modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Limpar base de construção" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Re&carregar todos os modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Dispor todos os modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Dispor seleção" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Repor todas as posições de modelos" # rever! # Cancelar todas? -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Repor Todas as &Transformações do Modelo" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Abrir Ficheiro(s)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Novo Projeto..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Mostrar ®isto de motor..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Mostrar pasta de configuração" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configurar visibilidade das definições..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "Procurar plug-ins..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "Plug-ins instalados..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Por favor abra um Modelo 3D ou Projeto" @@ -3834,12 +4138,12 @@ msgstr "Por favor abra um Modelo 3D ou Projeto" # rever! # Pronto para? # Preparado para? -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Disponível para seccionar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "A Seccionar..." @@ -3847,38 +4151,48 @@ msgstr "A Seccionar..." # rever! # Pronto para? # Preparado para? -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Disponível para %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Não é possível Seccionar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Seccionamento indisponível" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Preparar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Cancelar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Selecione o dispositivo de saída" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "Abrir ficheiro(s)" @@ -3898,114 +4212,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Ficheiro" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&Guardar seleção para ficheiro" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Guardar &como..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "Guardar projeto" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Editar" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "&Visualizar" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "&Definições" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&Impressora" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "&Material" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "&Perfil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Definir como Extrusor Ativo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "E&xtensões" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "P&lug-ins" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "P&referências" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Ajuda" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "Abrir ficheiro" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "Definições" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "Novo projeto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "Tem a certeza de que deseja iniciar um novo projeto? Isto irá apagar tudo na base de construção assim como quaisquer definições que não tenham sido guardadas." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "Instalar plug-in" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "Abrir ficheiro(s)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "Encontrámos um ou mais ficheiros G-Code nos ficheiros selecionados. Só é possível abrir um ficheiro G-Code de cada vez. Se pretender abrir um ficheiro G-code, selecione apenas um." @@ -4030,67 +4344,52 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Não mostrar novamente o resumo do projeto ao guardar" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "Guardar" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "Preparar" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "Monitorizar" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "Espessura da Camada" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "De momento está activo um perfil personalizado. Para poder ativar o controlo de qualidade, por favor selecione um dos perfis de qualidade predefinidos no modo Personalizado" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "Velocidade Impressão" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "Mais Lenta" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "Mais Rápida" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "Algumas definições do perfil foram modificadas. Se pretender alterá-las, aceda ao modo Personalizado." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "Enchimento" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "O enchimento gradual irá aumentar progressivamente a densidade do enchimento em direção ao topo." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "Enchimento Gradual" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "Criar Suportes" @@ -4098,12 +4397,12 @@ msgstr "Criar Suportes" # rever! # collapse ? # desmoronar? desabar? -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Criar estruturas para suportar partes do modelo, suspensas ou com saliências. Sem estas estruturas, essas partes do modelo podem desmoronar durante a impressão." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "Extrusor dos Suportes" @@ -4113,22 +4412,22 @@ msgstr "Extrusor dos Suportes" # sagging? deformar? # Isto irá construir estruturas de suporte debaixo do modelo para impedir a deformação de partes suspensas do modelo ou que a impressão seja feita no ar. # a utilizar? usado? -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "Selecionar qual o extrusor usado para imprimir os suportes. Isto irá construir estruturas de suporte por debaixo do modelo para impedir que as partes suspensas do modelo se deformem ou que sejam impressas no ar." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Aderência à Base" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "Permite a impressão de uma Aba (Brim) ou Raft. Isto irá adicionar, respectivamente, uma área plana em torno ou sob a base do seu objeto, que são fáceis de retirar posteriormente." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Precisa de ajuda para melhorar as suas impressões?
    Por favor leia os Guias Ultimaker de Resolução de Problemas" @@ -4145,17 +4444,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Abrir ficheiro de projeto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "Este ficheiro é um Projeto do Cura. Pretende abrir como Projeto ou só importar os modelos 3D incluídos no Projeto?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Memorizar a minha escolha" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "Abrir como projeto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "Importar modelos" @@ -4170,21 +4474,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Engine Log" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "Material" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "Verificar compatibilidade dos materiais" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Clique para verificar a compatibilidade dos materiais em Ultimaker.com." +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4278,6 +4597,26 @@ msgctxt "name" msgid "USB printing" msgstr "Impressão através de USB" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4298,6 +4637,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Ligação de rede UM3" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4310,8 +4659,8 @@ msgstr "Verificador Atualizações Firmware" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "Oferece a possibilidade de abrir determinados ficheiros através do SolidWorks. Estes são posteriormente convertidos e carregados para o Cura" +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4379,6 +4728,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "Leitor de perfis antigos do Cura" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4541,6 +4900,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Gravador de perfis Cura" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4585,3 +4954,160 @@ msgstr "Fornece suporte para importar perfis Cura." msgctxt "name" msgid "Cura Profile Reader" msgstr "Leitor de Perfis Cura" + +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "Desconhecido" + +# rever! +# versão PT do solidworks? +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "Foram encontrados erros ao abrir o seu ficheiro SolidWorks! Verifique se é possível abrir o ficheiro, sem quaisquer problemas, no SolidWorks!" + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "Erro ao iniciar %s!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "Ver Camadas" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "O Cura recolhe, de forma anónima, estatística das opções de seccionamento usadas. Se desejar pode desactivar esta opção nas preferências." + +# rever! +# contexto! +# pode ser _fechar_ +# dispensar +# ignorar +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "Dispensar" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "Global" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    Ocorreu uma exceção fatal. Por favor envie-nos este Relatório de Falhas para podermos resolver o problema

    \n" +#~ "

    Utilize o botão \"Enviar relatório\" para publicar um relatório de erros automaticamente nos nossos servidores

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Versão do Cura: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "Plataforma: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Versão Qt: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "Versão PyQt: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "Determinação da origem da exceção" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "Diâmetro do material" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker 3 Extended" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Configuração do plug-in SolidWorks do Cura" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "Qualidade predefinida do STL exportado:" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "Perguntar sempre" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "Utilizar sempre Alta Resolução" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "Utilizar sempre Baixa resolução" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "Importar ficheiro SolidWorks como STL..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "Qualidade do STL Exportado" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "Qualidade" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "Baixa resolução" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "Alta resolução" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "Nenhum Perfil Disponível" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "Esta definição é sempre partilhada entre todos os extrusores. Ao alterá-la aqui, o valor será alterado em todos os extrusores" + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "Especificação de tempo
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "&Repor posição da câmara" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "Guardar projeto" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "Preparar" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "Monitorizar" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "Verificar compatibilidade dos materiais" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "Oferece a possibilidade de abrir determinados ficheiros através do SolidWorks. Estes são posteriormente convertidos e carregados para o Cura" diff --git a/resources/i18n/pt_PT/fdmextruder.def.json.po b/resources/i18n/pt_PT/fdmextruder.def.json.po index a77b31c6e9..46f333a02e 100644 --- a/resources/i18n/pt_PT/fdmextruder.def.json.po +++ b/resources/i18n/pt_PT/fdmextruder.def.json.po @@ -56,8 +56,7 @@ msgstr "Diâmetro do Nozzle" #: 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 "" -"O diâmetro interno do nozzle. Altere esta definição quando utilizar um nozzle com um tamanho não convencional." +msgstr "O diâmetro interno do nozzle. Altere esta definição quando utilizar um nozzle com um tamanho não convencional." #: fdmextruder.def.json msgctxt "machine_nozzle_offset_x label" @@ -97,9 +96,7 @@ msgstr "Posição Inicial Absoluta do Extrusor" #: 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 "" -"Define a posição inicial do extrusor, absoluta em vez de relativa à última posição conhecida da cabeça de " -"impressão." +msgstr "Define a posição inicial do extrusor, absoluta em vez de relativa à última posição conhecida da cabeça de impressão." #: fdmextruder.def.json msgctxt "machine_extruder_start_pos_x label" @@ -139,9 +136,7 @@ msgstr "Posição Final Absoluta do Extrusor" #: 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 "" -"Define a posição final do extrusor, absoluta em vez de relativa à última posição conhecida da cabeça de " -"impressão." +msgstr "Define a posição final do extrusor, absoluta em vez de relativa à última posição conhecida da cabeça de impressão." #: fdmextruder.def.json msgctxt "machine_extruder_end_pos_x label" diff --git a/resources/i18n/pt_PT/fdmprinter.def.json.po b/resources/i18n/pt_PT/fdmprinter.def.json.po index d72abef2fd..8340465a37 100644 --- a/resources/i18n/pt_PT/fdmprinter.def.json.po +++ b/resources/i18n/pt_PT/fdmprinter.def.json.po @@ -357,6 +357,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -620,33 +630,6 @@ 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 "A espessura da camada inicial em milímetros. Uma camada inicial mais espessa facilita a aderência à base de construção." -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "Tolerância do Seccionamento" - -# rever! -# centro ou meio? -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "Métodos para seccionar as camadas com as superfícies diagonais. As áreas de uma camada podem ser geradas onde o centro da camada intersecta a superfície (Centro). Como alternativa, cada camada pode conter as áreas que se encontram no interior do volume ao longo da espessura da camada (Exclusivo) ou uma camada pode conter as áreas que se encontram no interior dos perímetros da camada (Inclusivo). A opção Exclusivo retém o maior número de detalhes, a opção Inclusivo garante a melhor adaptação ao modelo e a opção Centro tem o menor tempo de processamento." - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "Centro" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "Exclusivo" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "Inclusivo" - # rever! # Diâmetro da linha? # ou @@ -691,16 +674,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "O diâmetro de uma única linha de parede para todas as linhas de parede excepto a mais exterior." -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "Diâmetro Linha Revestimento Superior" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "O diâmetro de uma única linha das superfícies de revestimento na parte superior da impressão." - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -884,41 +857,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "O número de camadas de revestimento da superfície superior. Por norma, uma só camada superior é suficiente para gerar superfícies superiores de maior qualidade." -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "Padrão Revestimento Superior" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "O padrão geométrico das camadas de revestimento da superfície superior." - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "Linhas" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "Concêntrico" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Ziguezague" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "Direções Linha Revestimento Superior" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "Uma lista de ângulos (números inteiros) relativos às direções de linha a utilizar quando as camadas de revestimento da superfície superior utilizarem o padrão de Linhas ou Ziguezague. Os valores da lista são utilizados em sequência, à medida que as camadas progridem, voltando ao início assim que a lista chega ao fim. Os itens da lista são separados por vírgulas e a lista completa é escrita entre parênteses retos. Por defeito a lista está vazia, o que significa a utilização dos ângulos predefinidos tradicionais (45 e 135 graus)." - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1054,6 +992,19 @@ 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 "Desvio aplicado à trajetória da parede exterior. Se a parede exterior for menor que o nozzle e impressa depois das paredes interiores, utilize este desvio para que o buraco do nozzle se sobreponha às paredes interiores e não ao exterior do modelo." +# rever! +# ordem de -impressão- das paredes? +# incluir _Impressão_? +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "Otimizar Ordem Paredes" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "Otimizar a ordem pela qual as paredes são impressas de forma a reduzir o número de retrações e a distância percorrida. A maioria das peças irá beneficiar com a ativação desta opção, mas algumas podem na realidade demorar mais tempo, portanto, por favor compare as estimativas do tempo de impressão com e sem otimização." + # antes das interiores? #: fdmprinter.def.json msgctxt "outer_inset_first label" @@ -1129,6 +1080,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "Em todo o lado" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1555,8 +1516,8 @@ msgstr "Deslocar Enchimento em X" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "O padrão geométrico de enchimento é deslocado por esta distância ao longo do eixo X." +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" # Desvio? # Delocar? deslocamento @@ -1568,8 +1529,8 @@ msgstr "Deslocar Enchimento em Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "O padrão geométrico de enchimento é deslocado por esta distância ao longo do eixo Y." +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1588,8 +1549,8 @@ msgstr "Sobreposição Enchimento (%)" #: 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 "A Percentagem de sobreposição entre o enchimento e as paredes. Uma ligeira sobreposição permite que as paredes sejam ligadas firmemente ao enchimento." +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1606,12 +1567,10 @@ msgctxt "skin_overlap label" msgid "Skin Overlap Percentage" msgstr "Sobreposição Revestimento (%)" -# rever! -# Esta é uma percentagem das larguras médias de linha das linhas de revestimento e da parede mais interna. #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "A sobreposição entre o revestimento e as paredes, como percentagem do diâmetro da linha. Uma ligeira sobreposição permite que as paredes se liguem firmemente ao revestimento. Esta é uma percentagem da média dos diâmetros da linha de revestimento e da parede mais interior." +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1773,16 +1732,6 @@ msgctxt "material description" msgid "Material" msgstr "Material" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -msgstr "Temperatura automática" - -#: 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 "Mudar, automaticamente, a temperatura de cada camada com a velocidade de fluxo média dessa camada." - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1838,16 +1787,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "A temperatura à qual o arrefecimento é iniciado imediatamente antes do final da impressão." -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "Gráfico de temperatura de fluxo" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "Os dados que ligam o fluxo de material (em mm3 por segundo) à temperatura (graus Celsius)." - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1865,8 +1804,8 @@ msgstr "Temperatura da base de construção" #: 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 "A temperatura utilizada para a base de construção aquecida. Se for 0, a base não será aquecida para esta impressão." +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3600,6 +3539,16 @@ 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 "O ângulo do topo de uma torre. Um valor mais elevado resulta em tectos de torre pontiagudos, enquanto um valor mais reduzido resulta em tectos de torre achatados." +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "Malha de suporte pendente" + +#: 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 "Cria suporte em qualquer local abaixo da malha de suporte, para que não existam saliências na malha de suporte." + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -4260,16 +4209,6 @@ 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 "Geralmente, o Cura tenta remendar pequenos buracos na malha e remover partes de uma camada com buracos grandes. Ativar esta opção conserva as peças que não podem ser remendadas. Esta opção deve ser utilizada como último recurso quando tudo o resto não produz um GCode adequado." -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "Resolução máxima" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "O tamanho mínimo de um segmento após o seccionamento. Se aumentar este valor, a malha terá uma resolução menor. Isto poderá permitir que a impressora acompanhe a velocidade que tem para processar o g-code e irá aumentar a velocidade de seccionamento ao remover os detalhes da malha que não podem ser processados." - # rever! # does it apply only to Merged obkects (menu) or individual objects that touch # merged - combinadas? - fundidas? @@ -4430,16 +4369,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "Utilize esta malha para especificar áreas de suporte. Esta opção pode ser utilizada para gerar estruturas de suporte." -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -msgstr "Malha de suporte pendente" - -#: 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 "Cria suporte em qualquer local abaixo da malha de suporte, para que não existam saliências na malha de suporte." - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4517,18 +4446,197 @@ msgctxt "experimental description" msgid "experimental!" msgstr "experimental!" -# rever! -# ordem de -impressão- das paredes? -# incluir _Impressão_? #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "Otimizar Ordem Paredes" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "Otimizar a ordem pela qual as paredes são impressas de forma a reduzir o número de retrações e a distância percorrida. A maioria das peças irá beneficiar com a ativação desta opção, mas algumas podem na realidade demorar mais tempo, portanto, por favor compare as estimativas do tempo de impressão com e sem otimização." +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "Tolerância do Seccionamento" + +# rever! +# centro ou meio? +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "Métodos para seccionar as camadas com as superfícies diagonais. As áreas de uma camada podem ser geradas onde o centro da camada intersecta a superfície (Centro). Como alternativa, cada camada pode conter as áreas que se encontram no interior do volume ao longo da espessura da camada (Exclusivo) ou uma camada pode conter as áreas que se encontram no interior dos perímetros da camada (Inclusivo). A opção Exclusivo retém o maior número de detalhes, a opção Inclusivo garante a melhor adaptação ao modelo e a opção Centro tem o menor tempo de processamento." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "Centro" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "Exclusivo" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "Inclusivo" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "Diâmetro Linha Revestimento Superior" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "O diâmetro de uma única linha das superfícies de revestimento na parte superior da impressão." + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "Padrão Revestimento Superior" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "O padrão geométrico das camadas de revestimento da superfície superior." + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "Linhas" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "Concêntrico" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Ziguezague" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "Direções Linha Revestimento Superior" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "Uma lista de ângulos (números inteiros) relativos às direções de linha a utilizar quando as camadas de revestimento da superfície superior utilizarem o padrão de Linhas ou Ziguezague. Os valores da lista são utilizados em sequência, à medida que as camadas progridem, voltando ao início assim que a lista chega ao fim. Os itens da lista são separados por vírgulas e a lista completa é escrita entre parênteses retos. Por defeito a lista está vazia, o que significa a utilização dos ângulos predefinidos tradicionais (45 e 135 graus)." + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Temperatura automática" + +#: 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 "Mudar, automaticamente, a temperatura de cada camada com a velocidade de fluxo média dessa camada." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "Gráfico de temperatura de fluxo" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "Os dados que ligam o fluxo de material (em mm3 por segundo) à temperatura (graus Celsius)." + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "Resolução máxima" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "O tamanho mínimo de um segmento após o seccionamento. Se aumentar este valor, a malha terá uma resolução menor. Isto poderá permitir que a impressora acompanhe a velocidade que tem para processar o g-code e irá aumentar a velocidade de seccionamento ao remover os detalhes da malha que não podem ser processados." # rever! # Is the english string correct? for the label? @@ -5143,6 +5251,46 @@ 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 "Distância entre o nozzle e as linhas horizontais descendentes. Uma maior folga resulta em linhas horizontais descendentes com um ângulo menos acentuado, o que, por sua vez, resulta em menos ligações ascendentes com a camada seguinte. Aplica-se apenas à impressão de fios." +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -5202,3 +5350,25 @@ msgstr "Matriz Rotação da Malha" msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Matriz de transformação a ser aplicada no modelo ao abrir o ficheiro." + +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "O padrão geométrico de enchimento é deslocado por esta distância ao longo do eixo X." + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "O padrão geométrico de enchimento é deslocado por esta distância ao longo do eixo Y." + +#~ 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 "A Percentagem de sobreposição entre o enchimento e as paredes. Uma ligeira sobreposição permite que as paredes sejam ligadas firmemente ao enchimento." + +# rever! +# Esta é uma percentagem das larguras médias de linha das linhas de revestimento e da parede mais interna. +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "A sobreposição entre o revestimento e as paredes, como percentagem do diâmetro da linha. Uma ligeira sobreposição permite que as paredes se liguem firmemente ao revestimento. Esta é uma percentagem da média dos diâmetros da linha de revestimento e da parede mais interior." + +#~ 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 "A temperatura utilizada para a base de construção aquecida. Se for 0, a base não será aquecida para esta impressão." diff --git a/resources/i18n/ru_RU/cura.po b/resources/i18n/ru_RU/cura.po index a953a8c87e..ff07772555 100644 --- a/resources/i18n/ru_RU/cura.po +++ b/resources/i18n/ru_RU/cura.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Ruslan Popov \n" "Language-Team: Ruslan Popov\n" @@ -18,7 +18,7 @@ msgstr "" "X-Generator: Poedit 2.0.4\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "Параметры принтера" @@ -55,12 +55,11 @@ msgstr "Соединение с Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -100,7 +99,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Открыть Doodle3D Connect web интерфейс" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Показать журнал изменений" @@ -115,78 +114,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "Профиль был нормализован и активирован." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "USB печать" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "Печатать через USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "Печатать через USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "Подключено через USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Невозможно запустить новое задание, потому что принтер занят или не подключен." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "Принтер недоступен" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Данный принтер не поддерживает печать через USB, потому что он использует UltiGCode диалект." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "USB печать" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Невозможно запустить новую задачу, так как принтер не поддерживает печать через USB." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "Внимание" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "Невозможно обновить прошивку, потому что не были найдены подключенные принтеры." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "Не могу найти прошивку, подходящую для принтера в %s." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "Прошивка принтера" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -230,11 +234,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Невозможно сохранить на внешний носитель {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "Ошибка" @@ -284,7 +288,7 @@ msgid "Removable Drive" msgstr "Внешний носитель" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Печать через сеть" @@ -398,110 +402,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "Состояние принтера" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Невозможно запустить новую задачу на печать. PrinterCore не был загружен в слот {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Невозможно запустить новую задачу на печать. Материал не загружен в слот {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Недостаточно материала в катушке {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Разный PrintCore (Cura: {0}, Принтер: {1}) выбран для экструдера {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Разный материал (Cura: {0}, Принтер: {1}) выбран для экструдера {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "PrintCore {0} не откалибровано. Необходимо выполнить XY калибровку для принтера." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Вы уверены, что желаете печатать с использованием выбранной конфигурации?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "Есть несовпадение между конфигурацией или калибровкой принтера и Cura. Для лучшего результата, всегда производите слайсинг для PrintCore и материала, которые установлены в вашем принтере." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Несовпадение конфигурации" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "Отправка новых заданий (временно) заблокирована, идёт отправка предыдущего задания." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Отправка данных на принтер" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "Отправка данных" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Невозможно отправить данные на принтер. Другая задача всё ещё активна?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Прерывание печати…" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Печать прервана. Пожалуйста, проверьте принтер" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Печать приостановлена..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Печать возобновлена..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Синхронизация с вашим принтером" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Желаете использовать текущую конфигурацию принтера в Cura?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "Модуль PrintCore и/или материал в вашем принтере отличается от тех, что вы используете в текущем проекте. Для наилучшего результата всегда указывайте правильный модуль PrintCore и материалы, которые вставлены в ваш принтер." @@ -522,145 +526,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "{printer_name} завершил печать '{job_name}'. Пожалуйста, освободите область печати." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} назначен для печати '{job_name}'. Пожалуйста, измените конфигурацию принтера, чтобы она соответствовала заданию." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Невозможно отправить новое задание: данный 3D принтер (ещё) не настроен на управление группой подключенных принтеров Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Невозможно отправить задание на группу {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "Отправка {file_name} на группу {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "Показать задания на печать" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "Открыть интерфейс с заданиями печати в вашем браузере." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "Неизвестный" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "{printer_name} завершил печать '{job_name}'." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "Печать завершена" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "Необходимое действие" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "Отправляем {file_name} на группу {cluster_name}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "Подключиться через сеть" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "Для {machine_name} доступны новые функции! Рекомендуется обновить встроенное программное обеспечение принтера." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Доступна новая прошивка %s" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "Порядок обновления" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "Не могу получить информацию об обновлениях." -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "Возникли ошибки во время открытия файла SolidWorks! Пожалуйста, проверьте может ли SolidWorks открыть этот файл без проблем!" +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "Файл компонентов SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "Файл сборки SolidWorks" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "Настройка" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "Ошибка при запуске %s!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "Вид моделирования" +msgid "Layer view" +msgstr "Просмотр слоёв" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "Cura не аккуратно отображает слои при использовании печати через кабель" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "Вид моделирования" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "Изменить G-код" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "Cura собирает анонимную статистику о нарезке модели. Вы можете отключить это в настройках." +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -669,14 +716,41 @@ msgstr "Сбор данных" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "Отменить" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Профили Cura 15.04" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -708,49 +782,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "GIF изображение" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "Невозможно нарезать модель, используя текущий материал, так как он несовместим с выбранной машиной или конфигурацией." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "Невозможно нарезать" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Не могу выполнить слайсинг на текущих настройках. Проверьте следующие настройки: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "Не удалось выполнить слайсинг из-за настроек модели. Следующие настройки ошибочны для одной или нескольких моделей: {error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Слайсинг невозможен так как черновая башня или её позиция неверные." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Нечего нарезать, так как ни одна модель не попадает в объём принтера. Пожалуйста, отмасштабируйте или поверните модель." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "Обработка слоёв" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "Информация" @@ -787,14 +861,14 @@ msgstr "Не удалось скопировать файлы плагинов S msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Не удалось установить плагин Siemens NX. Не удалось установить переменную среды UGII_USER_DIR для Siemens NX." -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "Рекомендованная" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "Своя" @@ -805,24 +879,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "Файл 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "Сопло" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Невозможно получить идентификатор плагин {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "Внимание" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "Браузер плагинов" @@ -837,18 +911,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Файл G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "Обработка G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "Параметры G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "Перед отправкой G-code на принтер удостоверьтесь в его соответствии вашему принтеру и его настройкам. Возможны неточности в G-code." @@ -859,6 +933,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Профиль Cura" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -890,142 +974,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "Выравнивание стола" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Внешняя стенка" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Внутренние стенки" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "Покрытие" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "Заполнение" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "Заполнение поддержек" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "Связующий слой поддержек" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "Поддержки" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "Юбка" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "Перемещение" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "Откаты" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "Другое" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "Неизвестно" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Предообратка файла {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "Материал не загружен" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "Неизвестный материал" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "Поиск места для новых объектов" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "Поиск места" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "Невозможно разместить все объекты внутри печатаемого объёма" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "Не могу найти место" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "Файл уже существует" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "Файл {0} уже существует. Вы уверены, что желаете перезаписать его?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "Своё" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "Собственный материал" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "Общие" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "Не переопределен" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Выбранный материал несовместим с выбранным принтером или конфигурацией." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1046,67 +1104,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Отмена изменения диаметра материала." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Невозможно экспортировать профиль в {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Невозможно экспортировать профиль в {0}: Плагин записи уведомил об ошибке." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Экспортирование профиля в {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "Экспорт успешно завершен" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Невозможно импортировать профиль из {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Успешно импортирован профиль {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Профиль {0} имеет неизвестный тип файла или повреждён." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "Собственный профиль" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "У профайла отсутствует тип качества." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "Невозможно найти тип качества {0} для текущей конфигурации." +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1117,142 +1197,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "Объём печати" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Размножение и размещение объектов" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "Размещение объекта" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "Невозможно разместить все объекты внутри печатаемого объёма" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "Поиск места для новых объектов" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "Поиск места" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "Не могу найти место" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "Отчёт о сбое" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    Произошло критическое исключение. Отправьте нам этот отчёт о сбое, чтобы мы могли устранить проблему

    \n

    Нажмите кнопку «Отправить отчёт», чтобы автоматически отправить отчёт об ошибке на наш сервер

    \n " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "Информация о системе" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "Неизвестно" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Версия Cura: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "Платформа: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Версия Qt: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "Версия PyQt: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • Версия OpenGL: {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • Поставщик OpenGL: {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • Средство визуализации OpenGL: {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "Диагностика исключения" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "Журналы" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "Описание пользователя" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "Отправить отчёт" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Загрузка принтеров..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Настройка сцены..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Загрузка интерфейса..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f мм" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Только один G-code файла может быть загружен в момент времени. Пропускаю импортирование {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Невозможно открыть любой другой файл, если G-code файл уже загружен. Пропускаю импортирование {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "Выбранная модель слишком мала для загрузки." @@ -1281,12 +1386,11 @@ msgstr "X (Ширина)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "мм" @@ -1376,68 +1480,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "Разница в высоте от кончика сопла до портала (по осям X и Y). Используется для предотвращения столкновений с уже напечатанной частью и головой в режиме \"По отдельности\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "Количество экструдеров" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "Номинальный диаметр материала, поддерживаемый принтером. Точный диаметр будет указан в материале и/или в профиле." - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "Диаметр материала" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "Диаметр сопла" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "Начало G-кода" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Команды в G-коде, которые будут выполнены при старте печати." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "Конец G-кода" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Команды в G-коде, которые будут выполнены в конце печати." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "Параметры сопла" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Диаметр сопла" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "Номинальный диаметр материала, поддерживаемый принтером. Точный диаметр будет указан в материале и/или в профиле." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "Смещение сопла по оси X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Смещение сопла по оси Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "G-код старта экструдера" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "G-код завершения экструдера" @@ -1450,8 +1553,9 @@ msgstr "Журнал изменений" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1516,7 +1620,10 @@ 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 "Для печати на вашем принтере через сеть, пожалуйста, удостоверьтесь, что ваш принтер подключен к сети с помощью кабеля или через WiFi. Если вы не подключили Cura к вашему принтеру, вы по прежнему можете использовать USB флешку для переноса G-Code файлов на ваш принтер.\n\nУкажите ваш принтер в списке ниже:" +msgstr "" +"Для печати на вашем принтере через сеть, пожалуйста, удостоверьтесь, что ваш принтер подключен к сети с помощью кабеля или через WiFi. Если вы не подключили Cura к вашему принтеру, вы по прежнему можете использовать USB флешку для переноса G-Code файлов на ваш принтер.\n" +"\n" +"Укажите ваш принтер в списке ниже:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1532,7 +1639,7 @@ msgstr "Правка" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "Удалить" @@ -1554,14 +1661,14 @@ msgid "Type" msgstr "Тип" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Расширенный" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1605,8 +1712,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "Введите IP адрес принтера или его имя в сети." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1627,6 +1732,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 не настроен для управления группой подключенных принтеров Ultimaker 3" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1657,11 +1767,16 @@ msgid "Available" msgstr "Доступен" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "Потеряно соединение с принтером" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1753,138 +1868,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "Активировать конфигурацию" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Конфигурация плагина SolidWorks" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "Качество по-умолчанию экспортируемого STL:" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "Всегда спрашивать" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "Всегда использовать хорошее качество" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "Всегда использовать грубое качество" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "Импортировать SolidWorks файл как STL..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "Качество экспортируемого STL" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "Качество" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "Грубое" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "Хорошее" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "Запомнить мой выбор" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "Сохранить" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "Цветовая схема" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "Цвет материала" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "Тип линии" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "Скорость подачи" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "Толщина слоя" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "Режим совместимости" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "Показать движения" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "Показать поддержку" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "Показать стенки" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "Показать заполнение" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "Показать только верхние слои" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "Показать 5 детализированных слоёв сверху" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "Дно / крышка" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "Внутренняя стенка" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "мин." -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "макс." @@ -1909,7 +2136,7 @@ msgctxt "@label" msgid "Settings" msgstr "Параметры" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Изменить активные скрипты пост-обработки" @@ -1984,23 +2211,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "Сглаживание" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "Выберите параметры" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "Выберите параметр для изменения этой модели" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "Фильтр..." -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "Показать всё" @@ -2170,7 +2427,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Этот плагин содержит лицензию.\nЧтобы установить этот плагин, необходимо принять условия лицензии.\nПринять приведенные ниже условия?" +msgstr "" +"Этот плагин содержит лицензию.\n" +"Чтобы установить этот плагин, необходимо принять условия лицензии.\n" +"Принять приведенные ниже условия?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2361,66 +2621,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "Всё в порядке! Проверка завершена." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "Не подключен к принтеру" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "Принтер не принимает команды" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "В режиме обслуживания. Пожалуйста, проверьте принтер" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Печать..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Приостановлен" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Подготовка..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "Пожалуйста, удалите напечатанное" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "Продолжить" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "Пауза" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "Прервать печать" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "Прекращение печати" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "Вы уверены, что желаете прервать печать?" @@ -2435,7 +2695,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Вы изменили некоторые параметры профиля.\nЖелаете сохранить их или вернуть к прежним значениям?" +msgstr "" +"Вы изменили некоторые параметры профиля.\n" +"Желаете сохранить их или вернуть к прежним значениям?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2453,19 +2715,19 @@ msgid "Customized" msgstr "Свой" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "Всегда спрашивать меня" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "Сбросить и никогда больше не спрашивать" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "Сохранить и никогда больше не спрашивать" @@ -2500,72 +2762,72 @@ msgctxt "@label" msgid "Brand" msgstr "Брэнд" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "Тип материала" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "Цвет" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "Свойства" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "Плотность" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "Диаметр" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "Стоимость материала" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "Вес материала" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "Длина материала" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "Стоимость метра" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "Данный материал привязан к %1 и имеет ряд его свойств." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "Отвязать материал" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "Описание" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "Информация об адгезии" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "Параметры печати" @@ -2606,7 +2868,7 @@ msgid "Unit" msgstr "Единица" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "Общее" @@ -2621,230 +2883,255 @@ msgctxt "@label" msgid "Language:" msgstr "Язык:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "Валюта:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "Тема:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "Для применения данных изменений вам потребуется перезапустить приложение." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "Нарезать автоматически при изменении настроек." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "Нарезать автоматически" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "Поведение окна" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "Подсвечивать красным области модели, требующие поддержек. Без поддержек эти области не будут напечатаны правильно." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "Отобразить нависания" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "Перемещать камеру так, чтобы выбранная модель помещалась в центр экрана" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "Центрировать камеру на выбранном объекте" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "Следует ли инвертировать стандартный способ увеличения в Cura?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "Инвертировать направление увеличения камеры." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "Увеличивать по мере движения мышкой?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "Увеличивать по движению мышки" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "Следует ли размещать модели на столе так, чтобы они больше не пересекались?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "Удостовериться, что модели размещены рядом" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "Следует ли опустить модели на стол?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "Автоматически опускать модели на стол" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "Показывать важное сообщение при чтении G-кода." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "Важное сообщение при чтении G-кода" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "Должен ли слой быть переведён в режим совместимости?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "Просматривать слои в режиме совместимости (требуется перезапуск)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "Открытие и сохранение файлов" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "Масштабировать ли модели для размещения внутри печатаемого объёма, если они не влезают в него?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "Масштабировать большие модели" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "Модель может показаться очень маленькой, если её размерность задана в метрах, а не миллиметрах. Следует ли масштабировать такие модели?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "Масштабировать очень маленькие модели" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "Надо ли автоматически добавлять префикс, основанный на имени принтера, к названию задачи на печать?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "Добавить префикс принтера к имени задачи" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "Показывать сводку при сохранении файла проекта?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "Показывать сводку при сохранении проекта" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "Стандартное поведение при открытии файла проекта" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "Стандартное поведение при открытии файла проекта: " -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "Всегда спрашивать" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "Всегда открывать как проект" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "Всегда импортировать модели" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "При внесении изменений в профиль и переключении на другой, будет показан диалог, запрашивающий ваше решение о сохранении ваших изменений, или вы можете указать стандартное поведение и не показывать такой диалог." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "Переопределение профиля" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "Приватность" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "Должна ли Cura проверять обновления программы при старте?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "Проверять обновления при старте" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "Можно ли отправлять анонимную информацию о вашей печати в Ultimaker? Следует отметить, что ни модели, ни IP адреса и никакая другая персональная информация не будет отправлена или сохранена." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "Отправлять (анонимно) информацию о печати" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "Принтеры" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "Активировать" @@ -2887,7 +3174,7 @@ msgid "Waiting for a printjob" msgstr "Ожидаем задание на печать" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "Профили" @@ -2913,13 +3200,13 @@ msgid "Duplicate" msgstr "Дублировать" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "Импорт" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "Экспорт" @@ -2985,7 +3272,7 @@ msgid "Export Profile" msgstr "Экспортировать профиль" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "Материалы" @@ -3000,60 +3287,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "Принтер: %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "Создать" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "Дублировать" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "Импортировать материал" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr "Не могу импортировать материал %1: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "Успешно импортированный материал %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "Экспортировать материал" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "Не могу экспортировать материал %1: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "Материал успешно экспортирован в %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "Добавление принтера" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "Имя принтера:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "Добавить принтер" @@ -3078,7 +3365,9 @@ 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 разработана компанией Ultimaker B.V. совместно с сообществом.\nCura использует следующие проекты с открытым исходным кодом:" +msgstr "" +"Cura разработана компанией Ultimaker B.V. совместно с сообществом.\n" +"Cura использует следующие проекты с открытым исходным кодом:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3180,158 +3469,167 @@ msgctxt "@label" msgid "Profile:" msgstr "Профиль:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "отсутствуют доступные профили" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 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 "Значения некоторых параметров отличаются от значений профиля.\n\nНажмите для открытия менеджера профилей." +msgstr "" +"Значения некоторых параметров отличаются от значений профиля.\n" +"\n" +"Нажмите для открытия менеджера профилей." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "Поиск..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Скопировать значение для всех экструдеров" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Спрятать этот параметр" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Не показывать этот параметр" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Оставить этот параметр видимым" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Настроить видимость параметров..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Некоторые из скрытых параметров используют значения, отличающиеся от их вычисленных значений.\n\nЩёлкните. чтобы сделать эти параметры видимыми." +msgstr "" +"Некоторые из скрытых параметров используют значения, отличающиеся от их вычисленных значений.\n" +"\n" +"Щёлкните. чтобы сделать эти параметры видимыми." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "Влияет на" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "Зависит от" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "Этот параметр всегда действует на все экструдеры. Его изменение повлияет на все экструдеры" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "Значение получается из параметров каждого экструдера " -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 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 "Значение этого параметра отличается от значения в профиле.\n\nЩёлкните для восстановления значения из профиля." +msgstr "" +"Значение этого параметра отличается от значения в профиле.\n" +"\n" +"Щёлкните для восстановления значения из профиля." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 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 "Обычно это значение вычисляется, но в настоящий момент было установлено явно.\n\nЩёлкните для восстановления вычисленного значения." +msgstr "" +"Обычно это значение вычисляется, но в настоящий момент было установлено явно.\n" +"\n" +"Щёлкните для восстановления вычисленного значения." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Настройка печати" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Настройка принтера отключена\nG-code файлы нельзя изменять" +msgstr "" +"Настройка принтера отключена\n" +"G-code файлы нельзя изменять" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00 ч 00 мин" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "Формат отображения времени
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "Настройка расчета стоимости" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1 м" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1 г" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "Итого:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1 м / ~ %2 г / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1 м / ~ %2 г" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Рекомендованные параметры печати

    Печатайте с рекомендованными параметрами для выбранных принтера, материала и качества." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Свои параметры печати

    Печатайте с полным контролем над каждой особенностью процесса слайсинга." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Автоматически: %1" @@ -3341,6 +3639,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "Вид" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3354,7 +3662,7 @@ msgstr[0] "Печать выбранной модели:" msgstr[1] "Печать выбранных моделей:" msgstr[2] "Печать выбранных моделей:" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" @@ -3362,7 +3670,7 @@ msgstr[0] "Размножить выбранную модель" msgstr[1] "Размножить выбранные модели" msgstr[2] "Размножить выбранные моделей" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "Количество копий" @@ -3378,7 +3686,7 @@ msgid "No printer connected" msgstr "Принтер не подключен" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "Экструдер" @@ -3488,87 +3796,107 @@ msgctxt "@label" msgid "Estimated time left" msgstr "Осталось примерно" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Полный экран" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "Отмена" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "Возврат" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "Выход" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "&Сбросить положение камеры" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Настроить Cura…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "Добавить принтер..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Управление принтерами..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Управление материалами…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "Обновить профиль, используя текущие параметры" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "Сбросить текущие параметры" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "Создать профиль из текущих параметров…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Управление профилями..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Показать онлайн документацию" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Отправить отчёт об ошибке" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "О Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" @@ -3576,7 +3904,7 @@ msgstr[0] "Удалить выбранную модель" msgstr[1] "Удалить выбранные модели" msgstr[2] "Удалить выбранные модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" @@ -3584,7 +3912,7 @@ msgstr[0] "Центрировать выбранную модель" msgstr[1] "Центрировать выбранные модели" msgstr[2] "Центрировать выбранные модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" @@ -3592,153 +3920,173 @@ msgstr[0] "Размножить выбранную модель" msgstr[1] "Размножить выбранные модели" msgstr[2] "Размножить выбранные модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Удалить модель" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Поместить модель по центру" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Сгруппировать модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Разгруппировать модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Объединить модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "Дублировать модель..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "Выбрать все модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "Очистить стол" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Перезагрузить все модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Выровнять все модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Выровнять выбранные" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Сбросить позиции всех моделей" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Сбросить преобразования всех моделей" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "Открыть файл(ы)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "Новый проект..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Показать журнал движка..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Показать конфигурационный каталог" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Видимость параметров…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "Просмотр плагинов..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "Установленные плагины..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Пожалуйста, загрузите 3D модель" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Готов к нарезке" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Нарезка на слои..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Готов к %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Невозможно нарезать" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Нарезка недоступна" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Подготовка" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Отмена" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Выберите активное целевое устройство" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "Открыть файл(ы)" @@ -3758,114 +4106,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "Файл" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "Сохранить выделенное в файл" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Сохранить как..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "Сохранить проект" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "Правка" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "Вид" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "Параметры" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "Принтер" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "Материал" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "Профиль" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Установить как активный экструдер" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "Расширения" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "Плагины" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "Настройки" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "Справка" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "Открыть файл" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "Параметры" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "Новый проект" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "Вы действительно желаете начать новый проект? Это действие очистит область печати и сбросит все несохранённые настройки." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "Установка плагина" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "Открыть файл(ы)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "Среди выбранных файлов мы нашли несколько файлов с G-кодом. Вы можете открыть только один файл за раз. Измените свой выбор, пожалуйста." @@ -3890,97 +4238,82 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Больше не показывать сводку по проекту" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "Сохранить" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "Подготовка" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "Монитор" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "Высота слоя" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "В настоящее время активен пользовательский профиль. Чтобы включить ползунок качества, на вкладке «Пользовательские» выберите профиль качества по умолчанию" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "Скорость печати" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "Медленнее" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "Быстрее" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "В некоторые настройки профиля были внесены изменения. Если их необходимо изменить, перейдите в пользовательский режим." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "Заполнение" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Постепенное заполнение будет постепенно увеличивать объём заполнения по направлению вверх." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "Постепенное" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "Генерация поддержек" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Генерация структур для поддержки нависающих частей модели. Без этих структур такие части будут складываться во время печати." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "Экструдер поддержек" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "Выбирает какой экструдер следует использовать для поддержек. Будут созданы поддерживающие структуры под моделью для предотвращения проседания краёв или печати в воздухе." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Тип прилипания к столу" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "Разрешает печать каймы или подложки. Это добавляет плоскую область вокруг или под вашим объектом, которую легко удалить после печати." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Требуется помощь в улучшении вашей печати?
    Обратитесь к Руководству Ultimaker по решению проблем" @@ -3998,17 +4331,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Открыть файл проекта" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "Это проект Cura. Следует открыть его как проект или просто импортировать из него модели?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Запомнить мой выбор" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "Открыть как проект" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "Импортировать модели" @@ -4018,21 +4356,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Журнал движка" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "Материал" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "Проверить совместимость" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Нажмите для проверки совместимости материала на Ultimaker.com." +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4123,6 +4476,26 @@ msgctxt "name" msgid "USB printing" msgstr "Печать через USB" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4143,6 +4516,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Соединение с сетью UM3" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4155,8 +4538,8 @@ msgstr "Проверка обновлений" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "Предоставляет вам возможность открывать файлы через SolidWorks. Файлы будут преобразовываться и загружаться в Cura" +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4223,6 +4606,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "Чтение устаревших профилей Cura" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4383,6 +4776,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Запись профиля Cura" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4423,6 +4826,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Чтение профиля Cura" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "Неизвестный" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "Возникли ошибки во время открытия файла SolidWorks! Пожалуйста, проверьте может ли SolidWorks открыть этот файл без проблем!" + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "Ошибка при запуске %s!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "Вид моделирования" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Cura собирает анонимную статистику о нарезке модели. Вы можете отключить это в настройках." + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "Отменить" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "Общие" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    Произошло критическое исключение. Отправьте нам этот отчёт о сбое, чтобы мы могли устранить проблему

    \n" +#~ "

    Нажмите кнопку «Отправить отчёт», чтобы автоматически отправить отчёт об ошибке на наш сервер

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Версия Cura: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "Платформа: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Версия Qt: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "Версия PyQt: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "Диагностика исключения" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "Диаметр материала" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker 3 Расширенный" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Конфигурация плагина SolidWorks" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "Качество по-умолчанию экспортируемого STL:" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "Всегда спрашивать" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "Всегда использовать хорошее качество" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "Всегда использовать грубое качество" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "Импортировать SolidWorks файл как STL..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "Качество экспортируемого STL" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "Качество" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "Грубое" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "Хорошее" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "отсутствуют доступные профили" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "Этот параметр всегда действует на все экструдеры. Его изменение повлияет на все экструдеры" + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "Формат отображения времени
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "&Сбросить положение камеры" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "Сохранить проект" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "Подготовка" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "Монитор" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "Проверить совместимость" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "Предоставляет вам возможность открывать файлы через SolidWorks. Файлы будут преобразовываться и загружаться в Cura" + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "блокированный" @@ -4443,13 +4996,9 @@ msgstr "Чтение профиля Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Рекомендуется регулярно обновлять прошивку принтера {machine_name}. Это может сделано когда {machine_name} подключен к сети или к USB." -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Просмотр слоёв" - -msgctxt "@info:title" -msgid "Layer View" -msgstr "Просмотр слоёв" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Просмотр слоёв" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4550,9 +5099,9 @@ msgstr "Просмотр слоёв" #~ msgid "Provides the Layer view." #~ msgstr "Предоставляет послойный просмотр." -msgctxt "name" -msgid "Layer View" -msgstr "Просмотр слоёв" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Просмотр слоёв" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4873,9 +5422,9 @@ msgstr "Просмотр слоёв" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Предоставляет поддержку для импортирования профилей из GCode файлов." -msgctxt "@label" -msgid "Layer View" -msgstr "Просмотр слоёв" +#~ msgctxt "@label" +#~ msgid "Layer View" +#~ msgstr "Просмотр слоёв" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/ru_RU/fdmextruder.def.json.po b/resources/i18n/ru_RU/fdmextruder.def.json.po index 895544cc45..3b73955f6f 100644 --- a/resources/i18n/ru_RU/fdmextruder.def.json.po +++ b/resources/i18n/ru_RU/fdmextruder.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Ruslan Popov \n" "Language-Team: Ruslan Popov\n" diff --git a/resources/i18n/ru_RU/fdmprinter.def.json.po b/resources/i18n/ru_RU/fdmprinter.def.json.po index fdeefe1154..72f419ade9 100644 --- a/resources/i18n/ru_RU/fdmprinter.def.json.po +++ b/resources/i18n/ru_RU/fdmprinter.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Ruslan Popov \n" "Language-Team: Ruslan Popov\n" @@ -58,7 +58,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "Команды в G-коде, которые будут выполнены при старте печати, разделённые \n." +msgstr "" +"Команды в G-коде, которые будут выполнены при старте печати, разделённые \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,7 +72,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "Команды в G-коде, которые будут выполнены в конце печати, разделённые \n." +msgstr "" +"Команды в G-коде, которые будут выполнены в конце печати, разделённые \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -347,6 +351,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -607,31 +621,6 @@ 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 "Высота первого слоя в миллиметрах. Более толстый слой упрощает прилипание пластика к столу." -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "Допуск слайсинга" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "Способ выполнения слайсинга слоев диагональными поверхностями. Области слоя можно создать на основе места пересечения середины слоя и поверхности (Середина). Кроме того, каждый слой может иметь области, попадающие в объем по высоте слоя (Исключение), или слой имеет области, попадающие в любое место слоя (Включение). Способ «Исключение» сохраняет больше деталей. Способ «Включение» обеспечивает наилучшую подгонку. Способ «Середина» требует минимального времени для обработки." - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "Середина" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "Исключение" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "Включение" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -672,16 +661,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "Ширина одной линии стенки для всех линий стенки, кроме самой внешней." -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "Ширина линии крышки" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "Ширина одной линии крышки." - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -862,41 +841,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "Количество верхних слоёв оболочки. Обычно достаточно одного слоя для получения верхних поверхностей в хорошем качестве." -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "Шаблон верхней оболочки" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "Шаблон, используемый для верхних слоёв оболочки." - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "Линии" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "Концентрические" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Зигзаг" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "Направление линий верхней оболочки" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "Список направлений линии при печати слоёв дна/крышки линиями или зигзагом. Элементы списка используются последовательно по мере печати слоёв и когда конец списка будет достигнут, он начнётся сначала. Элементы списка отделяются запятыми и сам список заключён в квадратные скобки. По умолчанию, он пустой, что означает использование стандартных углов (45 и 135 градусов)." - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1027,6 +971,16 @@ 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 "Вставка применяется для внешних стенок. Если внешняя стенка меньше диаметра сопла и печатается после внутренних стенок, то используйте это смещение для захода соплом на внутренние стенки, вместо выхода за модель." +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "Оптимазация порядка печати стенок" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "Оптимизирует порядок, в котором печатаются стенки для уменьшения количества откатов и перемещений. Большинство моделей будут распечатываться быстрее, но не все. Сравнивайте печать с оптимизацией и без." + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1097,6 +1051,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "Везде" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1479,8 +1443,8 @@ msgstr "Смещение заполнения по X" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "Расстояние смещения шаблона заполнения по оси X." +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1489,8 +1453,8 @@ msgstr "Смещение заполнения по Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "Расстояние смещения шаблона заполнения по оси Y." +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1509,8 +1473,8 @@ 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 "Величина перекрытия между заполнением и стенками. Небольшое перекрытие позволяет стенкам плотно соединиться с заполнением." +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1529,8 +1493,8 @@ msgstr "Процент перекрытия оболочек" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "Объём перекрытия между оболочкой и стенами в виде процента от ширины линии. Небольшое перекрытие позволяют стенам нормально соединяться с оболочкой. Это процент от средней ширины линии оболочки и внутренней стенки." +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1692,16 +1656,6 @@ msgctxt "material description" msgid "Material" msgstr "Материал" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -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 "Изменять температуру каждого слоя автоматически в соответствии со средней скоростью потока на этом слое." - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1752,16 +1706,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "Температура, до которой можно начать охлаждать сопло, перед окончанием печати." -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "График температуры потока" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "График, объединяющий поток (в мм3 в секунду) с температурой (в градусах Цельсия)." - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1779,8 +1723,8 @@ 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 "Температура, используемая для горячего стола. Если указан 0, то горячий стол не нагревается при печати." +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3452,6 +3396,16 @@ 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 "Угол верхней части башен. Большие значения приводят уменьшению площади крыши, меньшие наоборот делают крышу плоской." +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +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 "Будет поддерживать всё ниже объекта, никаких нависаний не будет." + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -3552,7 +3506,9 @@ 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 "Горизонтальное расстояние между юбкой и первым слоем печати.\nМинимальное расстояние. Несколько линий юбки будут расширяться от этого расстояния." +msgstr "" +"Горизонтальное расстояние между юбкой и первым слоем печати.\n" +"Минимальное расстояние. Несколько линий юбки будут расширяться от этого расстояния." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4084,16 +4040,6 @@ 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 "Обычно Cura пытается закрыть небольшие отверстия в объекте и убрать части слоя с большими отверстиями. Включение этого параметра сохраняет те части, что не могут быть сшиты. Этот параметр должен использоваться как последний вариант, когда уже ничего не помогает получить нормальный GCode." -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "Максимальное разрешение" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "Минимальный размер сегмента линии после слайсинга. Увеличение значения этого параметра понизит разрешение модели. Это может позволить принтеру поддерживать скорость обработки кода G и увеличит скорость слайсинга за счет удаления деталей модели, которые он в любом случае не сможет обработать." - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4244,16 +4190,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "Используйте этот объект для указания области поддержек. Может использоваться при генерации структуры поддержек." -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -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 "Будет поддерживать всё ниже объекта, никаких нависаний не будет." - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4330,14 +4266,194 @@ msgid "experimental!" msgstr "экспериментальное!" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "Оптимазация порядка печати стенок" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "Оптимизирует порядок, в котором печатаются стенки для уменьшения количества откатов и перемещений. Большинство моделей будут распечатываться быстрее, но не все. Сравнивайте печать с оптимизацией и без." +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "Допуск слайсинга" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "Способ выполнения слайсинга слоев диагональными поверхностями. Области слоя можно создать на основе места пересечения середины слоя и поверхности (Середина). Кроме того, каждый слой может иметь области, попадающие в объем по высоте слоя (Исключение), или слой имеет области, попадающие в любое место слоя (Включение). Способ «Исключение» сохраняет больше деталей. Способ «Включение» обеспечивает наилучшую подгонку. Способ «Середина» требует минимального времени для обработки." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "Середина" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "Исключение" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "Включение" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "Ширина линии крышки" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "Ширина одной линии крышки." + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "Шаблон верхней оболочки" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "Шаблон, используемый для верхних слоёв оболочки." + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "Линии" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "Концентрические" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Зигзаг" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "Направление линий верхней оболочки" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "Список направлений линии при печати слоёв дна/крышки линиями или зигзагом. Элементы списка используются последовательно по мере печати слоёв и когда конец списка будет достигнут, он начнётся сначала. Элементы списка отделяются запятыми и сам список заключён в квадратные скобки. По умолчанию, он пустой, что означает использование стандартных углов (45 и 135 градусов)." + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +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 "Изменять температуру каждого слоя автоматически в соответствии со средней скоростью потока на этом слое." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "График температуры потока" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "График, объединяющий поток (в мм3 в секунду) с температурой (в градусах Цельсия)." + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "Максимальное разрешение" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "Минимальный размер сегмента линии после слайсинга. Увеличение значения этого параметра понизит разрешение модели. Это может позволить принтеру поддерживать скорость обработки кода G и увеличит скорость слайсинга за счет удаления деталей модели, которые он в любом случае не сможет обработать." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4829,7 +4945,9 @@ 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 "Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\nЭто может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при каркасной печати." +msgstr "" +"Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\n" +"Это может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при каркасной печати." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4936,6 +5054,46 @@ 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 "Зазор между соплом и горизонтально нисходящими линиями. Большее значение уменьшает угол нисхождения, что приводит уменьшению восходящих соединений на следующем слое. Применяется только при каркасной печати." +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4996,6 +5154,26 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Матрица преобразования, применяемая к модели при её загрузки из файла." +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "Расстояние смещения шаблона заполнения по оси X." + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "Расстояние смещения шаблона заполнения по оси Y." + +#~ 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 "Величина перекрытия между заполнением и стенками. Небольшое перекрытие позволяет стенкам плотно соединиться с заполнением." + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "Объём перекрытия между оболочкой и стенами в виде процента от ширины линии. Небольшое перекрытие позволяют стенам нормально соединяться с оболочкой. Это процент от средней ширины линии оболочки и внутренней стенки." + +#~ 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 "Температура, используемая для горячего стола. Если указан 0, то горячий стол не нагревается при печати." + #~ msgctxt "wall_x_extruder_nr label" #~ msgid "Inner Walls Extruder" #~ msgstr "Печать внутренних стенок" diff --git a/resources/i18n/tr_TR/cura.po b/resources/i18n/tr_TR/cura.po index c77df51d69..f449a2a44b 100644 --- a/resources/i18n/tr_TR/cura.po +++ b/resources/i18n/tr_TR/cura.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "Makine Ayarları" @@ -53,12 +53,11 @@ msgstr "Doodle3D Connect’e bağlanıyor" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -98,7 +97,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Doodle3D Connect web arayüzünü aç" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Değişiklik Günlüğünü Göster" @@ -113,78 +112,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "Profil düzleştirilmiş ve aktifleştirilmiştir." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "USB yazdırma" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "USB ile yazdır" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "USB ile yazdır" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "USB ile bağlı" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Yazıcı meşgul veya bağlı olmadığı için yeni bir işlem başlatılamıyor." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "Yazıcı Mevcut Değil" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Yazıcı, UltiGCode türü kullandığı için USB yazdırmayı desteklemiyor." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "USB Yazdırma" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Yazıcı USB ile yazdırmayı desteklemediği için yeni bir işlem başlatılamıyor." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "Uyarı" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "Bağlı yazıcı bulunmadığı için aygıt yazılımı güncellenemiyor." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "%s’te yazıcı için gerekli aygıt yazılım bulunamadı." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "Yazıcı Bellenimi" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -228,11 +232,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Çıkarılabilir aygıta {0} kaydedilemedi: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "Hata" @@ -282,7 +286,7 @@ msgid "Removable Drive" msgstr "Çıkarılabilir Sürücü" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Ağ üzerinden yazdır" @@ -396,110 +400,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "Yazıcı Durumu" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Yeni yazdırma işi başlatılamıyor. {0} yuvasına PrintCore yüklenmedi." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Yeni bir yazdırma başlatılamıyor. {0} yuvasına Malzeme yüklenmedi" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Biriktirme {0} için yeterli malzeme yok." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Ekstruder {2} için farklı bir PrintCore (Cura: {0}, Yazıcı: {1}) seçildi" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Farklı malzeme (Cura: {0}, Yazıcı: {1}), ekstrüder {2} için seçildi" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "PrintCore {0} düzgün bir şekilde ayarlanmadı. XY ayarının yazıcıda yapılması gerekiyor." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Seçilen yapılandırma ile yazdırmak istediğinizden emin misiniz?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "Yazıcı yapılandırması veya kalibrasyonu ile Cura arasında eşleşme sorunu var. En iyi sonucu almak istiyorsanız her zaman PrintCore ve yazıcıya eklenen malzemeler için dilimleme yapın." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Uyumsuz yapılandırma" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "Yeni işlerin gönderilmesi (geçici olarak) engellenmiştir, hala bir önceki yazdırma işi gönderiliyor." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Veriler yazıcıya gönderiliyor" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "Veri gönderiliyor" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Veriler yazıcıya gönderilemedi. Hala etkin olan başka bir iş var mı?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Yazdırma durduruluyor..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Yazdırma durduruldu. Lütfen yazıcıyı kontrol edin" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Yazdırma duraklatılıyor..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Yazdırma devam ediyor..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Yazıcınız ile eşitleyin" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Cura’da geçerli yazıcı yapılandırmanızı kullanmak istiyor musunuz?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "Yazıcınızda bulunan PrintCore’lar ve/veya malzemeler geçerli projenizde bulunandan farklı. En iyi sonucu almak istiyorsanız, her zaman PrintCore ve yazıcıya eklenen malzemeler için dilimleme yapın." @@ -520,145 +524,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "{printer_name}, '{job_name}' yazdırmayı tamamladı. Lütfen çıktıyı alın ve yapı levhasının temizlenmesini onaylayın." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name}, '{job_name}' yazdırmak için ayrılmıştır. Yazıcının yazdırmayı başlatması için lütfen yazıcı yapılandırmasını işe uygun olacak şekilde değiştirin." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Yeni yazdırma işi gönderilemiyor: bu 3D yazıcı, bağlı Ultimaker 3 yazıcı grubunu barındırmak için (henüz) ayarlı değildir." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Yazdırma işi, {cluster_name} grubuna gönderilemiyor." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "{file_name}, {cluster_name} grubuna gönderildi." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "Yazdırma işlerini göster" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "Yazdırma işleri arayüzünü tarayıcınızda açar." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "Bilinmiyor" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "{printer_name}, '{job_name}' yazdırmayı tamamladı." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "Baskı tamamlandı" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "Eylem gerekli" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "{file_name}, {cluster_name} grubuna gönderiliyor" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "Ağ ile Bağlan" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "{machine_name} adlı cihazınız için yeni özellikler var! Yazıcınızın fabrika yazılımını güncellemeniz önerilir." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Yeni %s bellenimi mevcut" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "Nasıl güncellenir" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "Güncelleme bilgilerine erişilemedi." -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "SolidWorks dosyanızı açarken hata meydana geldi! Lütfen dosyanızın SolidWorks’te sorunsuz açılıp açılmadığını kontrol edin!" +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "SolidWorks part dosyası" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "SolidWorks assembly dosyası" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "Yapılandırma" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "%s başlatılırken hata oluştu!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "Simülasyon görünümü" +msgid "Layer view" +msgstr "Katman görünümü" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "Tel Yazma etkinleştirildiğinde, Cura katmanları doğru olarak görüntülemez." -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "Simülasyon Görünümü" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "GCode Değiştir" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "Cura anonim dilimleme istatistiklerini toplar. Bu özelliği tercihlerden devre dışı bırakabilirsiniz." +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -667,14 +714,41 @@ msgstr "Veri Toplanıyor" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "Son Ver" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Cura 15.04 profilleri" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -706,49 +780,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "GIF Resmi" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "Mevcut malzeme, seçilen makine veya yapılandırma ile uyumlu olmadığından mevcut malzeme ile dilimlenemedi." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "Dilimlenemedi" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Geçerli ayarlarla dilimlenemiyor. Şu ayarlarda hata var: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "Modele özgü ayarlar nedeniyle dilimlenemedi. Şu ayarlar bir veya daha fazla modelde hataya yol açıyor: {error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "İlk direk veya ilk konum(lar) geçersiz olduğu için dilimlenemiyor." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Modeller yapı hacmine sığmadığı için dilimlenecek bir şey yok. Lütfen sığdırmak için modelleri ölçeklendirin veya döndürün." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "Katmanlar İşleniyor" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "Bilgi" @@ -785,14 +859,14 @@ msgstr "Siemens NX eklenti dosyaları kopyalanamadı. Lütfen UGII_USER_DIR ayar msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "Siemens NX eklentisi yüklenemedi. Siemens NX ortam değişkeni UGII_USER_DIR ayarlanamadı." -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "Önerilen Ayarlar" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "Özel" @@ -803,24 +877,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF Dosyası" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "Nozül" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Eklenti kimliği, {0} dosyasından alınamadı" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "Uyarı" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "Eklenti tarayıcısı" @@ -835,18 +909,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G Dosyası" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "G-code ayrıştırma" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "G-code Ayrıntıları" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "Dosya göndermeden önce g-code’un yazıcınız ve yazıcı yapılandırmanız için uygun olduğundan emin olun. G-code temsili doğru olmayabilir." @@ -857,6 +931,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Cura Profili" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -888,142 +972,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "Yapı levhasını dengele" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Dış Duvar" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "İç Duvarlar" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "Yüzey Alanı" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "Dolgu" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "Destek Dolgusu" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "Destek Arayüzü" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "Destek" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "Etek" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "Hareket" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "Geri Çekmeler" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "Diğer" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "Bilinmiyor" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Önceden dilimlenmiş dosya {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "Hiçbir malzeme yüklenmedi" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "Bilinmeyen malzeme" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "Nesneler için yeni konum bulunuyor" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "Konumu Buluyor" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "Yapılan hacim içinde tüm nesneler için konum bulunamadı" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "Konum Bulunamıyor" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "Dosya Zaten Mevcut" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "Dosya {0} zaten mevcut. Üstüne yazmak istediğinizden emin misiniz?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "Özel" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "Özel Malzeme" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "Genel" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "Geçersiz kılınmadı" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Seçilen malzeme, seçilen makine veya yapılandırma ile uyumlu değil." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1044,67 +1102,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Malzeme çapını değiştirme işlemini geri al." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Profilin {0} dosyasına aktarımı başarısız oldu: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Profilin {0} dosyasına aktarımı başarısız oldu: Yazıcı eklentisinde rapor edilen hata." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Profil {0} dosyasına aktarıldı" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "Dışa aktarma başarılı" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "{0} dosyasından profil içe aktarımı başarısız oldu: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Profil başarıyla içe aktarıldı {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Profil {0} öğesinde bilinmeyen bir dosya türü var veya profil bozuk." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "Özel profil" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Profilde eksik bir kalite tipi var." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "Mevcut yapılandırma için bir kalite tipi {0} bulunamıyor." +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1115,142 +1195,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "Yapı Disk Bölümü" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Nesneler çoğaltılıyor ve yerleştiriliyor" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "Nesne Yerleştiriliyor" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "Yapılan hacim içinde tüm nesneler için konum bulunamadı" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "Nesneler için yeni konum bulunuyor" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "Konumu Buluyor" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "Konum Bulunamıyor" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "Çökme Raporu" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    Çok ciddi bir istisna oluştu. Lütfen sorunu çözmek için bize Çökme Raporu'nu gönderin

    \n

    Sunucularımıza otomatik olarak bir hata raporu yüklemek için lütfen \"Rapor gönder\" düğmesini kullanın

    \n " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "Sistem bilgileri" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "Bilinmiyor" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Cura sürümü: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "Platform: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Qt sürümü: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "PyQt sürümü: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • OpenGL Sürümü: {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • OpenGL Satıcısı: {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • OpenGL Oluşturucusu: {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "İstisna geri izleme" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "Günlükler" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "Kullanıcı açıklaması" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "Rapor gönder" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Makineler yükleniyor..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Görünüm ayarlanıyor..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Arayüz yükleniyor..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Aynı anda yalnızca bir G-code dosyası yüklenebilir. {0} içe aktarma atlandı" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "G-code yüklenirken başka bir dosya açılamaz. {0} içe aktarma atlandı" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "Seçilen model yüklenemeyecek kadar küçüktü." @@ -1279,12 +1384,11 @@ msgstr "X (Genişlik)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1374,68 +1478,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "Nozül ucu ve portal sistemi (X ve Y aksları) arasındaki yükseklik farkı. “Birer birer” çıktı alırken önceki çıktılar ile portalın çakışmasını önlemek için kullanılır." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "Ekstrüder Sayısı" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "Yazıcı tarafından desteklenen nominal filaman çapı. Tam çap malzeme ve/veya profil tarafından etkisiz kılınacaktır." - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "Malzeme çapı" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "Nozzle boyutu" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "Gcode’u başlat" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Başlangıçta yürütülecek Gcode komutları." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "Gcode’u sonlandır" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Bitişte yürütülecek Gcode komutları." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "Nozül Ayarları" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Nozzle boyutu" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "Yazıcı tarafından desteklenen nominal filaman çapı. Tam çap malzeme ve/veya profil tarafından etkisiz kılınacaktır." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "Nozül X ofseti" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Nozül Y ofseti" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Ekstrüder Gcode’u başlat" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Ekstrüder Gcode’u sonlandır" @@ -1448,8 +1551,9 @@ msgstr "Değişiklik Günlüğü" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1514,7 +1618,10 @@ 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 "Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n\nAşağıdaki listeden yazıcınızı seçin:" +msgstr "" +"Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n" +"\n" +"Aşağıdaki listeden yazıcınızı seçin:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1530,7 +1637,7 @@ msgstr "Düzenle" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "Kaldır" @@ -1552,14 +1659,14 @@ msgid "Type" msgstr "Tür" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Genişletilmiş Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1603,8 +1710,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "IP adresini veya yazıcınızın ağ üzerindeki ana bilgisayar adını girin." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1625,6 +1730,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1, bağlı Ultimaker 3 yazıcı grubunu barındırmak için ayarlı değildir" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1655,11 +1765,16 @@ msgid "Available" msgstr "Mevcut" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "Yazıcı bağlantısı koptu" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1751,138 +1866,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "Yapılandırmayı Etkinleştir" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Cura SolidWorks Eklenti Yapılandırması" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "Dışa aktarılan STL dosyasının varsayılan kalitesi:" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "Her zaman sor" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "Her zaman İnce kalite modunu kullan" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "Her zaman Düşük kalite modunu kullan" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "SolidWorks Dosyasını STL olarak içe aktar..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "Dışa aktarılan STL dosyasının kalitesi" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "Kalite" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "Düşük" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "İnce" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "Seçimimi hatırla" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "Kaydet" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "Renk şeması" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "Malzeme Rengi" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "Çizgi Tipi" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "Besleme hızı" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "Katman kalınlığı" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "Uyumluluk Modu" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "Geçişleri Göster" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "Yardımcıları Göster" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "Kabuğu Göster" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "Dolguyu Göster" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "Yalnızca Üst Katmanları Göster" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "En Üstteki 5 Ayrıntılı Katmanı Göster" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "Üst / Alt" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "İç Duvar" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "min" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "maks" @@ -1907,7 +2134,7 @@ msgctxt "@label" msgid "Settings" msgstr "Ayarlar" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Etkin son işleme dosyalarını değiştir" @@ -1982,23 +2209,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "Düzeltme" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "Ayarları seçin" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "Bu modeli Özelleştirmek için Ayarları seçin" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "Filtrele..." -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "Tümünü göster" @@ -2166,7 +2423,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "Bu eklenti bir lisans içerir.\nBu eklentiyi yüklemek için bu lisansı kabul etmeniz gerekir.\nAşağıdaki koşulları kabul ediyor musunuz?" +msgstr "" +"Bu eklenti bir lisans içerir.\n" +"Bu eklentiyi yüklemek için bu lisansı kabul etmeniz gerekir.\n" +"Aşağıdaki koşulları kabul ediyor musunuz?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2357,66 +2617,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "Her şey yolunda! Kontrol işlemini tamamladınız." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "Yazıcıya bağlı değil" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "Yazıcı komutları kabul etmiyor" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "Bakımda. Lütfen yazıcıyı kontrol edin" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Yazdırılıyor..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Duraklatıldı" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Hazırlanıyor..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "Lütfen yazıcıyı çıkarın " -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "Devam et" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "Durdur" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "Yazdırmayı Durdur" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "Yazdırmayı durdur" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "Yazdırmayı iptal etmek istediğinizden emin misiniz?" @@ -2431,7 +2691,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Bazı profil ayarlarını özelleştirdiniz.\nBu ayarları kaydetmek veya iptal etmek ister misiniz?" +msgstr "" +"Bazı profil ayarlarını özelleştirdiniz.\n" +"Bu ayarları kaydetmek veya iptal etmek ister misiniz?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2449,19 +2711,19 @@ msgid "Customized" msgstr "Özelleştirilmiş" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "Her zaman sor" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "İptal et ve bir daha sorma" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "Kaydet ve bir daha sorma" @@ -2496,72 +2758,72 @@ msgctxt "@label" msgid "Brand" msgstr "Marka" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "Malzeme Türü" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "Renk" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "Özellikler" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "Yoğunluk" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "Çap" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "Filaman masrafı" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "Filaman ağırlığı" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "Filaman uzunluğu" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "Metre başına maliyet" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "Bu malzeme %1’e bağlıdır ve özelliklerinden bazılarını paylaşır." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "Malzemeyi Ayır" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "Tanım" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "Yapışma Bilgileri" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "Yazdırma ayarları" @@ -2602,7 +2864,7 @@ msgid "Unit" msgstr "Birim" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "Genel" @@ -2617,230 +2879,255 @@ msgctxt "@label" msgid "Language:" msgstr "Dil:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "Para Birimi:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "Tema:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "Bu değişikliklerinin geçerli olması için uygulamayı yeniden başlatmanız gerekecektir." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "Ayarlar değiştirilirken otomatik olarak dilimle." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "Otomatik olarak dilimle" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "Görünüm şekli" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "Modelin desteklenmeyen alanlarını kırmızı ile gösterin. Destek alınmadan bu alanlar düzgün bir şekilde yazdırılmayacaktır." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "Dışarıda kalan alanı göster" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "Bir model seçildiğinde bu model görüntünün ortasında kalacak şekilde kamera hareket eder." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "Öğeyi seçince kamerayı ortalayın" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "Cura’nın varsayılan yakınlaştırma davranışı tersine çevrilsin mi?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "Kamera yakınlaştırma yönünü ters çevir." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "Yakınlaştırma farenin hareket yönüne uygun olsun mu?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "Farenin hareket yönüne göre yakınlaştır" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "Platformun üzerindeki öğeler kesişmemeleri için hareket ettirilmeli mi?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "Modellerin birbirinden ayrı olduğundan emin olduğundan emin olun" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "Platformun üzerindeki modeller yapı levhasına değmeleri için indirilmeli mi?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "Modelleri otomatik olarak yapı tahtasına indirin" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "Gcode okuyucuda uyarı mesajı göster." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "Gcode okuyucuda uyarı mesajı" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "Katman, uyumluluk moduna zorlansın mı?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "Katman görünümünü uyumluluk moduna zorla (yeniden başlatma gerekir)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "Dosyaların açılması ve kaydedilmesi" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "Modeller çok büyükse yapı hacmine göre ölçeklendirilmeli mi?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "Büyük modelleri ölçeklendirin" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "Bir modelin birimi milimetre değil de metre ise oldukça küçük görünebilir. Bu modeller ölçeklendirilmeli mi?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "Çok küçük modelleri ölçeklendirin" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "Yazıcı adına bağlı bir ön ek otomatik olarak yazdırma işinin adına eklenmeli mi?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "Makine ön ekini iş adına ekleyin" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "Bir proje dosyasını kaydederken özet gösterilmeli mi?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "Projeyi kaydederken özet iletişim kutusunu göster" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "Bir proje dosyası açıldığında varsayılan davranış" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "Bir proje dosyası açıldığında varsayılan davranış: " -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "Her zaman sor" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "Her zaman proje olarak aç" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "Her zaman modelleri içe aktar" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "Bir profil üzerinde değişiklik yapıp farklı bir profile geçtiğinizde, değişikliklerin kaydedilmesini isteyip istemediğinizi soran bir iletişim kutusu açılır. Alternatif olarak bu işleve yönelik varsayılan bir davranış seçebilir ve bu iletişim kutusunun bir daha görüntülenmemesini tercih edebilirsiniz." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "Profilin Üzerine Yaz" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "Gizlilik" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "Cura, program başladığında güncellemeleri kontrol etmeli mi?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "Başlangıçta güncellemeleri kontrol edin" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "Yazdırmanızdaki anonim veriler Ultimaker’a gönderilmeli mi? Unutmayın; hiçbir model, IP adresi veya diğer kişiye özgü bilgiler gönderilmez veya saklanmaz." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "(Anonim) yazdırma bilgisi gönder" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "Yazıcılar" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "Etkinleştir" @@ -2883,7 +3170,7 @@ msgid "Waiting for a printjob" msgstr "Yazdırma işlemi bekleniyor" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "Profiller" @@ -2909,13 +3196,13 @@ msgid "Duplicate" msgstr "Çoğalt" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "İçe aktar" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "Dışa aktar" @@ -2981,7 +3268,7 @@ msgid "Export Profile" msgstr "Profili Dışa Aktar" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "Malzemeler" @@ -2996,60 +3283,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "Yazıcı: %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "Oluştur" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "Çoğalt" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "Malzemeyi İçe Aktar" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr "Malzeme %1 dosyasına içe aktarılamadı: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "Malzeme %1 dosyasına başarıyla içe aktarıldı" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "Malzemeyi Dışa Aktar" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "Malzemenin %1 dosyasına dışa aktarımı başarısız oldu: %2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "Malzeme %1 dosyasına başarıyla dışa aktarıldı" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "Yazıcı Ekle" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "Yazıcı Adı:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "Yazıcı Ekle" @@ -3074,7 +3361,9 @@ 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, topluluk iş birliği ile Ultimaker B.V. tarafından geliştirilmiştir.\nCura aşağıdaki açık kaynak projelerini gururla kullanmaktadır:" +msgstr "" +"Cura, topluluk iş birliği ile Ultimaker B.V. tarafından geliştirilmiştir.\n" +"Cura aşağıdaki açık kaynak projelerini gururla kullanmaktadır:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3176,158 +3465,167 @@ msgctxt "@label" msgid "Profile:" msgstr "Profil:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "Hiçbir Profil Yok" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 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 "Bazı ayar/geçersiz kılma değerleri profilinizde saklanan değerlerden farklıdır.\n\nProfil yöneticisini açmak için tıklayın." +msgstr "" +"Bazı ayar/geçersiz kılma değerleri profilinizde saklanan değerlerden farklıdır.\n" +"\n" +"Profil yöneticisini açmak için tıklayın." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "Ara..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Değeri tüm ekstruderlere kopyala" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Bu ayarı gizle" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Bu ayarı gösterme" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Bu ayarı görünür yap" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Görünürlük ayarını yapılandır..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Gizlenen bazı ayarlar normal hesaplanan değerden farklı değerler kullanır.\n\nBu ayarları görmek için tıklayın." +msgstr "" +"Gizlenen bazı ayarlar normal hesaplanan değerden farklı değerler kullanır.\n" +"\n" +"Bu ayarları görmek için tıklayın." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "Etkileri" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr ".........den etkilenir" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "Bu ayar her zaman tüm ekstruderler arasında kullanılır. Bu ayarı değiştirmek tüm ekstruderler için değeri değiştirecektir." +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "Değer, her bir ekstruder değerinden alınır. " -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 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 "Bu ayarın değeri profilden farklıdır.\n\nProfil değerini yenilemek için tıklayın." +msgstr "" +"Bu ayarın değeri profilden farklıdır.\n" +"\n" +"Profil değerini yenilemek için tıklayın." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 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 "Bu ayar normal olarak yapılır ama şu anda mutlak değer ayarı var.\n\nHesaplanan değeri yenilemek için tıklayın." +msgstr "" +"Bu ayar normal olarak yapılır ama şu anda mutlak değer ayarı var.\n" +"\n" +"Hesaplanan değeri yenilemek için tıklayın." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Yazıcı Ayarları" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Yazdırma Ayarı devre dışı\nG-code dosyaları üzerinde değişiklik yapılamaz" +msgstr "" +"Yazdırma Ayarı devre dışı\n" +"G-code dosyaları üzerinde değişiklik yapılamaz" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00sa 00dk" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "Zaman koşulları
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "Maliyet koşulları" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1 m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1 g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "Toplam:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1 m / ~ %2 g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1 m / ~ %2 g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Önerilen Yazıcı Ayarları

    Seçilen yazıcı, malzeme ve kalite için önerilen ayarları kullanarak yazdırın." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Özel Yazıcı Ayarları

    Dilimleme işleminin her bir bölümünü detaylıca kontrol ederek yazdırın." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Otomatik: %1" @@ -3337,6 +3635,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Görünüm" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3349,14 +3657,14 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Seçili Modeli Şununla Yazdır:" msgstr[1] "Seçili Modelleri Şununla Yazdır:" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Seçili Modeli Çoğalt" msgstr[1] "Seçili Modelleri Çoğalt" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "Kopya Sayısı" @@ -3372,7 +3680,7 @@ msgid "No printer connected" msgstr "Yazıcı bağlı değil" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "Ekstrüder" @@ -3482,254 +3790,294 @@ msgctxt "@label" msgid "Estimated time left" msgstr "Kalan tahmini süre" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Tam Ekrana Geç" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Geri Al" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Yinele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Çıkış" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "&Kamera konumunu sıfırla" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura’yı yapılandır..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Yazıcı Ekle..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Yazıcıları Yönet..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Malzemeleri Yönet..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Profili geçerli ayarlar/geçersiz kılmalar ile güncelle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Geçerli değişiklikleri iptal et" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Geçerli ayarlardan/geçersiz kılmalardan profil oluştur..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profilleri Yönet..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Çevrimiçi Belgeleri Göster" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Hata Bildir" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&Hakkında..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "&Seçili Modeli Sil" msgstr[1] "&Seçili Modelleri Sil" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Seçili Modeli Ortala" msgstr[1] "Seçili Modelleri Ortala" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Seçili Modeli Çoğalt" msgstr[1] "Seçili Modelleri Çoğalt" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Modeli Sil" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Modeli Platformda Ortala" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Modelleri Gruplandır" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Model Grubunu Çöz" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Modelleri Birleştir" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Modeli Çoğalt..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Tüm modelleri Seç" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Yapı Levhasını Temizle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Tüm Modelleri Yeniden Yükle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Tüm Modelleri Düzenle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Seçimi Düzenle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Tüm Model Konumlarını Sıfırla" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Tüm Model ve Dönüşümleri Sıfırla" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Dosya Aç..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Yeni Proje..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Motor Günlüğünü Göster..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Yapılandırma Klasörünü Göster" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Görünürlük ayarını yapılandır..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "Eklentilere göz at..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "Yüklü eklentiler..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Lütfen bir 3D model yükleyin" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Dilimlemeye hazır" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Dilimleniyor..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "%1 Hazır" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Dilimlenemedi" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Dilimleme kullanılamıyor" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Hazırla" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "İptal Et" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Etkin çıkış aygıtını seçin" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "Dosya aç" @@ -3749,114 +4097,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Dosya" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&Seçimi Dosyaya Kaydet" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "&Farklı Kaydet" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "Projeyi kaydet" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Düzenle" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "&Görünüm" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "&Ayarlar" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&Yazıcı" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "&Malzeme" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Etkin Ekstruder olarak ayarla" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "Uzantılar" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "&Eklentiler" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "Tercihler" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Yardım" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "Dosya Aç" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "Ayarlar" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "Yeni proje" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "Yeni bir proje başlatmak istediğinizden emin misiniz? Bu işlem yapı levhasını ve kaydedilmemiş tüm ayarları silecektir." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "Eklenti Kur" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "Dosya Aç" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "Seçtiğiniz dosyalar arasında bir veya daha fazla G-code dosyası bulduk. Tek seferde sadece bir G-code dosyası açabilirsiniz. Bir G-code dosyası açmak istiyorsanız, sadece birini seçiniz." @@ -3881,97 +4229,82 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Kaydederken proje özetini bir daha gösterme" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "Kaydet" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "Hazırla" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "İzle" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "Katman Yüksekliği" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "Özel bir profil şu anda aktif. Kalite kaydırıcısını etkinleştirmek için Özel sekmesinde varsayılan bir kalite seçin" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "Yazdırma Hızı" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "Daha yavaş" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "Daha Hızlı" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "Bazı profil ayarlarını değiştirdiniz. Bunları değişiklikleri kaydetmek istiyorsanız, özel moda gidin." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "Dolgu" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Kademeli dolgu, yukarıya doğru dolgu miktarını kademeli olarak yükselecektir." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "Kademeli özelliği etkinleştir" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "Oluşturma Desteği" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Modellerin askıda kalan kısımlarını destekleyen yapılar oluşturun. Bu yapılar olmadan, yazdırma sırasında söz konusu kısımlar düşebilir." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "Destek Ekstrüderi" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "Destek için kullanacağınız ekstruderi seçin. Bu, modelin havadayken düşmesini veya yazdırılmasını önlemek için modelin altındaki destekleyici yapıları güçlendirir." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Yapı Levhası Yapıştırması" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "Bir kenar veya radye yazdırın. Bu nesnenizin etrafına veya altına daha sonra kesilmesi kolay olan düz bir alan sağlayacak." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Yazıcı çıktılarınızı iyileştirmek için yardıma mı ihtiyacınız var?
    Ultimaker Sorun Giderme Kılavuzlarını okuyun" @@ -3988,17 +4321,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Proje dosyası aç" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "Bu bir Cura proje dosyasıdır. Bir proje olarak açmak mı yoksa içindeki modelleri içe aktarmak mı istiyorsunuz?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Seçimimi hatırla" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "Proje olarak aç" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "Modelleri içe aktar" @@ -4008,21 +4346,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Motor Günlüğü" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "Malzeme" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "Uyumluluğu kontrol et" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Malzemenin uyumluluğunu Ultimaker.com üzerinden kontrol etmek için tıklayın." +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4113,6 +4466,26 @@ msgctxt "name" msgid "USB printing" msgstr "USB yazdırma" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4133,6 +4506,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3 Ağ Bağlantısı" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4145,8 +4528,8 @@ msgstr "Bellenim Güncelleme Denetleyicisi" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "Belirli dosyaları SolidWorks üzerinden açma imkanı sağlar. Bu dosyalar dönüştürülür ve Cura’ya yüklenir" +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4213,6 +4596,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "Eski Cura Profil Okuyucu" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4373,6 +4766,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Cura Profili Yazıcı" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4413,6 +4816,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura Profil Okuyucu" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "Bilinmiyor" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "SolidWorks dosyanızı açarken hata meydana geldi! Lütfen dosyanızın SolidWorks’te sorunsuz açılıp açılmadığını kontrol edin!" + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "%s başlatılırken hata oluştu!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "Simülasyon görünümü" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Cura anonim dilimleme istatistiklerini toplar. Bu özelliği tercihlerden devre dışı bırakabilirsiniz." + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "Son Ver" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "Genel" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    Çok ciddi bir istisna oluştu. Lütfen sorunu çözmek için bize Çökme Raporu'nu gönderin

    \n" +#~ "

    Sunucularımıza otomatik olarak bir hata raporu yüklemek için lütfen \"Rapor gönder\" düğmesini kullanın

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Cura sürümü: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "Platform: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Qt sürümü: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "PyQt sürümü: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "İstisna geri izleme" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "Malzeme çapı" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Genişletilmiş Ultimaker 3" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Cura SolidWorks Eklenti Yapılandırması" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "Dışa aktarılan STL dosyasının varsayılan kalitesi:" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "Her zaman sor" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "Her zaman İnce kalite modunu kullan" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "Her zaman Düşük kalite modunu kullan" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "SolidWorks Dosyasını STL olarak içe aktar..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "Dışa aktarılan STL dosyasının kalitesi" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "Kalite" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "Düşük" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "İnce" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "Hiçbir Profil Yok" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "Bu ayar her zaman tüm ekstruderler arasında kullanılır. Bu ayarı değiştirmek tüm ekstruderler için değeri değiştirecektir." + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "Zaman koşulları
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "&Kamera konumunu sıfırla" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "Projeyi kaydet" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "Hazırla" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "İzle" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "Uyumluluğu kontrol et" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "Belirli dosyaları SolidWorks üzerinden açma imkanı sağlar. Bu dosyalar dönüştürülür ve Cura’ya yüklenir" + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "Tıkalı" @@ -4433,13 +4986,9 @@ msgstr "Cura Profil Okuyucu" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Makinenizin {machine_name} en son özellikler ile donanımlı olmasını sağlamak için bellenimi düzenli olarak güncellenmeniz önerilir. Bu, (ağa bağlı olduğunuzda) {machine_name} üzerinde veya USB ile gerçekleştirilebilir." -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Katman görünümü" - -msgctxt "@info:title" -msgid "Layer View" -msgstr "Katman Görünümü" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Katman Görünümü" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4541,9 +5090,9 @@ msgstr "Katman Görünümü" #~ msgid "Provides the Layer view." #~ msgstr "Katman görünümü sağlar." -msgctxt "name" -msgid "Layer View" -msgstr "Katman Görünümü" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Katman Görünümü" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4864,9 +5413,9 @@ msgstr "Katman Görünümü" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "G-code dosyalarından profilleri içe aktarmak için destek sağlar." -msgctxt "@label" -msgid "Layer View" -msgstr "Katman Görünümü" +#~ msgctxt "@label" +#~ msgid "Layer View" +#~ msgstr "Katman Görünümü" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/tr_TR/fdmextruder.def.json.po b/resources/i18n/tr_TR/fdmextruder.def.json.po index 0bb7de91ac..c4ef7906ec 100644 --- a/resources/i18n/tr_TR/fdmextruder.def.json.po +++ b/resources/i18n/tr_TR/fdmextruder.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" diff --git a/resources/i18n/tr_TR/fdmprinter.def.json.po b/resources/i18n/tr_TR/fdmprinter.def.json.po index f0c2bad612..ae06ce1095 100644 --- a/resources/i18n/tr_TR/fdmprinter.def.json.po +++ b/resources/i18n/tr_TR/fdmprinter.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" @@ -56,7 +56,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "​\n ile ayrılan, başlangıçta yürütülecek G-code komutları." +msgstr "" +"​\n" +" ile ayrılan, başlangıçta yürütülecek G-code komutları." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +70,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "​\n ile ayrılan, bitişte yürütülecek Gcode komutları." +msgstr "" +"​\n" +" ile ayrılan, bitişte yürütülecek Gcode komutları." #: fdmprinter.def.json msgctxt "material_guid label" @@ -345,6 +349,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -605,31 +619,6 @@ 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 "İlk katmanın milimetre cinsinden yüksekliği. Kalın ilk katmanlar yapı levhasına yapışmayı kolaylaştırır." -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "Dilimleme Toleransı" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "Çapraz yüzeylerle katman dilimleme yolları. Bir katmanın alanları katmanın ortasının yüzeyle kesiştiği yere (Ortalayıcı) göre oluşturulabilir. Diğer bir yol da her katmanın yüksekliği boyunca hacim içinde kalan alanları (Dışlayıcı) veya katmanın içinde herhangi bir yerde kalan alanları (Kapsayıcı) almasıdır. Dışlayıcı seçenek en çok ayrıntıyı tutar; Kapsayıcı seçenek en iyi şekilde oturur; Ortalayıcı ise en kısa sürede işlenir." - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "Ortalayıcı" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "Dışlayıcı" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "Kapsayıcı" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -670,16 +659,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "En dış duvar haricindeki tüm duvar hatları için tek bir duvar hattı genişliği." -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "Üst Yüzey Hat Genişliği" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "Baskının üst tarafında bulunan alanlardaki tek bir hattın genişliği." - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -860,41 +839,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "En üstteki yüzey katmanlarının sayısı. Yüksek kalitede üst yüzeyler oluşturmak için genellikle tek bir üst yüzey katmanı yeterlidir." -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "Üst Yüzey Şekli" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "En üst yüzeyin şekli." - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "Çizgiler" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "Eş merkezli" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zikzak" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "Üst Yüzey Hat Yönleri" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "Üst yüzey katmanları çizgi veya zikzak biçimindeyken kullanılacak tam sayı hat yönü listesi. Listedeki öğeler, katmanlar ilerledikçe sıralı olarak kullanılır. Listenin sonuna ulaşıldığında tekrar başa dönülür. Liste öğeleri virgülle ayrılır ve tüm liste köşeli parantez içine alınır. Varsayılan ayar boş listedir ve geleneksel varsayılan açılar (45 ve 135 derece) kullanılır." - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1025,6 +969,16 @@ 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 "Dış duvar yoluna uygulanan ilave. Dış duvar nozülden küçükse ve iç duvardan sonra yazdırılmışsa, nozüldeki deliği modelin dış kısmı yerine iç duvarlar ile üst üste bindirmek için bu ofseti kullanın." +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "Duvar Yazdırma Sırasını Optimize Et" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "Geri çekmelerin sayısını ve kat edilen mesafeyi azaltmak için duvarların yazdırıldığı sırayı optimize edin. Çoğu parça, bunun etkinleştirilmesinden yararlanır, ancak bazılarının yararlanması için gerçekte daha uzun bir süre gerekebilir. Bu yüzden, yazdırma süresi tahminlerini optimizasyonlu ve optimizasyonsuz olarak karşılaştırın." + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1095,6 +1049,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "Her bölüm" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1477,8 +1441,8 @@ msgstr "Dolgu X Kayması" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "Dolgu şekli X ekseni boyunca bu mesafe kadar kaydırılır." +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1487,8 +1451,8 @@ msgstr "Dolgu Y Kayması" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "Dolgu şekli Y ekseni boyunca bu mesafe kadar kaydırılır." +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1507,8 +1471,8 @@ msgstr "Dolgu Çakışma Oranı" #: 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 "Dolgu ve duvarlar arasındaki çakışma miktarı. Hafif bir çakışma duvarların dolguya sıkıca bağlanmasını sağlar." +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1527,8 +1491,8 @@ msgstr "Yüzey Çakışma Oranı" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "Hat genişliğinin bir yüzdesi olarak yüzey ve duvarlar arasındaki çakışma miktarı. Az miktar çakışma duvarların yüzeye sıkıca bağlanmasını sağlar. Bu, yüzey hatlarının ve en içteki duvarın ortalama hat genişliklerinin bir yüzdesidir." +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1690,16 +1654,6 @@ msgctxt "material description" msgid "Material" msgstr "Malzeme" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -msgstr "Otomatik Sıcaklık" - -#: 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 "Katmanın ortalama akış hızıyla otomatik olarak her katman için sıcaklığı değiştirir." - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1750,16 +1704,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "Yazdırma bitmeden hemen önce soğuma işleminin başladığı sıcaklık." -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "Akış Sıcaklık Grafiği" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "Malzeme akışını (saniye başına mm3 bazında) sıcaklığa (santigrat derece) bağlayan veri." - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1777,8 +1721,8 @@ msgstr "Yapı Levhası Sıcaklığı" #: 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 "Isınan yapı levhası için kullanılan sıcaklık. Bu ayar 0 olursa bu yazdırma için yatak ısıtılmaz." +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3450,6 +3394,16 @@ 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 "Direk tavanı açısı Yüksek bir değer, direk tavanını sivrileştirirken, daha düşük bir değer direk tavanlarını düzleştirir." +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "Alçalan Destek Örgüsü" + +#: 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 "Destek örgüsünde askıda kalan herhangi bir kısım olmaması için destek örgüsünün altındaki her yere destek yapın." + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -3550,7 +3504,9 @@ 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 "Baskının eteği ve ilk katmanı arasındaki yatay mesafe.\nMinimum mesafedir. Bu mesafeden çok sayıda etek hattı dışarı doğru uzanır." +msgstr "" +"Baskının eteği ve ilk katmanı arasındaki yatay mesafe.\n" +"Minimum mesafedir. Bu mesafeden çok sayıda etek hattı dışarı doğru uzanır." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4082,16 +4038,6 @@ 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 "Normal koşullarda, Cura ağdaki küçük boşlukları diker ve büyük boşluklu katman parçalarını ortadan kaldırır. Bu seçeneği etkinleştirmek, dikilemeyen parçaları muhafaza eder. Bu seçenek, hiçbir işlemin uygun bir GCode oluşturamaması durumunda başvurulacak son seçenek olarak kullanılmalıdır." -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "Maksimum Çözünürlük" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "Bir çizginin dilimlemeden sonraki minimum boyutu. Bu değer artırıldıktan sonra örgünün çözünürlüğü düşer. Bu, yazıcının g-kodunu işlemek için gereken hıza yetişmesine olanak tanır ve örtünün zaten işlenemeyecek ayrıntılarını kaldırarak dilimleme hızını artırır." - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4242,16 +4188,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "Destek alanlarını belirlemek için bu örgüyü kullanın. Bu örgü, destek yapısını oluşturmak için kullanılabilir." -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -msgstr "Alçalan Destek Örgüsü" - -#: 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 "Destek örgüsünde askıda kalan herhangi bir kısım olmaması için destek örgüsünün altındaki her yere destek yapın." - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4328,14 +4264,194 @@ msgid "experimental!" msgstr "deneysel!" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "Duvar Yazdırma Sırasını Optimize Et" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "Geri çekmelerin sayısını ve kat edilen mesafeyi azaltmak için duvarların yazdırıldığı sırayı optimize edin. Çoğu parça, bunun etkinleştirilmesinden yararlanır, ancak bazılarının yararlanması için gerçekte daha uzun bir süre gerekebilir. Bu yüzden, yazdırma süresi tahminlerini optimizasyonlu ve optimizasyonsuz olarak karşılaştırın." +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "Dilimleme Toleransı" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "Çapraz yüzeylerle katman dilimleme yolları. Bir katmanın alanları katmanın ortasının yüzeyle kesiştiği yere (Ortalayıcı) göre oluşturulabilir. Diğer bir yol da her katmanın yüksekliği boyunca hacim içinde kalan alanları (Dışlayıcı) veya katmanın içinde herhangi bir yerde kalan alanları (Kapsayıcı) almasıdır. Dışlayıcı seçenek en çok ayrıntıyı tutar; Kapsayıcı seçenek en iyi şekilde oturur; Ortalayıcı ise en kısa sürede işlenir." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "Ortalayıcı" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "Dışlayıcı" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "Kapsayıcı" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "Üst Yüzey Hat Genişliği" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "Baskının üst tarafında bulunan alanlardaki tek bir hattın genişliği." + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "Üst Yüzey Şekli" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "En üst yüzeyin şekli." + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "Çizgiler" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "Eş merkezli" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zikzak" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "Üst Yüzey Hat Yönleri" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "Üst yüzey katmanları çizgi veya zikzak biçimindeyken kullanılacak tam sayı hat yönü listesi. Listedeki öğeler, katmanlar ilerledikçe sıralı olarak kullanılır. Listenin sonuna ulaşıldığında tekrar başa dönülür. Liste öğeleri virgülle ayrılır ve tüm liste köşeli parantez içine alınır. Varsayılan ayar boş listedir ve geleneksel varsayılan açılar (45 ve 135 derece) kullanılır." + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Otomatik Sıcaklık" + +#: 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 "Katmanın ortalama akış hızıyla otomatik olarak her katman için sıcaklığı değiştirir." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "Akış Sıcaklık Grafiği" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "Malzeme akışını (saniye başına mm3 bazında) sıcaklığa (santigrat derece) bağlayan veri." + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "Maksimum Çözünürlük" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "Bir çizginin dilimlemeden sonraki minimum boyutu. Bu değer artırıldıktan sonra örgünün çözünürlüğü düşer. Bu, yazıcının g-kodunu işlemek için gereken hıza yetişmesine olanak tanır ve örtünün zaten işlenemeyecek ayrıntılarını kaldırarak dilimleme hızını artırır." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4827,7 +4943,9 @@ 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 "Yarı hızda sıkıştırılmış yukarı doğru hareket mesafesi.\nBu katmanlarda malzemeyi çok fazla ısıtmayarak önceki katmanlarda daha iyi yapışma sağlayabilir. Sadece kablo yazdırmaya uygulanır." +msgstr "" +"Yarı hızda sıkıştırılmış yukarı doğru hareket mesafesi.\n" +"Bu katmanlarda malzemeyi çok fazla ısıtmayarak önceki katmanlarda daha iyi yapışma sağlayabilir. Sadece kablo yazdırmaya uygulanır." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4934,6 +5052,46 @@ 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 "Nozül ve aşağı yöndeki hatlar arasındaki mesafe. Daha büyük açıklık, dik açısı daha küçük çapraz şekilde aşağı yöndeki hatların oluşmasına neden olur, dolayısıyla bu durum bir sonraki katman ile yukarı yönde daha az bağlantıya yol açar. Sadece kablo yazdırmaya uygulanır." +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4994,6 +5152,26 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Modeli dosyadan indirirken modele uygulanacak olan dönüşüm matrisi" +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "Dolgu şekli X ekseni boyunca bu mesafe kadar kaydırılır." + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "Dolgu şekli Y ekseni boyunca bu mesafe kadar kaydırılır." + +#~ 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 "Dolgu ve duvarlar arasındaki çakışma miktarı. Hafif bir çakışma duvarların dolguya sıkıca bağlanmasını sağlar." + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "Hat genişliğinin bir yüzdesi olarak yüzey ve duvarlar arasındaki çakışma miktarı. Az miktar çakışma duvarların yüzeye sıkıca bağlanmasını sağlar. Bu, yüzey hatlarının ve en içteki duvarın ortalama hat genişliklerinin bir yüzdesidir." + +#~ 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 "Isınan yapı levhası için kullanılan sıcaklık. Bu ayar 0 olursa bu yazdırma için yatak ısıtılmaz." + #~ msgctxt "wall_x_extruder_nr label" #~ msgid "Inner Walls Extruder" #~ msgstr "İç Duvar Ekstruderi" diff --git a/resources/i18n/zh_CN/cura.po b/resources/i18n/zh_CN/cura.po index f4bf6159d5..f2d1e5561f 100644 --- a/resources/i18n/zh_CN/cura.po +++ b/resources/i18n/zh_CN/cura.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" @@ -18,7 +18,7 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.7.3\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "打印机设置" @@ -55,12 +55,11 @@ msgstr "连接至 Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -100,7 +99,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "打开 Doodle3D Connect Web 界面" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "显示更新日志" @@ -115,78 +114,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "配置文件已被合并并激活。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "USB 联机打印" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "通过 USB 联机打印" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "通过 USB 联机打印" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "通过 USB 连接" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "无法启动新作业,因为打印机处于忙碌状态或未连接。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "打印机不可用" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "此打印机不支持通过 USB 打印,因为其使用 UltiGCode 类型的 G-code 文件。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "USB 打印" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "无法启动新作业,因为该打印机不支持通过 USB 打印。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "警告" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "无法更新固件,因为没有连接打印机。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "在 %s 无法找到打印机所需的固件。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "打印机固件" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -230,11 +234,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "无法保存到可移动磁盘 {0}:{1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "错误" @@ -284,7 +288,7 @@ msgid "Removable Drive" msgstr "可移动磁盘" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "通过网络打印" @@ -398,110 +402,110 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "打印机状态" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "无法启动新的打印作业。插槽 {0} 中未加载打印头。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "无法启动新的打印作业。插槽 {0} 中未加载材料。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "线轴 {0} 上没有足够的材料。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "不同的打印头(Cura: {0},打印机: 为挤出机 {2} 选择了 {1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "您为挤出机 {2} 选择了不同的材料(Cura:{0},打印机:{1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "打印头 {0} 未正确校准。 需要在打印机上执行 XY 校准。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "您确定要使用所选配置进行打印吗?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "打印机的配置或校准与 Cura 之间不匹配。为了获得最佳打印效果,请务必切换打印头和打印机中插入的材料。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "配置不匹配" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "发送新作业(暂时)受阻,仍在发送前一份打印作业。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "向打印机发送数据" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "正在发送数据" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "无法向打印机发送数据。请确认是否有另一项打印任务仍在进行?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "中止打印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "打印已中止。请检查打印机" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "暂停打印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "恢复打印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "与您的打印机同步" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "您想在 Cura 中使用当前的打印机配置吗?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" msgid "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." msgstr "打印机上的打印头和/或材料与当前项目中的不同。 为获得最佳打印效果,请始终使用已插入打印机的打印头和材料进行切片。" @@ -522,145 +526,188 @@ msgid "{printer_name} has finished printing '{job_name}'. Please collect the pri msgstr "{printer_name} 已完成打印 '{job_name}'。 请收起打印品并确认清空打印平台。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} 已保留用于打印 '{job_name}'。 请更改打印机配置以匹配此项作业,以便开始打印。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "无法发送新打印作业:此 3D 打印机(尚)未设置为运行一组连接的 Ultimaker 3 打印机。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "无法发送打印作业至组 {cluster_name}。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "已发送 {file_name} 至组 {cluster_name}。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "显示打印作业" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "在您的浏览器中打开打印作业界面。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "未知" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "打印机 '{printer_name}' 完成了打印任务 '{job_name}'。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "打印完成" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "需要采取行动" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "发送 {file_name} 至组 {cluster_name}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "通过网络连接" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "您的 {machine_name} 有新功能可用! 建议您更新打印机上的固件。" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "新 %s 固件可用" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "如何更新" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "无法获取更新信息。" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" -msgid "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!" -msgstr "打开 SolidWorks 文件时发生错误! 请检查能否在 SolidWorks 中正常打开文件而不出现任何问题!" +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 +msgctxt "@info:status" +msgid "" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "SolidWorks 零件文件" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "SolidWorks 组件文件" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "配置" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "启动 %s 时发生错误!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "仿真视图" +msgid "Layer view" +msgstr "分层视图" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" msgstr "当单线打印(Wire Printing)功能开启时,Cura 将无法准确地显示打印层(Layers)" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "仿真视图" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "修改 G-Code 文件" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "Cura 收集匿名切片统计资料。 您可以在偏好设置中禁用此选项。" +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -669,14 +716,41 @@ msgstr "正在收集数据" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "关闭此通知" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Cura 15.04 配置文件" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -708,49 +782,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "GIF 图像" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "无法使用当前材料进行切片,因为该材料与所选机器或配置不兼容。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "无法切片" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "无法使用当前设置进行切片。以下设置存在错误:{0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" msgstr "因部分特定模型设置而无法切片。 以下设置在一个或多个模型上存在错误: {error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "无法切片(原因:主塔或主位置无效)。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "无法执行,因为没有一个模型符合成形空间体积。请缩放或旋转模型以适应打印平台。" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "正在处理层" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "信息" @@ -787,14 +861,14 @@ msgstr "复制 Siemens NX 插件文件失败。 请检查您的 UGII_USER_DIR。 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." msgstr "安装 Siemens NX 插件失败。 无法为 Siemens NX 设置环境变量 UGII_USER_DIR。" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "推荐" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "自定义" @@ -805,24 +879,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF 文件" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "喷嘴" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "无法从 {0} 获取插件 ID" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "警告" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "插件浏览器" @@ -837,18 +911,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G 文件" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "解析 G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "G-code 详细信息" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "发送文件之前,请确保 G-code 适用于当前打印机和打印机配置。当前 G-code 文件可能不准确。" @@ -859,6 +933,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Cura 配置文件" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -890,142 +974,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "调平打印平台" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "外壁" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "内壁" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "表层" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "填充" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "支撑填充" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "支撑接触面" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "支撑" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "Skirt" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "移动" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "回抽" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "其它" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "未知" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "预切片文件 {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "未加载材料" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "未知材料" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "正在为模型寻找新位置" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "正在寻找位置" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "无法在成形空间体积内放下全部模型" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "找不到位置" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "文件已存在" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "文件 {0} 已存在。 您确定要替换它吗?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "自定义" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "自定义材料" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "全局" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "未覆盖" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "所选材料与所选机器或配置不兼容。" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1046,67 +1104,89 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "撤销更改材料直径。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "无法将配置文件导出至 {0} {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "无法将配置文件导出至 {0} : 写入器插件报告故障。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "配置文件已导出至: {0} " -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "导出成功" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "无法从 {0} 导入配置文件: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "已成功导入配置文件 {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "配置 {0} 文件类型未知或已损坏。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "自定义配置文件" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "配置文件缺少打印质量类型定义。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "无法为当前配置找到质量类型 {0}。" +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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." @@ -1117,142 +1197,167 @@ msgctxt "@info:title" msgid "Build Volume" msgstr "成形空间体积" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "复制并放置模型" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "放置模型" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "无法在成形空间体积内放下全部模型" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "正在为模型寻找新位置" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "正在寻找位置" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "找不到位置" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "错误报告" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    发生了致命错误。 请将这份错误报告发送给我们以便修复问题

    \n

    请使用“发送报告”按钮将错误报告自动发布到我们的服务器

    \n " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "系统信息" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "未知" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Cura 版本: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "平台: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Qt 版本: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "PyQt 版本: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • OpenGL 版本: {version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • OpenGL 供应商: {vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • OpenGL 渲染器: {renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "异常追溯" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "日志" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "用户说明" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "发送报告" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "正在载入打印机..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "正在设置场景..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "正在载入界面…" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "一次只能加载一个 G-code 文件。{0} 已跳过导入" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "如果加载 G-code,则无法打开其他任何文件。{0} 已跳过导入" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "所选模型过小,无法加载。" @@ -1281,12 +1386,11 @@ msgstr "X (宽度)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1376,68 +1480,67 @@ msgctxt "@tooltip" msgid "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\"." msgstr "喷嘴尖端与十字轴系统(X 轴和 Y 轴)之间的高度差。 用于防止“排队”打印时之前的打印品与十字轴发生碰撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "挤出机数目" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "打印机所支持耗材的公称直径。 材料和/或配置文件将覆盖精确直径。" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "材料直径" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "喷嘴孔径" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "GCode 开始部分" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "将在开始时执行的 Gcode 命令。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "GCode 结束部分" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "将在结束时执行的 Gcode 命令。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "喷嘴设置" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "喷嘴孔径" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "打印机所支持耗材的公称直径。 材料和/或配置文件将覆盖精确直径。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "喷嘴偏移 X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "喷嘴偏移 Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "挤出机 Gcode 开始部分" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "挤出机 Gcode 结束部分" @@ -1450,8 +1553,9 @@ msgstr "更新日志" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1516,7 +1620,10 @@ 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 "要通过网络向打印机发送打印请求,请确保您的打印机已通过网线或 WIFI 连接到网络。若您不能连接 Cura 与打印机,您仍然可以使用 USB 设备将 G-code 文件传输到打印机。\n\n从以下列表中选择您的打印机:" +msgstr "" +"要通过网络向打印机发送打印请求,请确保您的打印机已通过网线或 WIFI 连接到网络。若您不能连接 Cura 与打印机,您仍然可以使用 USB 设备将 G-code 文件传输到打印机。\n" +"\n" +"从以下列表中选择您的打印机:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1532,7 +1639,7 @@ msgstr "编辑" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "删除" @@ -1554,14 +1661,14 @@ msgid "Type" msgstr "类型" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Extended" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1605,8 +1712,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "输入打印机在网络上的 IP 地址或主机名。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1627,6 +1732,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 未设置为运行一组连接的 Ultimaker 3 打印机" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1657,11 +1767,16 @@ msgid "Available" msgstr "可用" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "与打印机的连接中断" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1753,138 +1868,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "应用配置" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Cura SolidWorks 插件配置" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "导出 STL 的默认质量:" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "总是询问" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "总是使用精细品质" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "总是使用粗糙品质" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "导入 SolidWorks 文件为 STL..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "导出 STL 的质量" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "质量" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "粗糙" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "精细" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "记住我的选择" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "保存" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "颜色方案" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "材料颜色" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "走线类型" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "进给速度" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "层厚度" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "兼容模式" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "显示移动轨迹" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "显示打印辅助结构" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "显示外壳" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "显示填充" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "只显示顶层" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "在顶部显示 5 层打印细节" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "顶 / 底层" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "内壁" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "最小" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "最大" @@ -1909,7 +2136,7 @@ msgctxt "@label" msgid "Settings" msgstr "设置" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "更改目前启用的后期处理脚本" @@ -1984,23 +2211,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "平滑" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "选择设置" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "选择对此模型的自定义设置" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "筛选…" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "显示全部" @@ -2166,7 +2423,10 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "该插件包含一个许可。\n您需要接受此许可才能安装此插件。\n是否同意下列条款?" +msgstr "" +"该插件包含一个许可。\n" +"您需要接受此许可才能安装此插件。\n" +"是否同意下列条款?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2357,66 +2617,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "一切正常!你已经完成检查。" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "未连接至打印机" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "打印机不接受命令" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "维护中。请检查打印机" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "打印中..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "已暂停" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "初始化中..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "请取出打印件" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "恢复" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "暂停" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "中止打印" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "中止打印" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "您确定要中止打印吗?" @@ -2431,7 +2691,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "您已自定义某些配置文件设置。\n您想保留或舍弃这些设置吗?" +msgstr "" +"您已自定义某些配置文件设置。\n" +"您想保留或舍弃这些设置吗?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2449,19 +2711,19 @@ msgid "Customized" msgstr "自定义" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "总是询问" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "舍弃更改,并不再询问此问题" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "保留更改,并不再询问此问题" @@ -2496,72 +2758,72 @@ msgctxt "@label" msgid "Brand" msgstr "品牌" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "材料类型" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "颜色" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "属性" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "密度" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "直径" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "耗材成本" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "耗材重量" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "耗材长度" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "每米成本" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "此材料与 %1 相关联,并共享其某些属性。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "解绑材料" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "描述" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "粘附信息" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "打印设置" @@ -2602,7 +2864,7 @@ msgid "Unit" msgstr "单位" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "基本" @@ -2617,230 +2879,255 @@ msgctxt "@label" msgid "Language:" msgstr "语言:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "币种:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "主题:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." msgstr "需重新启动 Cura,新的设置才能生效。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "当设置被更改时自动进行切片。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "自动切片" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "视区行为" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "以红色突出显示模型需要增加支撑结构的区域。没有支撑,这些区域将无法正确打印。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "显示悬垂(Overhang)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "当模型被选中时,视角将自动调整到最合适的观察位置(模型处于正中央)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "当项目被选中时,自动对中视角" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "需要令 Cura 的默认缩放操作反转吗?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "反转视角变焦方向。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "是否跟随鼠标方向进行缩放?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "跟随鼠标方向缩放" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "需要移动平台上的模型,使它们不再相交吗?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "确保每个模型都保持分离" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "需要转动模型,使它们接触打印平台吗?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "自动下降模型到打印平台" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "在 G-code 读取器中显示警告信息。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "G-code 读取器中的警告信息" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "层视图要强制进入兼容模式吗?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "强制层视图兼容模式(需要重新启动)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "打开并保存文件" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "当模型的尺寸过大时,是否将模型自动缩小至成形空间体积?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "缩小过大模型" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "当模型以米而不是毫米为单位时,模型可能会在打印平台中显得非常小。在此情况下是否进行放大?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "放大过小模型" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "打印机名是否自动作为打印作业名称的前缀?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "将机器前缀添加到作业名称中" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "保存项目文件时是否显示摘要?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "保存项目时显示摘要对话框" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "打开项目文件时的默认行为" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "打开项目文件时的默认行为:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "总是询问" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "始终作为一个项目打开" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "始终导入模型" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "当您对配置文件进行更改并切换到其他配置文件时将显示一个对话框,询问您是否要保留修改。您也可以选择一个默认行为并令其不再显示该对话框。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "重写配置文件" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "隐私" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "当 Cura 启动时,是否自动检查更新?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "启动时检查更新" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "您愿意将关于您的打印数据以匿名形式发送到 Ultimaker 吗?注意:我们不会记录/发送任何模型、IP 地址或其他私人数据。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "(匿名)发送打印信息" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "打印机" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "激活" @@ -2883,7 +3170,7 @@ msgid "Waiting for a printjob" msgstr "等待打印作业" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "配置文件" @@ -2909,13 +3196,13 @@ msgid "Duplicate" msgstr "复制" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "导入" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "导出" @@ -2981,7 +3268,7 @@ msgid "Export Profile" msgstr "导出配置文件" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "材料" @@ -2996,60 +3283,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "打印机:%1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "创建" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "复制" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "导入配置" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" msgstr "无法导入材料 %1%2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "成功导入材料 %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "导出材料" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" msgstr "无法导出材料至 %1%2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "成功导出材料至: %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "新增打印机" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "打印机名称:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "新增打印机" @@ -3074,7 +3361,9 @@ 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 由 Ultimaker B.V. 与社区合作开发。\nCura 使用以下开源项目:" +msgstr "" +"Cura 由 Ultimaker B.V. 与社区合作开发。\n" +"Cura 使用以下开源项目:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3176,158 +3465,167 @@ msgctxt "@label" msgid "Profile:" msgstr "配置文件:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "没有配置文件可用" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 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 "某些设置/重写值与存储在配置文件中的值不同。\n\n点击打开配置文件管理器。" +msgstr "" +"某些设置/重写值与存储在配置文件中的值不同。\n" +"\n" +"点击打开配置文件管理器。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "搜索..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "将值复制到所有挤出机" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "隐藏此设置" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "不再显示此设置" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "保持此设置可见" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "配置设置可见性..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "一些隐藏设置正在使用有别于一般设置的计算值。\n\n单击以使这些设置可见。" +msgstr "" +"一些隐藏设置正在使用有别于一般设置的计算值。\n" +"\n" +"单击以使这些设置可见。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "影响" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "受影响项目:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "此设置始终对所有挤出机有效。在此进行更改将影响所有挤出机。" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "该值将会根据每一个挤出机的设置而确定" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 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 "此设置的值与配置文件不同。\n\n单击以恢复配置文件的值。" +msgstr "" +"此设置的值与配置文件不同。\n" +"\n" +"单击以恢复配置文件的值。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 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 "此设置通常可被自动计算,但其当前已被绝对定义。\n\n单击以恢复自动计算的值。" +msgstr "" +"此设置通常可被自动计算,但其当前已被绝对定义。\n" +"\n" +"单击以恢复自动计算的值。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "打印设置" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "打印设置已禁用\nG-code 文件无法被修改" +msgstr "" +"打印设置已禁用\n" +"G-code 文件无法被修改" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00 小时 00 分" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "时间规范
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "成本规定" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "总计:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "推荐的打印设置

    使用针对所选打印机、材料和质量的推荐设置进行打印。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "自定义打印设置
    对切片过程中的每一个细节进行精细控制。" -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "自动:%1" @@ -3337,6 +3635,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "视图(&V)" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3348,13 +3656,13 @@ msgid "Print Selected Model With:" msgid_plural "Print Selected Models With:" msgstr[0] "打印所选模型:" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "复制所选模型" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "复制个数" @@ -3370,7 +3678,7 @@ msgid "No printer connected" msgstr "没有连接打印机" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "挤出机" @@ -3480,251 +3788,291 @@ msgctxt "@label" msgid "Estimated time left" msgstr "预计剩余时间" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "切换完整界面(&F)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "撤销(&U)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "重做(&R)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "退出(&Q)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "重置摄像头位置(&R)" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "配置 Cura…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "新增打印机(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "管理打印机(&I)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "管理材料…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "使用当前设置 / 重写值更新配置文件(&U)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "舍弃当前更改(&D)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "从当前设置 / 重写值创建配置文件(&C)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "管理配置文件.." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "显示在线文档(&D)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "BUG 反馈(&B)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "关于(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "删除所选模型(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "居中所选模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "复制所选模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "删除模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "使模型居于平台中央(&N)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "绑定模型(&G)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "拆分模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "合并模型(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "复制模型…(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "选择所有模型(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "清空打印平台(&C)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "重新载入所有模型(&L)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "编位所有的模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "为所选模型编位" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "复位所有模型的位置" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "复位所有模型的变动(&T)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "打开文件(&O)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "新建项目(&N)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "显示引擎日志(&L)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "显示配置文件夹" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "配置设定可见性..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "浏览插件..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "已安装插件..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "请载入一个 3D 模型" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "切片已准备就绪" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "正在切片..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "%1 已准备就绪" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "无法切片" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "切片不可用" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "准备" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "取消" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "选择活动的输出装置" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "打开文件" @@ -3744,114 +4092,114 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "文件(&F)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "保存到文件(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "另存为(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "保存项目" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "编辑(&E)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "视图(&V)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "设置(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "打印机(&P)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "材料(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "配置文件(&P)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "设为主要挤出机" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "扩展(&X)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "插件" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "偏好设置(&R)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "帮助(&H)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "打开文件" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "设置" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "新建项目" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 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 "你确定要开始一个新项目吗?这将清除打印平台及任何未保存的设置。" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "安装插件" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "打开文件" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "我们已经在您选择的文件中找到一个或多个 G-Code 文件。您一次只能打开一个 G-Code 文件。若需打开 G-Code 文件,请仅选择一个。" @@ -3876,97 +4224,82 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "保存时不再显示项目摘要" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "保存" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "准备" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "监控" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "层高" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" msgstr "自定义配置文件目前处于活动状态。 如要启用质量滑块,请在“自定义”选项卡中选择一个默认质量配置文件" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "打印速度" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "更慢" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "更快" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "您已修改部分配置文件设置。 如果您想对其进行更改,请转至自定义模式。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "填充" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "渐层填充(Gradual infill)将随着打印高度的提升而逐渐加大填充密度。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "启用渐层" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "生成支撑" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "在模型的悬垂(Overhangs)部分生成支撑结构。若不这样做,这些部分在打印时将倒塌。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "支撑用挤出机" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "选择用于支撑的挤出机。该挤出机将在模型之下建立支撑结构,以防止模型下垂或在空中打印。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "打印平台附着" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "允许打印 Brim 或 Raft。这将在您的对象周围或下方添加一个容易切断的平面区域。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "需要帮助改善您的打印?阅读 Ultimaker 故障排除指南" @@ -3982,17 +4315,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "打开项目文件" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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 "这是一个 Cura 项目文件。您想将其作为一个项目打开还是从中导入模型?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "记住我的选择" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "作为项目打开" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "导入模型" @@ -4002,21 +4340,36 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "引擎日志" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "材料" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "检查兼容性" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "点击查看 Ultimaker.com 上的材料兼容情况。" +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" @@ -4107,6 +4460,26 @@ msgctxt "name" msgid "USB printing" msgstr "USB 联机打印" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4127,6 +4500,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3 网络连接" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4139,8 +4522,8 @@ msgstr "固件更新检查程序" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "让您可以通过 SolidWorks 自身打开特定文件。 随后会将这些文件进行转换并载入 Cura" +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." +msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4207,6 +4590,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "旧版 Cura 配置文件读取器" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4367,6 +4760,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Cura 配置文件写入器" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4407,6 +4810,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura 配置文件读取器" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "未知" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "打开 SolidWorks 文件时发生错误! 请检查能否在 SolidWorks 中正常打开文件而不出现任何问题!" + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "启动 %s 时发生错误!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "仿真视图" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Cura 收集匿名切片统计资料。 您可以在偏好设置中禁用此选项。" + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "关闭此通知" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "全局" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    发生了致命错误。 请将这份错误报告发送给我们以便修复问题

    \n" +#~ "

    请使用“发送报告”按钮将错误报告自动发布到我们的服务器

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Cura 版本: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "平台: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Qt 版本: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "PyQt 版本: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "异常追溯" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "材料直径" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker 3 Extended" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Cura SolidWorks 插件配置" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "导出 STL 的默认质量:" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "总是询问" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "总是使用精细品质" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "总是使用粗糙品质" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "导入 SolidWorks 文件为 STL..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "导出 STL 的质量" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "质量" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "粗糙" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "精细" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "没有配置文件可用" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "此设置始终对所有挤出机有效。在此进行更改将影响所有挤出机。" + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "时间规范
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "重置摄像头位置(&R)" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "保存项目" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "准备" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "监控" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "检查兼容性" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "让您可以通过 SolidWorks 自身打开特定文件。 随后会将这些文件进行转换并载入 Cura" + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "冻结操作" @@ -4427,13 +4980,9 @@ msgstr "Cura 配置文件读取器" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "为确保您的 {machine_name} 具备最新功能,建议定期更新固件。 更新可在 {machine_name} 上(连接至网络时)或通过 USB 进行。" -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "分层视图" - -msgctxt "@info:title" -msgid "Layer View" -msgstr "分层视图" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "分层视图" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4534,9 +5083,9 @@ msgstr "分层视图" #~ msgid "Provides the Layer view." #~ msgstr "提供分层视图。" -msgctxt "name" -msgid "Layer View" -msgstr "分层视图" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "分层视图" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4857,9 +5406,9 @@ msgstr "分层视图" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "提供了从 GCode 文件中导入配置文件的支持。" -msgctxt "@label" -msgid "Layer View" -msgstr "分层视图" +#~ msgctxt "@label" +#~ msgid "Layer View" +#~ msgstr "分层视图" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/zh_CN/fdmextruder.def.json.po b/resources/i18n/zh_CN/fdmextruder.def.json.po index 15166711f2..a6bce6f9c5 100644 --- a/resources/i18n/zh_CN/fdmextruder.def.json.po +++ b/resources/i18n/zh_CN/fdmextruder.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" diff --git a/resources/i18n/zh_CN/fdmprinter.def.json.po b/resources/i18n/zh_CN/fdmprinter.def.json.po index 76bb1c09e7..0e3eca14d7 100644 --- a/resources/i18n/zh_CN/fdmprinter.def.json.po +++ b/resources/i18n/zh_CN/fdmprinter.def.json.po @@ -2,12 +2,12 @@ # 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 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" -"POT-Creation-Date: 2017-11-21 16:58+0000\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" @@ -58,7 +58,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "在开始后执行的 G-code 命令 - 以 \n 分行" +msgstr "" +"在开始后执行的 G-code 命令 - 以 \n" +" 分行" #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,7 +72,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "在结束前执行的 G-code 命令 - 以 \n 分行" +msgstr "" +"在结束前执行的 G-code 命令 - 以 \n" +" 分行" #: fdmprinter.def.json msgctxt "material_guid label" @@ -347,6 +351,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -607,31 +621,6 @@ 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 "起始层高(以毫米为单位)。起始层越厚,与打印平台的粘着越轻松。" -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "切片公差" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "如何对带有对角线表面的层进行切片。层面积可以根据层的中心与表面(中间)相交的位置生成。或者每一层的面积可以为落在整个层高度中成形体积内的面积 (Exclusive),或者为落在层中任何位置的面积 (Inclusive)。Exclusive 保留大部分细节,Inclusive 可实现最佳匹配,而 Middle 需要的处理的时间最少。" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "Middle" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "Exclusive" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "Inclusive" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -672,16 +661,6 @@ msgctxt "wall_line_width_x description" msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "适用于所有壁线(最外壁线除外)的单一壁线宽度。" -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "顶部表面皮肤线宽" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "打印顶部区域单一走线宽度。" - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -862,41 +841,6 @@ msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "最顶部皮肤层数。 通常只需一层最顶层就足以生成较高质量的顶部表面。" -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "顶部表面皮肤图案" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "最顶层图案。" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "走线" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "同心" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "锯齿形" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "顶部表面皮肤走线方向" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "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)." -msgstr "当顶部表面皮肤层采用线条或锯齿状图案时使用的整数走线方向的列表。 列表中的元素随层的进度依次使用,当达到列表末尾时,它将从头开始。 列表项以逗号分隔,整个列表包含在方括号中。 默认是一个空列表,即意味着使用传统的默认角度(45 和 135 度)。" - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1027,6 +971,16 @@ 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 "应用在外壁路径上的嵌入。 如果外壁小于喷嘴,并且在内壁之后打印,则使用该偏移量来使喷嘴中的孔与内壁而不是模型外部重叠。" +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "优化壁打印顺序" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "优化打印各个壁的顺序,以减少回抽次数和空驶距离。 启用此设置将对大部分零件有益,但有的则会耗费更长时间,因此请将优化和不优化的打印时间估计值进行对比。" + #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" @@ -1097,6 +1051,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "全部填充" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1479,8 +1443,8 @@ msgstr "填充 X 轴偏移量" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "填充图案沿 X 轴偏移此距离。" +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1489,8 +1453,8 @@ msgstr "填充 Y 轴偏移量" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "填充图案沿 Y 轴偏移此距离。" +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1509,8 +1473,8 @@ 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 "填充物和壁之间的重叠量。 稍微重叠可让各个壁与填充物牢固连接。" +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1529,8 +1493,8 @@ msgstr "皮肤重叠百分比" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "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." -msgstr "皮肤和壁之间的重叠量,以走线宽度百分比表示。 稍微重叠可让各个壁与皮肤牢固连接。 这是皮肤线平均走线宽度和最内壁的百分比。" +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." +msgstr "" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1692,16 +1656,6 @@ msgctxt "material description" msgid "Material" msgstr "材料" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -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 "根据每一层的平均流速自动更改每层的温度。" - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -1752,16 +1706,6 @@ msgctxt "material_final_print_temperature description" msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "打印结束前开始冷却的温度。" -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "流量温度图" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." -msgstr "数据连接材料流量(mm3/s)到温度(摄氏度)。" - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -1779,8 +1723,8 @@ 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 "用于加热打印平台的温度。 如果打印平台温度为 0,则热床将不会为此次打印加热。" +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." +msgstr "" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3452,6 +3396,16 @@ 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 "塔顶角度。 该值越高,塔顶越尖,值越低,塔顶越平。" +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +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 "在支撑网格下方的所有位置进行支撑,让支撑网格中没有悬垂。" + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -3552,7 +3506,9 @@ 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 "skirt 和打印第一层之间的水平距离。\n这是最小距离。多个 skirt 走线将从此距离向外延伸。" +msgstr "" +"skirt 和打印第一层之间的水平距离。\n" +"这是最小距离。多个 skirt 走线将从此距离向外延伸。" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4084,16 +4040,6 @@ 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 "一般情况下,Cura 会尝试缝合网格中的小孔,并移除有大孔的部分层。 启用此选项将保留那些无法缝合的部分。 当其他所有方法都无法产生正确的 GCode 时,该选项应该被用作最后手段。" -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "最大分辨率" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "走线部分在切片后的最小尺寸。如果提高此值,网格的分辨率将降低。这可让打印机保持处理 g-code 所需的速度,并将通过移除无法处理的网格细节提高切片速度。" - #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4244,16 +4190,6 @@ msgctxt "support_mesh description" msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "使用此网格指定支撑区域。 可用于生成支撑结构。" -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -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 "在支撑网格下方的所有位置进行支撑,让支撑网格中没有悬垂。" - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -4330,14 +4266,194 @@ msgid "experimental!" msgstr "实验性!" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "优化壁打印顺序" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "优化打印各个壁的顺序,以减少回抽次数和空驶距离。 启用此设置将对大部分零件有益,但有的则会耗费更长时间,因此请将优化和不优化的打印时间估计值进行对比。" +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "切片公差" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "如何对带有对角线表面的层进行切片。层面积可以根据层的中心与表面(中间)相交的位置生成。或者每一层的面积可以为落在整个层高度中成形体积内的面积 (Exclusive),或者为落在层中任何位置的面积 (Inclusive)。Exclusive 保留大部分细节,Inclusive 可实现最佳匹配,而 Middle 需要的处理的时间最少。" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "Middle" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "Exclusive" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "Inclusive" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "顶部表面皮肤线宽" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "打印顶部区域单一走线宽度。" + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "顶部表面皮肤图案" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "最顶层图案。" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "走线" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "锯齿形" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "顶部表面皮肤走线方向" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "当顶部表面皮肤层采用线条或锯齿状图案时使用的整数走线方向的列表。 列表中的元素随层的进度依次使用,当达到列表末尾时,它将从头开始。 列表项以逗号分隔,整个列表包含在方括号中。 默认是一个空列表,即意味着使用传统的默认角度(45 和 135 度)。" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +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 "根据每一层的平均流速自动更改每层的温度。" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "流量温度图" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "数据连接材料流量(mm3/s)到温度(摄氏度)。" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "最大分辨率" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "走线部分在切片后的最小尺寸。如果提高此值,网格的分辨率将降低。这可让打印机保持处理 g-code 所需的速度,并将通过移除无法处理的网格细节提高切片速度。" #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -4829,7 +4945,9 @@ 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 "以半速挤出的上行移动的距离。\n这会与之前的层产生更好的附着,而不会将这些层中的材料过度加热。 仅应用于单线打印。" +msgstr "" +"以半速挤出的上行移动的距离。\n" +"这会与之前的层产生更好的附着,而不会将这些层中的材料过度加热。 仅应用于单线打印。" #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4936,6 +5054,46 @@ 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 "喷嘴和水平下行线之间的距离。 较大的间隙会让斜下行线角度较平缓,进而使第二层的上行连接较少。 仅应用于单线打印。" +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." +msgstr "" + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4996,6 +5154,26 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "在将模型从文件中载入时应用在模型上的转换矩阵。" +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "填充图案沿 X 轴偏移此距离。" + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "填充图案沿 Y 轴偏移此距离。" + +#~ 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 "填充物和壁之间的重叠量。 稍微重叠可让各个壁与填充物牢固连接。" + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "皮肤和壁之间的重叠量,以走线宽度百分比表示。 稍微重叠可让各个壁与皮肤牢固连接。 这是皮肤线平均走线宽度和最内壁的百分比。" + +#~ 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 "用于加热打印平台的温度。 如果打印平台温度为 0,则热床将不会为此次打印加热。" + #~ msgctxt "wall_x_extruder_nr label" #~ msgid "Inner Walls Extruder" #~ msgstr "内壁挤出机" diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po index 2b000890f5..b884b13a19 100644 --- a/resources/i18n/zh_TW/cura.po +++ b/resources/i18n/zh_TW/cura.po @@ -18,7 +18,7 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 2.0.4\n" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:26 msgctxt "@action" msgid "Machine Settings" msgstr "印表機設定" @@ -55,12 +55,11 @@ msgstr "正在連接 Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:875 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:659 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:355 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 @@ -100,7 +99,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "開啟 Doodle3D Connect 的網路介面" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "顯示更新日誌" @@ -115,81 +114,83 @@ msgctxt "@info:status" msgid "Profile has been flattened & activated." msgstr "列印參數已被合併並啟用。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" msgstr "USB 連線列印" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" msgstr "透過 USB 連線列印" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" msgstr "透過 USB 連線列印" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" msgid "Connected via USB" msgstr "透過 USB 連接" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "無法啟動新作業,因為印表機處於忙碌狀態或未連接。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:183 msgctxt "@info:title" msgid "Printer Unavailable" msgstr "印表機無法使用" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:status" -msgid "" -"This printer does not support USB printing because it uses UltiGCode flavor." -msgstr "" -"此印表機不支援透過 USB 連線列印,因為其使用 UltiGCode 類型的 G-code 檔案。" +msgid "This printer does not support USB printing because it uses UltiGCode flavor." +msgstr "此印表機不支援透過 USB 連線列印,因為其使用 UltiGCode 類型的 G-code 檔案。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:485 msgctxt "@info:title" msgid "USB Printing" msgstr "USB 連線列印" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 msgctxt "@info:status" -msgid "" -"Unable to start a new job because the printer does not support usb printing." +msgid "Unable to start a new job because the printer does not support usb printing." msgstr "無法啟動新作業,因為該印表機不支援 USB 連線列印。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:946 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1418 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1496 msgctxt "@info:title" msgid "Warning" msgstr "警告" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:103 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." msgstr "無法更新韌體,因為沒有連接印表機。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." msgstr "在 %s 無法找到印表機所需的韌體。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:117 msgctxt "@info:title" msgid "Printer Firmware" msgstr "印表機韌體" +#: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Prepare" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" @@ -233,11 +234,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "無法儲存到行動裝置 {0}:{1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:693 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:701 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:160 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1427 msgctxt "@info:title" msgid "Error" msgstr "錯誤" @@ -287,7 +288,7 @@ msgid "Removable Drive" msgstr "行動裝置" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:51 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "網路連線列印" @@ -299,8 +300,7 @@ msgstr "網路連線列印" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" -msgid "" -"Access to the printer requested. Please approve the request on the printer" +msgid "Access to the printer requested. Please approve the request on the printer" msgstr "已發送印表機存取請求,請在印表機上批准該請求" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 @@ -358,8 +358,7 @@ msgstr "向印表機發送存取請求" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" -msgid "" -"Connected over the network. Please approve the access request on the printer." +msgid "Connected over the network. Please approve the access request on the printer." msgstr "已透過網路連接。請在印表機上接受存取請求。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 @@ -389,17 +388,13 @@ msgstr "網路連接中斷。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" -msgid "" -"The connection with the printer was lost. Check your printer to see if it is " -"connected." +msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "與印表機的連接中斷,請檢查印表機是否已連接。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" -msgid "" -"Unable to start a new print job, printer is busy. Current printer status is " -"%s." +msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "印表機無法啟動新的列印作業,目前的印表機狀態為 %s。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 @@ -407,309 +402,313 @@ msgctxt "@info:title" msgid "Printer Status" msgstr "印表機狀態" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "無法啟動新的列印作業。插槽 {0} 中未載入列印頭。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "無法啟動新的列印作業。插槽 {0} 中未載入耗材。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:710 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "線軸 {0} 上沒有足夠的耗材。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:720 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "不同的列印頭(Cura:{0},印表機: 為擠出機 {2} 選擇了 {1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "你為擠出機 {2} 選擇了不同的耗材(Cura:{0},印表機:{1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:742 #, python-brace-format msgctxt "@label" -msgid "" -"PrintCore {0} is not properly calibrated. XY calibration needs to be " -"performed on the printer." +msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "列印頭 {0} 未正確校準。需要在印表機上執行 XY 校正。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "你確定要使用所選設定進行列印嗎?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:748 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 "" -"印表機的設定或校正與 Cura 之間不匹配。為了獲得最佳列印效果,請使用印表機的列" -"印頭和耗材設定進行切片。" +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 "印表機的設定或校正與 Cura 之間不匹配。為了獲得最佳列印效果,請使用印表機的列印頭和耗材設定進行切片。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:754 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "設定不匹配" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:865 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:258 msgctxt "@info:status" -msgid "" -"Sending new jobs (temporarily) blocked, still sending the previous print job." +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." msgstr "前一列印作業傳送中,暫停傳送新列印作業。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:status" msgid "Sending data to printer" msgstr "正在向印表機發送資料" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 msgctxt "@info:title" msgid "Sending Data" msgstr "發送資料中" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "無法向印表機發送資料。請確認是否有另一項列印作業正在進行?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1087 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "中斷列印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1093 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "列印已中斷。請檢查印表機" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "暫停列印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1101 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "繼續列印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@window:title" msgid "Sync with your printer" msgstr "與你的印表機同步" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "你想在 Cura 中使用目前的印表機設定嗎?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1295 msgctxt "@label" -msgid "" -"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." -msgstr "" -"印表機上的列印頭和/或耗材與目前專案中的不同。為獲得最佳列印效果,請使用目前印" -"表機的列印頭和耗材設定進行切片。" +msgid "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." +msgstr "印表機上的列印頭和/或耗材與目前專案中的不同。為獲得最佳列印效果,請使用目前印表機的列印頭和耗材設定進行切片。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 -msgid "" -"This printer is not set up to host a group of connected Ultimaker 3 printers." +msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "這台印表機未設定成管理一組連線的 Ultimaker 3 印表機的主機。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." -msgid "" -"This printer is the host for a group of {count} connected Ultimaker 3 " -"printers." +msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "這台印表機是 {count} 台連線的 Ultimaker 3 印表機群組的主機。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format -msgid "" -"{printer_name} has finished printing '{job_name}'. Please collect the print " -"and confirm clearing the build plate." -msgstr "" -"{printer_name} 已完成列印 '{job_name}'。請收起列印件並確認清空列印平台。" +msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." +msgstr "{printer_name} 已完成列印 '{job_name}'。請收起列印件並確認清空列印平台。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:533 #, python-brace-format -msgid "" -"{printer_name} is reserved to print '{job_name}'. Please change the " -"printer's configuration to match the job, for it to start printing." -msgstr "" -"{printer_name} 已為了列印 '{job_name}' 保留。請更改印表機設定配合此列印作業," -"以便開始列印。" +msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." +msgstr "{printer_name} 已為了列印 '{job_name}' 保留。請更改印表機設定配合此列印作業,以便開始列印。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:277 msgctxt "@info:status" -msgid "" -"Unable to send new print job: this 3D printer is not (yet) set up to host a " -"group of connected Ultimaker 3 printers." -msgstr "" -"無法傳送新的列印作業:這台印表機尚未設定成管理一組連線的 Ultimaker 3 印表機的" -"主機。" +msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." +msgstr "無法傳送新的列印作業:這台印表機尚未設定成管理一組連線的 Ultimaker 3 印表機的主機。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "無法傳送列印作業到群組 {cluster_name}。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:431 #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." msgstr "{file_name} 已傳送到群組 {cluster_name}。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:436 msgctxt "@action:button" msgid "Show print jobs" msgstr "顯示列印作業" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:437 msgctxt "@info:tooltip" msgid "Opens the print jobs interface in your browser." msgstr "使用瀏覽器開啟列印作業介面。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:502 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Unknown" -msgstr "未知" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format msgctxt "@info:status" msgid "Printer '{printer_name}' has finished printing '{job_name}'." msgstr "印表機 '{printer_name}' 已完成列印 '{job_name}'。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:507 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:510 msgctxt "@info:status" msgid "Print finished" msgstr "列印已完成" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:535 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:538 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 msgctxt "@label:status" msgid "Action required" msgstr "需要採取的動作" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:656 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" msgstr "傳送 {file_name} 到群組 {cluster_name} 中" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:17 msgctxt "@action" msgid "Connect via Network" msgstr "透過網路連接" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format -msgctxt "" -"@info Don't translate {machine_name}, since it gets replaced by a printer " -"name!" -msgid "" -"New features are available for your {machine_name}! It is recommended to " -"update the firmware on your printer." +msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "你的 {machine_name} 有新功能可用!建議更新印表機韌體。" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:67 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "有新 %s 韌體可用" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:68 msgctxt "@action:button" msgid "How to update" msgstr "如何更新" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:79 msgctxt "@info" msgid "Could not access update information." msgstr "無法存取更新資訊。" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 +msgctxt "@info:status" +msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 msgctxt "@info:status" msgid "" -"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!" +"Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" +"\n" +" Thanks!." msgstr "" -"開啟 SolidWorks 檔案時發生錯誤! 請檢查能否在 SolidWorks 中正常開" -"啟檔案而不出現任何問題!" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 +msgctxt "@info:status" +msgid "" +"Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" +"\n" +"Sorry!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" msgid "SolidWorks part file" msgstr "SolidWorks 零件檔案" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:29 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" msgstr "SolidWorks 組件檔案" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "SolidWorks drawing file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"We could not find a valid installation of SolidWorks on your system. That means that either SolidWorks is not installed or you don't own an valid license. Please make sure that running SolidWorks itself works without issues and/or contact your ICT.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 +msgctxt "@info:status" +msgid "" +"Dear customer,\n" +"You are currently running this plugin on an operating system other than Windows. This plugin will only work on Windows with SolidWorks installed, including an valid license. Please install this plugin on a Windows machine with SolidWorks installed.\n" +"\n" +"With kind regards\n" +" - Thomas Karl Pietrowski" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" msgstr "設定" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 -#, python-format -msgctxt "@info:status" -msgid "Error while starting %s!" -msgstr "啟動 %s 時發生錯誤!" +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 +msgid "Installation guide for SolidWorks macro" +msgstr "" +# Added manually to fix a string that was changed after string freeze. #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "模擬檢視" +msgid "Layer view" +msgstr "分層檢視" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "" -"當鐵絲網列印(Wire Printing)功能開啟時,Cura 將無法準確地顯示列印層" -"(Layers)" +msgstr "當鐵絲網列印(Wire Printing)功能開啟時,Cura 將無法準確地顯示列印層(Layers)" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:104 msgctxt "@info:title" msgid "Simulation View" msgstr "模擬檢視" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:25 msgid "Modify G-Code" msgstr "修改 G-Code 檔案" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" -msgid "" -"Cura collects anonymised slicing statistics. You can disable this in the " -"preferences." -msgstr "Cura 收集匿名切片統計資料。你可以在偏好設定中關閉此選項。" +msgid "Cura collects anonymized usage statistics." +msgstr "" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -718,14 +717,41 @@ msgstr "收集資料中" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" -msgid "Dismiss" -msgstr "關閉此通知" +msgid "Allow" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 +msgctxt "@action:tooltip" +msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 +msgctxt "@action:button" +msgid "Disable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 +msgctxt "@action:tooltip" +msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." +msgstr "" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" msgstr "Cura 15.04 列印參數" +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 +msgctxt "@item:inlistbox" +msgid "Blender file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 +msgctxt "@info:status" +msgid "" +"Could not export using \"{}\" quality!\n" +"Felt back to \"{}\"." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -757,61 +783,49 @@ msgctxt "@item:inlistbox" msgid "GIF Image" msgstr "GIF 圖片" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 msgctxt "@info:status" -msgid "" -"Unable to slice with the current material as it is incompatible with the " -"selected machine or configuration." +msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." msgstr "無法使用目前耗材切片,因為它與所選機器或設定不相容。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:299 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:349 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:357 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:366 msgctxt "@info:title" msgid "Unable to slice" msgstr "無法切片" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 #, python-brace-format msgctxt "@info:status" -msgid "" -"Unable to slice with the current settings. The following settings have " -"errors: {0}" +msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "無法使用目前設定進行切片。以下設定存在錯誤:{0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:348 #, python-brace-format msgctxt "@info:status" -msgid "" -"Unable to slice due to some per-model settings. The following settings have " -"errors on one or more models: {error_labels}" -msgstr "" -"因部份模型設定問題無法進行切片。部份模型的下列設定有錯誤:{error_labels}" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "因部份模型設定問題無法進行切片。部份模型的下列設定有錯誤:{error_labels}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:356 msgctxt "@info:status" -msgid "" -"Unable to slice because the prime tower or prime position(s) are invalid." +msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "無法切片(原因:換料塔或主位置無效)。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365 msgctxt "@info:status" -msgid "" -"Nothing to slice because none of the models fit the build volume. Please " -"scale or rotate models to fit." -msgstr "" -"沒有模型可進行切片,因為模型超出了列印範圍。請縮放或旋轉模型, 讓模型可置入列" -"印範圍。" +msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." +msgstr "沒有模型可進行切片,因為模型超出了列印範圍。請縮放或旋轉模型, 讓模型可置入列印範圍。" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:status" msgid "Processing Layers" msgstr "正在處理層" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:242 msgctxt "@info:title" msgid "Information" msgstr "資訊" @@ -831,12 +845,8 @@ msgid "Install" msgstr "安裝" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 -msgid "" -"Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It " -"is not set to a directory." -msgstr "" -"無法複製 Siemens NX 外掛檔案。請檢查你的 UGII_USER_DIR,它沒有設置到正確的目" -"錄。" +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "無法複製 Siemens NX 外掛檔案。請檢查你的 UGII_USER_DIR,它沒有設置到正確的目錄。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 @@ -845,25 +855,21 @@ msgid "Successfully installed Siemens NX Cura plugin." msgstr "Siemens NX Cura 外掛已成功安裝。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 -msgid "" -"Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." msgstr "無法複製 Siemens NX 外掛檔案。請檢查你的 UGII_USER_DIR。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 -msgid "" -"Failed to install Siemens NX plugin. Could not set environment variable " -"UGII_USER_DIR for Siemens NX." -msgstr "" -"無法安裝 Siemens NX 外掛。無法為 Siemens NX 設定環境變數 UGII_USER_DIR。" +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "無法安裝 Siemens NX 外掛。無法為 Siemens NX 設定環境變數 UGII_USER_DIR。" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Recommended" msgstr "推薦" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:595 msgctxt "@title:tab" msgid "Custom" msgstr "自訂選項" @@ -874,24 +880,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF 檔案" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:159 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1185 msgctxt "@label" msgid "Nozzle" msgstr "噴頭" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:152 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "無法從 {0} 取得外掛 ID" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:153 msgctxt "@info:tile" msgid "Warning" msgstr "警告" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:191 msgctxt "@window:title" msgid "Plugin browser" msgstr "外掛瀏覽器" @@ -906,25 +912,21 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G 檔案" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:321 msgctxt "@info:status" msgid "Parsing G-code" msgstr "正在解析 G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:323 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:464 msgctxt "@info:title" msgid "G-code Details" msgstr "G-code 細項設定" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:462 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 "" -"發送檔案之前,請確保 G-code 適用於目前印表機和印表機設定。目前 G-code 檔案可" -"能不準確。" +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 "發送檔案之前,請確保 G-code 適用於目前印表機和印表機設定。目前 G-code 檔案可能不準確。" #: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14 @@ -932,6 +934,16 @@ msgctxt "@item:inlistbox" msgid "Cura Profile" msgstr "Cura 列印參數" +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Profile Assistant" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 +msgctxt "@item:inlistbox" +msgid "Profile Assistant" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" @@ -963,146 +975,116 @@ msgctxt "@action" msgid "Level build plate" msgstr "調平列印平台" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Outer Wall" msgstr "外壁" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Inner Walls" msgstr "內壁" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:100 msgctxt "@tooltip" msgid "Skin" msgstr "表層" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:101 msgctxt "@tooltip" msgid "Infill" msgstr "填充" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:102 msgctxt "@tooltip" msgid "Support Infill" msgstr "支撐填充" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:103 msgctxt "@tooltip" msgid "Support Interface" msgstr "支撐介面" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:104 msgctxt "@tooltip" msgid "Support" msgstr "支撐" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:105 msgctxt "@tooltip" msgid "Skirt" msgstr "外圍" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" msgstr "移動" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" msgid "Retractions" msgstr "回抽" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:108 msgctxt "@tooltip" msgid "Other" msgstr "其它" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:231 msgctxt "@label unknown material" msgid "Unknown" msgstr "未知" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:318 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "預切片檔案 {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:440 msgctxt "@item:material" msgid "No material loaded" msgstr "未載入耗材" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:447 msgctxt "@item:material" msgid "Unknown material" msgstr "未知耗材" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 -msgctxt "@info:status" -msgid "Finding new location for objects" -msgstr "正在為物件尋找新位置" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 -msgctxt "@info:title" -msgid "Finding Location" -msgstr "尋找位置中" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /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 "無法在列印範圍內放下全部物件" - -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 -msgctxt "@info:title" -msgid "Can't Find Location" -msgstr "無法找到位置" - -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:437 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:120 msgctxt "@title:window" msgid "File Already Exists" msgstr "檔案已經存在" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:438 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 #, python-brace-format msgctxt "@label Don't translate the XML tag !" -msgid "" -"The file {0} already exists. Are you sure you want to " -"overwrite it?" +msgid "The file {0} already exists. Are you sure you want to overwrite it?" msgstr "檔案 {0} 已存在。你確定要覆蓋掉它嗎?" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" msgid "Custom" msgstr "自訂" -#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:876 msgctxt "@label" msgid "Custom Material" msgstr "自訂耗材" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "整體" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:205 msgctxt "@menuitem" msgid "Not overridden" msgstr "不覆寫" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:124 msgctxt "@info:status" -msgid "" -"The selected material is incompatible with the selected machine or " -"configuration." +msgid "The selected material is incompatible with the selected machine or configuration." msgstr "所選耗材與所選機器或設定不相容。" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:125 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1110,9 +1092,7 @@ msgstr "不相容的耗材" #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:status Has a cancel button next to it." -msgid "" -"The selected material diameter causes the material to become incompatible " -"with the current printer." +msgid "The selected material diameter causes the material to become incompatible with the current printer." msgstr "所選耗材直徑導致耗材與目前印表機不相容。" #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 @@ -1125,229 +1105,260 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "復原更改耗材直徑。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 -#, python-brace-format -msgctxt "@info:status Don't translate the XML tags or !" -msgid "" -"Failed to export profile to {0}: {1}" -msgstr "無法將列印參數匯出至 {0}{1}" - #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Failed to export profile to {0}: {1}" +msgstr "無法將列印參數匯出至 {0}{1}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:158 +#, python-brace-format msgctxt "@info:status Don't translate the XML tag !" -msgid "" -"Failed to export profile to {0}: Writer plugin reported " -"failure." +msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "無法將列印參數匯出至 {0}:寫入器外掛報告故障。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:163 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "列印參數已匯出至:{0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:164 msgctxt "@info:title" msgid "Export succeeded" msgstr "匯出成功" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:211 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:271 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" -msgid "" -"Failed to import profile from {0}: {1}" +msgid "Failed to import profile from {0}: {1}" msgstr "無法從 {0} 匯入列印參數:{1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "This profile {0} contains incorrect data, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "已成功匯入列印參數 {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:277 +#, python-brace-format +msgctxt "@info:status" +msgid "File {0} does not contain any valid profile." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "列印參數 {0} 檔案類型未知或已損壞。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:298 msgctxt "@label" msgid "Custom profile" msgstr "自訂列印參數" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "列印參數缺少列印品質類型定義。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:349 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." msgstr "無法為目前設定找到品質類型 {0}。" +#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:46 +#, python-brace-format +msgctxt "@label" +msgid "Group #{group_nr}" +msgstr "" + #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 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 "" -"由於「列印序列」設定的值,成形列印範圍高度已被減少,以防止龍門與列印模型相衝" -"突。" +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 "由於「列印序列」設定的值,成形列印範圍高度已被減少,以防止龍門與列印模型相衝突。" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:102 msgctxt "@info:title" msgid "Build Volume" msgstr "列印範圍" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:25 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "正在複製並放置模型" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:26 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 msgctxt "@info:title" msgid "Placing Object" msgstr "擺放物件中" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:78 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:88 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:152 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "無法在列印範圍內放下全部物件" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:29 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:64 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "正在為物件尋找新位置" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:33 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:68 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "尋找位置中" + +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:153 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "無法找到位置" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:81 msgctxt "@title:window" msgid "Crash Report" msgstr "錯誤報告" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:94 msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to " -"fix the problem

    \n" -"

    Please use the \"Send report\" button to post a bug report " -"automatically to our servers

    \n" +"

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " msgstr "" -"

    程式發生了致命異常。請將錯誤報告傳送給我們以解決這個問題

    \n" -"

    請使用「送出報告」按鈕將錯誤報告自動發送到我們的伺服器

    \n" -" " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" msgid "System information" msgstr "系統資訊" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:110 msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "未知" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " -msgstr "Cura 版本: {version}
    " - #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "平台: {platform}
    " +msgctxt "@label Cura version number" +msgid "Cura version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "Qt 版本: {qt}
    " +msgctxt "@label Type of platform" +msgid "Platform" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "PyQt 版本: {pyqt}
    " +msgctxt "@label" +msgid "Qt version" +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "OpenGL: {opengl}
    " +msgctxt "@label" +msgid "PyQt version" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 +msgctxt "@label OpenGL version" +msgid "OpenGL" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 +msgctxt "@label" +msgid "not yet initialised
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " msgstr "
  • OpenGL 版本:{version}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:137 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " msgstr "
  • OpenGL 供應商:{vendor}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:138 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " msgstr "
  • OpenGL 渲染器:{renderer}
  • " -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "異常追溯" +msgid "Error traceback" +msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" msgid "Logs" msgstr "日誌" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:237 msgctxt "@title:groupbox" msgid "User description" msgstr "使用者描述" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:252 msgctxt "@action:button" msgid "Send report" msgstr "送出報告" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:274 msgctxt "@info:progress" msgid "Loading machines..." msgstr "正在載入印表機..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:660 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "正在設定場景..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:702 msgctxt "@info:progress" msgid "Loading interface..." msgstr "正在載入介面…" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:899 #, python-format -msgctxt "" -"@info 'width', 'depth' and 'height' are variable names that must NOT be " -"translated; just translate the format of ##x##x## mm." +msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "一次只能載入一個 G-code 檔案。{0} 已跳過匯入" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1426 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "如果載入 G-code,則無法開啟其他任何檔案。{0} 已跳過匯入" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1495 msgctxt "@info:status" msgid "The selected model was too small to load." msgstr "選擇的模型太小無法載入。" @@ -1376,12 +1387,11 @@ msgstr "X (寬度)" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:383 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:394 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:424 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:849 msgctxt "@label" msgid "mm" msgstr "mm" @@ -1428,13 +1438,8 @@ msgstr "X 最小值" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" -msgid "" -"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\"." -msgstr "" -"列印頭左側至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" -"撞。" +msgid "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\"." +msgstr "列印頭左側至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰撞。" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" @@ -1443,13 +1448,8 @@ msgstr "Y 最小值" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" -msgid "" -"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\"." -msgstr "" -"列印頭前端至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" -"撞。" +msgid "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\"." +msgstr "列印頭前端至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰撞。" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" @@ -1458,13 +1458,8 @@ msgstr "X 最大值" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" -msgid "" -"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\"." -msgstr "" -"列印頭右側至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" -"撞。" +msgid "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\"." +msgstr "列印頭右側至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰撞。" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" @@ -1473,13 +1468,8 @@ msgstr "Y 最大值" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" -msgid "" -"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\"." -msgstr "" -"列印頭後部至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" -"撞。" +msgid "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\"." +msgstr "列印頭後部至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰撞。" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" @@ -1488,78 +1478,70 @@ msgstr "龍門高度" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" -msgid "" -"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\"." -msgstr "" -"噴頭尖端與龍門系統(X 軸和 Y 軸)之間的高度差。用於防止「排隊列印」時之前的列" -"印品與龍門發生碰撞。" +msgid "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\"." +msgstr "噴頭尖端與龍門系統(X 軸和 Y 軸)之間的高度差。用於防止「排隊列印」時之前的列印品與龍門發生碰撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 msgctxt "@label" msgid "Number of Extruders" msgstr "擠出機數目" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "" -"The nominal diameter of filament supported by the printer. The exact " -"diameter will be overridden by the material and/or the profile." -msgstr "印表機所支援的耗材直徑。實際列印的耗材直徑由耗材和/或列印參數提供。" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "耗材直徑" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -msgctxt "@label" -msgid "Nozzle size" -msgstr "噴頭孔徑" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 msgctxt "@label" msgid "Start Gcode" msgstr "起始 Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:320 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "將在開始時執行的 Gcode 命令。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:329 msgctxt "@label" msgid "End Gcode" msgstr "結束 Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:339 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "將在結束時執行的 Gcode 命令。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:370 msgctxt "@label" msgid "Nozzle Settings" msgstr "噴頭設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Nozzle size" +msgstr "噴頭孔徑" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 +msgctxt "@label" +msgid "Compatible material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "印表機所支援的耗材直徑。實際列印的耗材直徑由耗材和/或列印參數提供。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset X" msgstr "噴頭偏移 X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:423 msgctxt "@label" msgid "Nozzle offset Y" msgstr "噴頭偏移 Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:444 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "擠出機起始 Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:462 msgctxt "@label" msgid "Extruder End Gcode" msgstr "擠出機結束 Gcode" @@ -1572,8 +1554,9 @@ msgstr "更新日誌" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:306 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:492 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 @@ -1635,16 +1618,11 @@ msgstr "連接到網路印表機" #: /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" +"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 "" -"要透過網路列印,請確認你的印表機已透過網路線或 WIFI 連接到網路。若你無法讓 " -"Cura 與印表機連線,你仍然可以使用 USB 裝置將 G-code 檔案傳輸到印表機。\n" +"要透過網路列印,請確認你的印表機已透過網路線或 WIFI 連接到網路。若你無法讓 Cura 與印表機連線,你仍然可以使用 USB 裝置將 G-code 檔案傳輸到印表機。\n" "\n" "從以下列表中選擇你的印表機:" @@ -1662,7 +1640,7 @@ msgstr "編輯" #: /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:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:171 msgctxt "@action:button" msgid "Remove" msgstr "移除" @@ -1675,9 +1653,7 @@ msgstr "刷新" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" -msgid "" -"If your printer is not listed, read the network printing " -"troubleshooting guide" +msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "如果你的印表機未被列出,請閱讀網路列印故障排除指南" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 @@ -1686,14 +1662,14 @@ msgid "Type" msgstr "類型" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "Ultimaker 3" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 -msgctxt "@label" +msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "Ultimaker 3 Extended" +msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1737,8 +1713,6 @@ msgid "Enter the IP address or hostname of your printer on the network." msgstr "輸入印表機在網路上的 IP 位址或主機名。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" @@ -1759,6 +1733,11 @@ msgctxt "@label: arg 1 is group name" msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 未設定成管理一組連線的 Ultimaker 3 印表機的主機" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 +msgctxt "@label link to connect manager" +msgid "Add/Remove printers" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." @@ -1789,11 +1768,16 @@ msgid "Available" msgstr "可用" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:100 msgctxt "@label:MonitorStatus" msgid "Lost connection with the printer" msgstr "與印表機的連接中斷" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label Printer status" +msgid "Unknown" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" @@ -1885,138 +1869,250 @@ msgctxt "@action:button" msgid "Activate Configuration" msgstr "啟用設定" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "Cura SolidWorks 外掛設定" +msgid "SolidWorks: Export wizard" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "預設的匯出 STL 品質:" +msgid "Quality:" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "總是詢問" +msgid "Fine (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "總是使用精細品質" +msgid "Coarse (3D-printing)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "總是使用粗糙品質" +msgid "Fine (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 -msgctxt "@title:window" -msgid "Import SolidWorks File as STL..." -msgstr "匯入 SolidWorks 檔案為 STL..." - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 -msgctxt "@info:tooltip" -msgid "Quality of the Exported STL" -msgstr "匯出 STL 的品質" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 -msgctxt "@action:label" -msgid "Quality" -msgstr "品質" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" -msgid "Coarse" -msgstr "粗糙" +msgid "Coarse (SolidWorks)" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Fine" -msgstr "精細" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" -msgid "Remember my choice" -msgstr "記住我的選擇" +msgid "Show this dialog again" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 +msgctxt "@action:button" +msgid "Continue" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 +msgctxt "@action:button" +msgid "Abort" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 +msgctxt "@title:window" +msgid "How to install Cura SolidWorks macro" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 +msgctxt "@description:label" +msgid "Steps:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 +msgctxt "@action:button" +msgid "" +"Open the directory\n" +"with macro and icon" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 +msgctxt "@description:label" +msgid "Instructions:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 +msgctxt "@action:playpause" +msgid "Play" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 +msgctxt "@action:playpause" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 +msgctxt "@action:button" +msgid "Previous Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 +msgctxt "@action:button" +msgid "Done" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 +msgctxt "@action:button" +msgid "Next Step" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 +msgctxt "@title:window" +msgid "SolidWorks plugin: Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 +msgctxt "@title:tab" +msgid "Conversion settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 +msgctxt "@label" +msgid "First choice:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 +msgctxt "@text:menu" +msgid "Latest installed version (Recommended)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 +msgctxt "@text:menu" +msgid "Default version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 +msgctxt "@label" +msgid "Show wizard before opening SolidWorks files" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 +msgctxt "@label" +msgid "Automatically rotate opened file into normed orientation" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 +msgctxt "@title:tab" +msgid "Installation(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 +msgctxt "@label" +msgid "COM service found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 +msgctxt "@label" +msgid "Executable found" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 +msgctxt "@label" +msgid "COM starting" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 +msgctxt "@label" +msgid "Revision number" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 +msgctxt "@label" +msgid "Functions available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "儲存" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:117 msgctxt "@label" msgid "Color scheme" msgstr "顏色方案" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:132 msgctxt "@label:listbox" msgid "Material Color" msgstr "耗材顏色" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:136 msgctxt "@label:listbox" msgid "Line Type" msgstr "線條類型" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:140 msgctxt "@label:listbox" msgid "Feedrate" msgstr "進給率" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:144 msgctxt "@label:listbox" msgid "Layer thickness" msgstr "層厚" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:185 msgctxt "@label" msgid "Compatibility Mode" msgstr "相容模式" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:264 msgctxt "@label" msgid "Show Travels" msgstr "顯示移動軌跡" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:270 msgctxt "@label" msgid "Show Helpers" msgstr "顯示輔助結構" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:276 msgctxt "@label" msgid "Show Shell" msgstr "顯示外殼" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:282 msgctxt "@label" msgid "Show Infill" msgstr "顯示填充" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:330 msgctxt "@label" msgid "Only Show Top Layers" msgstr "只顯示頂層" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:339 msgctxt "@label" msgid "Show 5 Detailed Layers On Top" msgstr "顯示頂端 5 層列印細節" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:350 msgctxt "@label" msgid "Top / Bottom" msgstr "頂 / 底層" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:354 msgctxt "@label" msgid "Inner Wall" msgstr "內壁" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:410 msgctxt "@label" msgid "min" msgstr "最小值" -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:452 msgctxt "@label" msgid "max" msgstr "最大值" @@ -2041,7 +2137,7 @@ msgctxt "@label" msgid "Settings" msgstr "設定" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:466 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "更改目前啟用的後處理腳本" @@ -2093,14 +2189,8 @@ msgstr "深度 (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 "" -"預設情況下,白色像素表示網格上的高點,黑色像素表示網格上的低點。更改此選項將" -"以相反方式呈現,黑色像素表示網格上的高點,白色像素表示網格上的低點。" +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 "預設情況下,白色像素表示網格上的高點,黑色像素表示網格上的低點。更改此選項將以相反方式呈現,黑色像素表示網格上的高點,白色像素表示網格上的低點。" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 msgctxt "@item:inlistbox" @@ -2122,23 +2212,53 @@ msgctxt "@action:label" msgid "Smoothing" msgstr "平滑" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 +msgctxt "@label" +msgid "Mesh Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 +msgctxt "@label" +msgid "Normal model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 +msgctxt "@label" +msgid "Print as support" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 +msgctxt "@label" +msgid "Don't support overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 +msgctxt "@label" +msgid "Modify settings for overlap with other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 +msgctxt "@label" +msgid "Modify settings for infill of other models" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" msgid "Select settings" msgstr "選擇設定" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:375 msgctxt "@title:window" msgid "Select Settings to Customize for this model" msgstr "選擇對此模型的自訂設定" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:402 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." msgstr "篩選…" -#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:426 msgctxt "@label:checkbox" msgid "Show all" msgstr "顯示全部" @@ -2347,23 +2467,13 @@ msgstr "列印平台調平" #: /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 "" -"為了確保列印品質出色,你現在可以開始調整你的列印平台。當你點擊「移動到下一個" -"位置」時,噴頭將移動到不同的可調節位置。" +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 "為了確保列印品質出色,你現在可以開始調整你的列印平台。當你點擊「移動到下一個位置」時,噴頭將移動到不同的可調節位置。" #: /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 "" -"在噴頭停止的每一個位置下方插入一張紙,並調整平台高度。當紙張恰好被噴頭的尖端" -"輕微壓住時,表示列印平台已被校準在正確的高度。" +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 "在噴頭停止的每一個位置下方插入一張紙,並調整平台高度。當紙張恰好被噴頭的尖端輕微壓住時,表示列印平台已被校準在正確的高度。" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 msgctxt "@action:button" @@ -2382,21 +2492,13 @@ msgstr "升級韌體" #: /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 "" -"韌體是直接在 3D 印表機上運行的一個軟體。此韌體控制步進馬達,調節溫度讓印表機" -"正常運作。" +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 "韌體是直接在 3D 印表機上運行的一個軟體。此韌體控制步進馬達,調節溫度讓印表機正常運作。" #: /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 "" -"新印表機出廠配備的韌體完全可以正常使用,但新版本往往具有更多的新功能和改進。" +msgid "The firmware shipping with new printers works, but new versions tend to have more features and improvements." +msgstr "新印表機出廠配備的韌體完全可以正常使用,但新版本往往具有更多的新功能和改進。" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 msgctxt "@action:button" @@ -2430,12 +2532,8 @@ msgstr "檢查印表機" #: /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 "" -"對 Ultimaker 進行幾項正確性檢查是很好的做法。如果你知道你的機器功能正常,則可" -"跳過此步驟" +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 "對 Ultimaker 進行幾項正確性檢查是很好的做法。如果你知道你的機器功能正常,則可跳過此步驟" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 msgctxt "@action:button" @@ -2520,66 +2618,66 @@ msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." msgstr "一切正常!你已經完成檢查。" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:87 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" msgstr "未連接至印表機" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:89 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" msgstr "印表機不接受命令" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "維護中。請檢查印表機" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:102 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "列印中..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "已暫停" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "準備中..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:110 msgctxt "@label:MonitorStatus" msgid "Please remove the print" msgstr "請取出列印件" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Resume" msgstr "繼續" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:245 msgctxt "@label:" msgid "Pause" msgstr "暫停" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:274 msgctxt "@label:" msgid "Abort Print" msgstr "中斷列印" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 msgctxt "@window:title" msgid "Abort print" msgstr "中斷列印" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:286 msgctxt "@label" msgid "Are you sure you want to abort the print?" msgstr "你確定要中斷列印嗎?" @@ -2614,19 +2712,19 @@ msgid "Customized" msgstr "自訂" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Always ask me this" msgstr "總是詢問" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" msgstr "捨棄更改,並不再詢問此問題" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:597 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" msgstr "保留更改,並不再詢問此問題" @@ -2661,72 +2759,72 @@ msgctxt "@label" msgid "Brand" msgstr "品牌" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:88 msgctxt "@label" msgid "Material Type" msgstr "耗材類型" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:97 msgctxt "@label" msgid "Color" msgstr "顏色" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Properties" msgstr "屬性" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:143 msgctxt "@label" msgid "Density" msgstr "密度" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:158 msgctxt "@label" msgid "Diameter" msgstr "直徑" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:187 msgctxt "@label" msgid "Filament Cost" msgstr "耗材成本" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:203 msgctxt "@label" msgid "Filament weight" msgstr "耗材重量" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:220 msgctxt "@label" msgid "Filament length" msgstr "耗材長度" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:229 msgctxt "@label" msgid "Cost per Meter" msgstr "每公尺成本" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:243 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." msgstr "此耗材與 %1 相關聯,並共享其部份屬性。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:250 msgctxt "@label" msgid "Unlink Material" msgstr "解除聯結耗材" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:261 msgctxt "@label" msgid "Description" msgstr "描述" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:274 msgctxt "@label" msgid "Adhesion Information" msgstr "附著資訊" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:300 msgctxt "@label" msgid "Print settings" msgstr "列印設定" @@ -2767,7 +2865,7 @@ msgid "Unit" msgstr "單位" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:509 msgctxt "@title:tab" msgid "General" msgstr "基本" @@ -2782,251 +2880,255 @@ msgctxt "@label" msgid "Language:" msgstr "語言:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:207 msgctxt "@label" msgid "Currency:" msgstr "貨幣:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221 msgctxt "@label" msgid "Theme:" msgstr "主題:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:281 msgctxt "@label" -msgid "" -"You will need to restart the application for these changes to have effect." +msgid "You will need to restart the application for these changes to have effect." msgstr "需重新啟動 Cura,新的設定才能生效。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." msgstr "當設定變更時自動進行切片。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:306 msgctxt "@option:check" msgid "Slice automatically" msgstr "自動切片" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320 msgctxt "@label" msgid "Viewport behavior" msgstr "顯示區設定" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:328 msgctxt "@info:tooltip" -msgid "" -"Highlight unsupported areas of the model in red. Without support these areas " -"will not print properly." +msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." msgstr "以紅色凸顯模型缺少支撐的區域。如果沒有支撐這些區域將無法正常列印。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:337 msgctxt "@option:check" msgid "Display overhang" msgstr "顯示懸垂(Overhang)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 msgctxt "@info:tooltip" -msgid "" -"Moves the camera so the model is in the center of the view when a model is " -"selected" +msgid "Moves the camera so the model is in the center of the view when a model is selected" msgstr "當模型被選中時,視角將自動調整到最合適的觀察位置(模型處於正中央)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:349 msgctxt "@action:button" msgid "Center camera when item is selected" msgstr "當專案被選中時,自動置中視角" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:358 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" msgstr "需要讓 Cura 的預設縮放操作反轉嗎?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:363 msgctxt "@action:button" msgid "Invert the direction of camera zoom." msgstr "反轉視角縮放方向。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:372 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" msgstr "是否跟隨滑鼠方向進行縮放?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:377 msgctxt "@action:button" msgid "Zoom toward mouse direction" msgstr "跟隨滑鼠方向縮放" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:386 msgctxt "@info:tooltip" -msgid "" -"Should models on the platform be moved so that they no longer intersect?" +msgid "Should models on the platform be moved so that they no longer intersect?" msgstr "需要移動平台上的模型,使它們不再交錯嗎?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:391 msgctxt "@option:check" msgid "Ensure models are kept apart" msgstr "確保每個模型都保持分離" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" msgstr "要將模型下降到碰觸列印平台嗎?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:404 msgctxt "@option:check" msgid "Automatically drop models to the build plate" msgstr "自動下降模型到列印平台" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." msgstr "在 G-code 讀取器中顯示警告資訊。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:425 msgctxt "@option:check" msgid "Caution message in gcode reader" msgstr "G-code 讀取器中的警告資訊" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:432 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" msgstr "分層檢視要強制進入相容模式嗎?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:437 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" msgstr "強制分層檢視相容模式(需要重新啟動)" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:453 msgctxt "@label" msgid "Opening and saving files" msgstr "開啟並儲存檔案" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:459 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" msgstr "當模型的尺寸過大時,是否將模型自動縮小至列印範圍嗎?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:464 msgctxt "@option:check" msgid "Scale large models" msgstr "縮小過大模型" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:473 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 "" -"部份模型採用較大的單位(例如:公尺),導致模型變得非常小,要將這些模型放大嗎?" +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 "部份模型採用較大的單位(例如:公尺),導致模型變得非常小,要將這些模型放大嗎?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:478 msgctxt "@option:check" msgid "Scale extremely small models" msgstr "放大過小模型" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:487 msgctxt "@info:tooltip" -msgid "" -"Should a prefix based on the printer name be added to the print job name " -"automatically?" +msgid "Should a prefix based on the printer name be added to the print job name automatically?" msgstr "是否自動將印表機名稱作為列印作業名稱的前綴?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:492 msgctxt "@option:check" msgid "Add machine prefix to job name" msgstr "將印表機名稱前綴添加到列印作業名稱中" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" msgstr "儲存專案檔案時是否顯示摘要?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:505 msgctxt "@option:check" msgid "Show summary dialog when saving project" msgstr "儲存專案時顯示摘要對話框" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:514 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" msgstr "開啟專案檔案時的預設行為" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522 msgctxt "@window:text" msgid "Default behavior when opening a project file: " msgstr "開啟專案檔案時的預設行為:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always ask" msgstr "總是詢問" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:536 msgctxt "@option:openProject" msgid "Always open as a project" msgstr "總是作為一個專案開啟" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537 msgctxt "@option:openProject" msgid "Always import models" msgstr "總是匯入模型" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:573 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 "" -"當你對列印參數進行更改然後切換到其他列印參數時,將顯示一個對話框詢問你是否要" -"保留修改。你也可以選擇預設不顯示該對話框。" +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 "當你對列印參數進行更改然後切換到其他列印參數時,將顯示一個對話框詢問你是否要保留修改。你也可以選擇預設不顯示該對話框。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582 msgctxt "@label" msgid "Override Profile" msgstr "覆寫列印參數" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:631 msgctxt "@label" msgid "Privacy" msgstr "隱私權" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:638 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" msgstr "當 Cura 啟動時,是否自動檢查更新?" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:643 msgctxt "@option:check" msgid "Check for updates on start" msgstr "啟動時檢查更新" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:653 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 "" -"你願意將關於你的列印資料以匿名形式發送到 Ultimaker 嗎?注意:我們不會記錄或發" -"送任何模型、IP 地址或其他私人資料。" +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 "你願意將關於你的列印資料以匿名形式發送到 Ultimaker 嗎?注意:我們不會記錄或發送任何模型、IP 地址或其他私人資料。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:658 msgctxt "@option:check" msgid "Send (anonymous) print information" msgstr "(匿名)發送列印資訊" +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 +msgctxt "@label" +msgid "Experimental" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 +msgctxt "@info:tooltip" +msgid "Use multi build plate functionality" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 +msgctxt "@option:check" +msgid "Use multi build plate functionality (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 +msgctxt "@info:tooltip" +msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 +msgctxt "@option:check" +msgid "Do not arrange objects on load" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 msgctxt "@title:tab" msgid "Printers" msgstr "印表機" #: /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 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:138 msgctxt "@action:button" msgid "Activate" msgstr "啟用" @@ -3069,7 +3171,7 @@ msgid "Waiting for a printjob" msgstr "等待列印作業" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:518 msgctxt "@title:tab" msgid "Profiles" msgstr "列印參數" @@ -3095,13 +3197,13 @@ msgid "Duplicate" msgstr "複製" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:182 msgctxt "@action:button" msgid "Import" msgstr "匯入" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:193 msgctxt "@action:button" msgid "Export" msgstr "匯出" @@ -3123,9 +3225,7 @@ msgstr "捨棄目前更改" #: /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." +msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below." msgstr "此列印參數使用印表機指定的預設值,因此在下面的列表中沒有此設定項。" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 @@ -3169,15 +3269,13 @@ msgid "Export Profile" msgstr "匯出列印參數" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:516 msgctxt "@title:tab" msgid "Materials" msgstr "耗材" #: /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" +msgctxt "@action:label %1 is printer name, %2 is how this printer names variants, %3 is variant name" msgid "Printer: %1, %2: %3" msgstr "印表機:%1, %2: %3" @@ -3186,62 +3284,60 @@ msgctxt "@action:label %1 is printer name" msgid "Printer: %1" msgstr "印表機:%1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:150 msgctxt "@action:button" msgid "Create" msgstr "創建" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:160 msgctxt "@action:button" msgid "Duplicate" msgstr "複製" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:298 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:306 msgctxt "@title:window" msgid "Import Material" msgstr "匯入耗材設定" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:307 msgctxt "@info:status Don't translate the XML tags or !" -msgid "" -"Could not import material %1: %2" +msgid "Could not import material %1: %2" msgstr "無法匯入耗材 %1%2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" msgstr "成功匯入耗材 %1" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:329 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:344 msgctxt "@title:window" msgid "Export Material" msgstr "匯出耗材設定" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:348 msgctxt "@info:status Don't translate the XML tags and !" -msgid "" -"Failed to export material to %1: %2" +msgid "Failed to export material to %1: %2" msgstr "無法匯出耗材至 %1%2" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:354 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "成功匯出耗材至:%1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:869 msgctxt "@title:window" msgid "Add Printer" msgstr "新增印表機" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:194 msgctxt "@label" msgid "Printer Name:" msgstr "印表機名稱:" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:217 msgctxt "@action:button" msgid "Add Printer" msgstr "新增印表機" @@ -3370,16 +3466,10 @@ msgctxt "@label" msgid "Profile:" msgstr "列印參數:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "無可用的列印參數" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:102 msgctxt "@tooltip" msgid "" -"Some setting/override values are different from the values stored in the " -"profile.\n" +"Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." msgstr "" @@ -3387,41 +3477,40 @@ msgstr "" "\n" "點擊開啟列印參數管理器。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" msgid "Search..." msgstr "搜尋..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:482 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "將設定值複製到所有擠出機" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:497 msgctxt "@action:menu" msgid "Hide this setting" msgstr "隱藏此設定" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:507 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "不再顯示此設定" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "保持此設定可見" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:530 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "設定設定可見性..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:250 msgctxt "@label" msgid "" -"Some hidden settings use values different from their normal calculated " -"value.\n" +"Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." msgstr "" @@ -3429,29 +3518,27 @@ msgstr "" "\n" "點擊以顯這些設定。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." msgid "Affects" msgstr "影響" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66 msgctxt "@label Header for list of settings." msgid "Affected By" msgstr "影響因素" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" -msgid "" -"This setting is always shared between all extruders. Changing it here will " -"change the value for all extruders" -msgstr "這個設定由全部的擠出機共享,變更這個設定將改變全部擠出機的設定值" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" msgid "The value is resolved from per-extruder values " msgstr "這個數值是由每個擠出機的設定值解析出來的" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190 msgctxt "@label" msgid "" "This setting has a value that is different from the profile.\n" @@ -3462,11 +3549,10 @@ msgstr "" "\n" "單擊以復原列印參數的值。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" msgid "" -"This setting is normally calculated, but it currently has an absolute value " -"set.\n" +"This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." msgstr "" @@ -3474,12 +3560,12 @@ msgstr "" "\n" "點擊以恢復計算得出的數值。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "Print Setup" msgstr "列印設定" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" @@ -3488,67 +3574,59 @@ msgstr "" "列印設定已關閉\n" "G-code 檔案無法被修改" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00 小時 00 分" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "時間資訊
    " +msgid "Time specification" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" msgid "Cost specification" msgstr "成本明細" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:455 msgctxt "@label m for meter" msgid "%1m" msgstr "%1m" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:447 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:456 msgctxt "@label g for grams" msgid "%1g" msgstr "%1g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:454 msgctxt "@label" msgid "Total:" msgstr "總共:" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 -msgctxt "" -"@label Print estimates: m for meters, g for grams, %4 is currency and %3 is " -"print cost" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:504 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:509 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 -msgctxt "@tooltip" -msgid "" -"Recommended Print Setup

    Print with the recommended settings " -"for the selected printer, material and quality." -msgstr "" -"推薦的列印設定

    使用針對所選印表機、耗材和品質的推薦設定進行" -"列印。" - #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" -msgid "" -"Custom Print Setup

    Print with finegrained control over every " -"last bit of the slicing process." +msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." +msgstr "推薦的列印設定

    使用針對所選印表機、耗材和品質的推薦設定進行列印。" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 +msgctxt "@tooltip" +msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "自訂列印設定
    對切片過程中的每一個細節進行精細控制。" -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "自動:%1" @@ -3558,6 +3636,16 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "檢視(&V)" +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 +msgctxt "@action:inmenu menubar:view" +msgid "&Camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 +msgctxt "@action:inmenu menubar:view" +msgid "&Build plate" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" @@ -3569,13 +3657,13 @@ msgid "Print Selected Model With:" msgid_plural "Print Selected Models With:" msgstr[0] "列印所選模型:" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:114 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "複製所選模型" -#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:139 msgctxt "@label" msgid "Number of Copies" msgstr "複製個數" @@ -3591,19 +3679,15 @@ msgid "No printer connected" msgstr "沒有連接印表機" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:139 msgctxt "@label" msgid "Extruder" msgstr "擠出機" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:120 msgctxt "@tooltip" -msgid "" -"The target temperature of the hotend. The hotend will heat up or cool down " -"towards this temperature. If this is 0, the hotend heating is turned off." -msgstr "" -"加熱端的目標溫度。加熱端將加熱或冷卻至此溫度。若設定為 0,則關閉加熱端的加" -"熱。" +msgid "The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the hotend heating is turned off." +msgstr "加熱端的目標溫度。加熱端將加熱或冷卻至此溫度。若設定為 0,則關閉加熱端的加熱。" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:152 msgctxt "@tooltip" @@ -3632,9 +3716,7 @@ msgstr "列印平台" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 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." +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 "熱床的目標溫度。熱床將加熱或冷卻至此溫度。若設定為 0,則不使用熱床。" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 @@ -3659,13 +3741,8 @@ msgstr "預熱" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 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 "" -"列印前請預熱熱床。你可以在熱床加熱時繼續調整相關物件,讓你在準備列印時不必等" -"待熱床加熱完畢。" +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 "列印前請預熱熱床。你可以在熱床加熱時繼續調整相關物件,讓你在準備列印時不必等待熱床加熱完畢。" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" @@ -3712,264 +3789,299 @@ msgctxt "@label" msgid "Estimated time left" msgstr "預計剩餘時間" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "切換全螢幕(&F)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:86 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "復原(&U)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "取消復原(&R)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:106 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "退出(&Q)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "重置視角位置" - #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu menubar:view" +msgid "&3D View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:view" +msgid "&Front View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 +msgctxt "@action:inmenu menubar:view" +msgid "&Top View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 +msgctxt "@action:inmenu menubar:view" +msgid "&Left Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:view" +msgid "&Right Side View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "設定 Cura…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "新增印表機(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "管理印表機(&I)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:169 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "管理耗材…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:177 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "使用目前設定 / 覆寫更新列印參數(&U)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:185 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "捨棄目前更改(&D)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:197 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "從目前設定 / 覆寫值創建列印參數(&C)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "管理列印參數.." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "顯示線上說明文件(&D)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "BUG 回報(&B)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "關於(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:233 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "刪除所選模型(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "置中所選模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:252 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "複製所選模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:261 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "刪除模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "將模型置中(&N)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "群組模型(&G)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:295 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "取消模型群組" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:305 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "結合模型(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:315 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "複製模型…(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:322 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "選擇所有模型(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:332 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "清空列印平台(&C)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:342 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "重新載入所有模型(&L)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models To All Build Plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "編位所有的模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "為所選模型編位" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:373 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "重置所有模型位置" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:380 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "重置所有模型旋轉(&T)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "開啟檔案(&O)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "新建專案(&N)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:402 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "顯示切片引擎日誌(&L)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "顯示設定資料夾" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "參數顯示設定..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424 msgctxt "@action:menu" msgid "Browse plugins..." msgstr "瀏覽外掛..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:431 msgctxt "@action:menu" msgid "Installed plugins..." msgstr "安裝外掛..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:view" +msgid "Expand/Collapse Sidebar" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "請載入一個 3D 模型" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "切片已準備就緒" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "正在切片..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "%1 已準備就緒" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "無法切片" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:44 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "切片無法使用" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Slice current printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 +msgctxt "@info:tooltip" +msgid "Cancel slicing process" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Prepare" msgstr "準備" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" msgid "Cancel" msgstr "取消" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:317 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "選擇作用中的輸出裝置" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:696 msgctxt "@title:window" msgid "Open file(s)" msgstr "開啟檔案" #: /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 "" -"我們已經在你所選擇的檔案中找到一個或多個專案檔案,但一次只能開啟一個專案檔" -"案。我們建議只從那些檔案中匯入模型而不開啟專案。你要繼續操作嗎?" +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 "我們已經在你所選擇的檔案中找到一個或多個專案檔案,但一次只能開啟一個專案檔案。我們建議只從那些檔案中匯入模型而不開啟專案。你要繼續操作嗎?" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 msgctxt "@action:button" @@ -3981,124 +4093,117 @@ msgctxt "@title:window" msgid "Ultimaker Cura" msgstr "Ultimaker Cura" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "檔案(&F)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:119 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "儲存到檔案(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:128 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "另存為(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" -msgid "Save project" -msgstr "儲存專案" +msgid "Save &Project..." +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "編輯(&E)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 msgctxt "@title:menu" msgid "&View" msgstr "檢視(&V)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" msgstr "設定(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "印表機(&P)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:208 msgctxt "@title:menu" msgid "&Material" msgstr "耗材(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:197 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:209 msgctxt "@title:menu" msgid "&Profile" msgstr "列印參數(&P)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:201 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "設為主要擠出機" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:219 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "擴充功能(&X)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:253 msgctxt "@title:menu menubar:toplevel" msgid "P&lugins" msgstr "外掛(&l)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:261 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "偏好設定(&R)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:269 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "幫助(&H)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:351 msgctxt "@action:button" msgid "Open File" msgstr "開啟檔案" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:512 msgctxt "@title:tab" msgid "Settings" msgstr "設定" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:554 msgctxt "@title:window" msgid "New project" msgstr "新建專案" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:555 msgctxt "@info:question" -msgid "" -"Are you sure you want to start a new project? This will clear the build " -"plate and any unsaved settings." +msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "你確定要開始一個新專案嗎?這將清除列印平台及任何未儲存的設定。" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:797 msgctxt "@window:title" msgid "Install Plugin" msgstr "安裝外掛" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:804 msgctxt "@title:window" msgid "Open File(s)" msgstr "開啟檔案" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:807 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 "" -"我們已經在你選擇的檔案中找到一個或多個 G-Code 檔案。你一次只能開啟一個 G-" -"Code 檔案。若需開啟 G-Code 檔案,請僅選擇一個。" +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 "我們已經在你選擇的檔案中找到一個或多個 G-Code 檔案。你一次只能開啟一個 G-Code 檔案。若需開啟 G-Code 檔案,請僅選擇一個。" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 msgctxt "@title:window" @@ -4120,119 +4225,84 @@ msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "儲存時不再顯示專案摘要" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 -msgctxt "@action:button" -msgid "Save" -msgstr "儲存" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 -msgctxt "@title:tab" -msgid "Prepare" -msgstr "準備" - -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 -msgctxt "@title:tab" -msgid "Monitor" -msgstr "監控" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:175 msgctxt "@label" msgid "Layer Height" msgstr "層高" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:345 msgctxt "@tooltip" -msgid "" -"A custom profile is currently active. To enable the quality slider, choose a " -"default quality profile in Custom tab" -msgstr "" -"目前正使用自訂列印參數。若要使用品質滑動條,在自訂分頁中選擇預設的列印參數" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "目前正使用自訂列印參數。若要使用品質滑動條,在自訂分頁中選擇預設的列印參數" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:362 msgctxt "@label" msgid "Print Speed" msgstr "列印速度" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:374 msgctxt "@label" msgid "Slower" msgstr "更慢" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:385 msgctxt "@label" msgid "Faster" msgstr "更快" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:423 msgctxt "@tooltip" -msgid "" -"You have modified some profile settings. If you want to change these go to " -"custom mode." +msgid "You have modified some profile settings. If you want to change these go to custom mode." msgstr "你修改過部份列印參數設定。如果你想改變這些設定,請切換到自訂模式。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:446 msgctxt "@label" msgid "Infill" msgstr "填充" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" -msgid "" -"Gradual infill will gradually increase the amount of infill towards the top." +msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "漸層填充(Gradual infill)將隨著列印高度的提升而逐漸加大填充密度。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:680 msgctxt "@label" msgid "Enable gradual" msgstr "啟用漸層" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:747 msgctxt "@label" msgid "Generate Support" msgstr "產生支撐" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:781 msgctxt "@label" -msgid "" -"Generate structures to support parts of the model which have overhangs. " -"Without these structures, such parts would collapse during printing." -msgstr "" -"在模型的懸垂(Overhangs)部分產生支撐結構。若不這樣做,這些部分在列印時將倒" -"塌。" +msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." +msgstr "在模型的懸垂(Overhangs)部分產生支撐結構。若不這樣做,這些部分在列印時將倒塌。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:799 msgctxt "@label" msgid "Support Extruder" msgstr "支撐用擠出機" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:851 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 "" -"選擇用於支撐的擠出機。該擠出機將在模型之下建立支撐結構,以防止模型下垂或在空" -"中列印。" +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 "選擇用於支撐的擠出機。該擠出機將在模型之下建立支撐結構,以防止模型下垂或在空中列印。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:874 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "列印平台附著" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:929 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 "" -"允許列印邊緣或木筏。這將在你的物件周圍或下方添加一個容易切斷的平面區域。" +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 "允許列印邊緣或木筏。這將在你的物件周圍或下方添加一個容易切斷的平面區域。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" -msgid "" -"Need help improving your prints?
    Read the Ultimaker " -"Troubleshooting Guides" +msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "需要幫助改善你的列印?閱讀 Ultimaker 故障排除指南" #: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 @@ -4246,19 +4316,22 @@ msgctxt "@title:window" msgid "Open project file" msgstr "開啟專案檔案" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:93 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?" +msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "這是一個 Cura 專案檔案。你想將其作為一個專案開啟還是從中匯入模型?" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "記住我的選擇" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Open as project" msgstr "作為專案開啟" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:131 msgctxt "@action:button" msgid "Import models" msgstr "匯入模型" @@ -4268,26 +4341,39 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "引擎日誌" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:245 msgctxt "@label" msgid "Material" msgstr "耗材" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" -msgid "Check compatibility" -msgstr "檢查耗材相容性" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "點擊查看 Ultimaker.com 上的耗材相容性。" +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 +msgctxt "@option:check" +msgid "See only current build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 +msgctxt "@action:button" +msgid "Arrange to all build plates" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 +msgctxt "@action:button" +msgid "Arrange current build plate" +msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" -msgid "" -"Provides a way to change machine settings (such as build volume, nozzle " -"size, etc)" +msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" msgstr "提供更改印表機設定(如成形空間體積、噴頭口徑等)的方法" #: MachineSettingsAction/plugin.json @@ -4367,8 +4453,7 @@ msgstr "列印參數合併器" #: USBPrinting/plugin.json msgctxt "description" -msgid "" -"Accepts G-Code and sends them to a printer. Plugin can also update firmware." +msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware." msgstr "接受 G-Code 並且傳送到印表機。此外掛也可以更新韌體。" #: USBPrinting/plugin.json @@ -4376,6 +4461,26 @@ msgctxt "name" msgid "USB printing" msgstr "USB 連線列印" +#: PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "description" +msgid "Provides an edit window for direct script editing." +msgstr "" + +#: CuraLiveScriptingPlugin/plugin.json +msgctxt "name" +msgid "Live scripting tool" +msgstr "" + #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." @@ -4396,6 +4501,16 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3 網路連接" +#: MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4408,11 +4523,8 @@ msgstr "韌體更新檢查" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "" -"Gives you the possibility to open certain files via SolidWorks itself. These " -"are then converted and loaded into Cura" +msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." msgstr "" -"讓你可以透過 SolidWorks 自身開啟特定檔案。隨後會將這些檔案進行轉換並載入 Cura" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4479,6 +4591,16 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "舊版 Cura 列印參數讀取器" +#: CuraBlenderPlugin/plugin.json +msgctxt "description" +msgid "Helps to open Blender files directly in Cura." +msgstr "" + +#: CuraBlenderPlugin/plugin.json +msgctxt "name" +msgid "Blender Integration (experimental)" +msgstr "" + #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." @@ -4639,6 +4761,16 @@ msgctxt "name" msgid "Cura Profile Writer" msgstr "Cura 列印參數寫入器" +#: CuraPrintProfileCreator/plugin.json +msgctxt "description" +msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." +msgstr "" + +#: CuraPrintProfileCreator/plugin.json +msgctxt "name" +msgid "Print Profile Assistant" +msgstr "" + #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." @@ -4661,9 +4793,7 @@ msgstr "使用者授權" #: UltimakerMachineActions/plugin.json msgctxt "description" -msgid "" -"Provides machine actions for Ultimaker machines (such as bed leveling " -"wizard, selecting upgrades, etc)" +msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" msgstr "提供 Ultimaker 印表機專屬功能(如平台調平精靈、選擇升級等)" #: UltimakerMachineActions/plugin.json @@ -4681,6 +4811,156 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura 列印參數讀取器" +#~ msgctxt "@label" +#~ msgid "Unknown" +#~ msgstr "未知" + +#~ msgctxt "@info:status" +#~ msgid "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!" +#~ msgstr "開啟 SolidWorks 檔案時發生錯誤! 請檢查能否在 SolidWorks 中正常開啟檔案而不出現任何問題!" + +#~ msgctxt "@info:status" +#~ msgid "Error while starting %s!" +#~ msgstr "啟動 %s 時發生錯誤!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Simulation view" +#~ msgstr "模擬檢視" + +#~ msgctxt "@info" +#~ msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +#~ msgstr "Cura 收集匿名切片統計資料。你可以在偏好設定中關閉此選項。" + +#~ msgctxt "@action:button" +#~ msgid "Dismiss" +#~ msgstr "關閉此通知" + +#~ msgctxt "@menuitem" +#~ msgid "Global" +#~ msgstr "整體" + +#~ msgctxt "@label crash message" +#~ msgid "" +#~ "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +#~ "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +#~ " " +#~ msgstr "" +#~ "

    程式發生了致命異常。請將錯誤報告傳送給我們以解決這個問題

    \n" +#~ "

    請使用「送出報告」按鈕將錯誤報告自動發送到我們的伺服器

    \n" +#~ " " + +#~ msgctxt "@label Cura version" +#~ msgid "Cura version: {version}
    " +#~ msgstr "Cura 版本: {version}
    " + +#~ msgctxt "@label Platform" +#~ msgid "Platform: {platform}
    " +#~ msgstr "平台: {platform}
    " + +#~ msgctxt "@label Qt version" +#~ msgid "Qt version: {qt}
    " +#~ msgstr "Qt 版本: {qt}
    " + +#~ msgctxt "@label PyQt version" +#~ msgid "PyQt version: {pyqt}
    " +#~ msgstr "PyQt 版本: {pyqt}
    " + +#~ msgctxt "@label OpenGL" +#~ msgid "OpenGL: {opengl}
    " +#~ msgstr "OpenGL: {opengl}
    " + +#~ msgctxt "@title:groupbox" +#~ msgid "Exception traceback" +#~ msgstr "異常追溯" + +#~ msgctxt "@label" +#~ msgid "Material diameter" +#~ msgstr "耗材直徑" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3" +#~ msgstr "Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "Ultimaker 3 Extended" +#~ msgstr "Ultimaker 3 Extended" + +#~ msgctxt "@title:window" +#~ msgid "Cura SolidWorks Plugin Configuration" +#~ msgstr "Cura SolidWorks 外掛設定" + +#~ msgctxt "@action:label" +#~ msgid "Default quality of the exported STL:" +#~ msgstr "預設的匯出 STL 品質:" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always ask" +#~ msgstr "總是詢問" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Fine quality" +#~ msgstr "總是使用精細品質" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Always use Coarse quality" +#~ msgstr "總是使用粗糙品質" + +#~ msgctxt "@title:window" +#~ msgid "Import SolidWorks File as STL..." +#~ msgstr "匯入 SolidWorks 檔案為 STL..." + +#~ msgctxt "@info:tooltip" +#~ msgid "Quality of the Exported STL" +#~ msgstr "匯出 STL 的品質" + +#~ msgctxt "@action:label" +#~ msgid "Quality" +#~ msgstr "品質" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Coarse" +#~ msgstr "粗糙" + +#~ msgctxt "@option:curaSolidworksStlQuality" +#~ msgid "Fine" +#~ msgstr "精細" + +#~ msgctxt "@" +#~ msgid "No Profile Available" +#~ msgstr "無可用的列印參數" + +#~ msgctxt "@label" +#~ msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +#~ msgstr "這個設定由全部的擠出機共享,變更這個設定將改變全部擠出機的設定值" + +#~ msgctxt "@tooltip" +#~ msgid "Time specification
    " +#~ msgstr "時間資訊
    " + +#~ msgctxt "@action:inmenu menubar:view" +#~ msgid "&Reset camera position" +#~ msgstr "重置視角位置" + +#~ msgctxt "@title:menu menubar:file" +#~ msgid "Save project" +#~ msgstr "儲存專案" + +#~ msgctxt "@title:tab" +#~ msgid "Prepare" +#~ msgstr "準備" + +#~ msgctxt "@title:tab" +#~ msgid "Monitor" +#~ msgstr "監控" + +#~ msgctxt "@label" +#~ msgid "Check compatibility" +#~ msgstr "檢查耗材相容性" + +#~ msgctxt "description" +#~ msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +#~ msgstr "讓你可以透過 SolidWorks 自身開啟特定檔案。隨後會將這些檔案進行轉換並載入 Cura" + #~ msgctxt "@label:status" #~ msgid "Blocked" #~ msgstr "暫停" @@ -4693,20 +4973,13 @@ msgstr "Cura 列印參數讀取器" #~ msgid "Print Details" #~ msgstr "列印細項設定" -#~ msgctxt "" -#~ "@info Don't translate {machine_name}, since it gets replaced by a printer " -#~ "name!" -#~ msgid "" -#~ "To ensure that your {machine_name} is equipped with the latest features " -#~ "it is recommended to update the firmware regularly. This can be done on " -#~ "the {machine_name} (when connected to the network) or via USB." -#~ msgstr "" -#~ "為了確保您的 {machine_name} 配備了最新功能,建議定期更新韌體。 這可以在 " -#~ "{machine_name} 上完成(有連接到網絡時)或透過 USB 完成。" +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "為了確保您的 {machine_name} 配備了最新功能,建議定期更新韌體。 這可以在 {machine_name} 上完成(有連接到網絡時)或透過 USB 完成。" -msgctxt "@info:title" -msgid "Layer View" -msgstr "分層檢視" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "分層檢視" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4719,14 +4992,11 @@ msgstr "分層檢視" #~ msgctxt "@label" #~ msgid "" #~ "

    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" +#~ "

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

    \n" #~ " " #~ msgstr "" #~ "

    發生了致命錯誤,我們無法繼續!

    \n" -#~ "

    請利用下方資訊回報錯誤到 http://github.com/Ultimaker/Cura/issues

    \n" +#~ "

    請利用下方資訊回報錯誤到 http://github.com/Ultimaker/Cura/issues

    \n" #~ " " #~ msgctxt "@action:button" @@ -4738,14 +5008,11 @@ msgstr "分層檢視" #~ msgstr "確定" #~ msgctxt "@label" -#~ msgid "" -#~ "This printer is not set up to host a group of connected Ultimaker 3 " -#~ "printers" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" #~ msgstr "這台印表機未設定成管理一組連線的 Ultimaker 3 印表機的主機" #~ msgctxt "@label" -#~ msgid "" -#~ "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" #~ msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機" #~ msgctxt "@label:status" @@ -4776,9 +5043,9 @@ msgstr "分層檢視" #~ msgid "Provides the Layer view." #~ msgstr "提供分層檢視。" -msgctxt "name" -msgid "Layer View" -msgstr "分層檢視" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "分層檢視" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4805,11 +5072,8 @@ msgstr "分層檢視" #~ msgstr "X3G 檔案" #~ msgctxt "@info:status" -#~ msgid "" -#~ "Please keep in mind, that you have to reopen your SolidWorks file " -#~ "manually! Reloading the model won't work!" -#~ msgstr "" -#~ "請注意,重新載入模型功能無法運作!你必須手動重新開啟 SolidWorks 檔案!" +#~ msgid "Please keep in mind, that you have to reopen your SolidWorks file manually! Reloading the model won't work!" +#~ msgstr "請注意,重新載入模型功能無法運作!你必須手動重新開啟 SolidWorks 檔案!" #~ msgctxt "@item:inlistbox" #~ msgid "Layers" @@ -4894,8 +5158,3 @@ msgstr "分層檢視" #~ msgctxt "name" #~ msgid "X3G Writer" #~ msgstr "X3G 寫入器" - -#Added manually to fix a string that was changed after string freeze. -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "分層檢視" \ No newline at end of file diff --git a/resources/i18n/zh_TW/fdmextruder.def.json.po b/resources/i18n/zh_TW/fdmextruder.def.json.po index 1b5f351cf9..70fd79a8ee 100644 --- a/resources/i18n/zh_TW/fdmextruder.def.json.po +++ b/resources/i18n/zh_TW/fdmextruder.def.json.po @@ -54,9 +54,7 @@ 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." +msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size." msgstr "噴頭內徑,在使用非標準噴頭尺寸時需更改此設定。" #: fdmextruder.def.json @@ -96,9 +94,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." +msgid "Make the extruder starting position absolute rather than relative to the last-known location of the head." msgstr "讓擠出機以絕對位置做為起點,而不是與前一次位置的相對位置。" #: fdmextruder.def.json @@ -138,9 +134,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." +msgid "Make the extruder ending position absolute rather than relative to the last-known location of the head." msgstr "讓擠出機以絕對位置為終點,而不是與前一次位置的相對位置。" #: fdmextruder.def.json @@ -170,9 +164,7 @@ 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." +msgid "The Z coordinate of the position where the nozzle primes at the start of printing." msgstr "列印開始時,噴頭在 Z 軸座標上的起始位置." #: fdmextruder.def.json @@ -192,9 +184,7 @@ 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." +msgid "The X coordinate of the position where the nozzle primes at the start of printing." msgstr "列印開始時,噴頭在 X 軸上初始位置。" #: fdmextruder.def.json @@ -204,7 +194,5 @@ 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." +msgid "The Y coordinate of the position where the nozzle primes at the start of printing." msgstr "列印開始時,噴頭在 Y 軸座標上初始位置。" diff --git a/resources/i18n/zh_TW/fdmprinter.def.json.po b/resources/i18n/zh_TW/fdmprinter.def.json.po index 2be6fbeefe..7c9d882750 100644 --- a/resources/i18n/zh_TW/fdmprinter.def.json.po +++ b/resources/i18n/zh_TW/fdmprinter.def.json.po @@ -44,9 +44,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." +msgid "Whether to show the different variants of this machine, which are described in separate json files." msgstr "是否顯示這台印表機在不同的 JSON 檔案中所描述的型號。" #: fdmprinter.def.json @@ -94,9 +92,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." +msgid "Whether to insert a command to wait until the build plate temperature is reached at the start." msgstr "是否插入一條命令,在開始時等待列印平台達到設定溫度。" #: fdmprinter.def.json @@ -116,13 +112,8 @@ 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 "" -"是否在 G-code 開始部分插入噴頭溫度命令。當起始 G-code 已包含噴頭溫度命令時," -"Cura 前端將自動關閉此設定。" +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 "是否在 G-code 開始部分插入噴頭溫度命令。當起始 G-code 已包含噴頭溫度命令時,Cura 前端將自動關閉此設定。" #: fdmprinter.def.json msgctxt "material_bed_temp_prepend label" @@ -131,13 +122,8 @@ 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 "" -"是否需要在 G-code 開始部分插入熱床溫度的命令。當起始 G-code 包含熱床溫度命令" -"時,Cura 前端將自動關閉此設定。" +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 "是否需要在 G-code 開始部分插入熱床溫度的命令。當起始 G-code 包含熱床溫度命令時,Cura 前端將自動關閉此設定。" #: fdmprinter.def.json msgctxt "machine_width label" @@ -166,8 +152,7 @@ msgstr "列印平台形狀" #: fdmprinter.def.json msgctxt "machine_shape description" -msgid "" -"The shape of the build plate without taking unprintable areas into account." +msgid "The shape of the build plate without taking unprintable areas into account." msgstr "列印平台形狀(不計算不可列印區域)。" #: fdmprinter.def.json @@ -207,9 +192,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." +msgid "Whether the X/Y coordinates of the zero position of the printer is at the center of the printable area." msgstr "印表機的 X/Y 座標原點是否位於可列印區域的中心。" #: fdmprinter.def.json @@ -219,9 +202,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." +msgid "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle." msgstr "擠出機組數目。擠出機組是指進料裝置、喉管和噴頭的組合。" #: fdmprinter.def.json @@ -241,9 +222,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." +msgid "The height difference between the tip of the nozzle and the lowest part of the print head." msgstr "噴頭尖端與列印頭最低部分之間的高度差。" #: fdmprinter.def.json @@ -253,9 +232,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." +msgid "The angle between the horizontal plane and the conical part right above the tip of the nozzle." msgstr "水平面與噴頭尖端上部圓錐形之間的角度。" #: fdmprinter.def.json @@ -265,9 +242,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." +msgid "The distance from the tip of the nozzle in which heat from the nozzle is transferred to the filament." msgstr "與噴頭尖端的距離,噴頭產生的熱量在這段距離內傳遞到耗材中。" #: fdmprinter.def.json @@ -277,9 +252,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." +msgid "The distance from the tip of the nozzle where to park the filament when an extruder is no longer used." msgstr "與噴頭尖端的距離,當不再使用擠出機時會將耗材停放在此區域。" #: fdmprinter.def.json @@ -289,9 +262,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." +msgid "Whether to control temperature from Cura. Turn this off to control nozzle temperature from outside of Cura." msgstr "是否從 Cura 控制溫度。若要從 Cura 外部控制噴頭溫度,關閉此選項。" #: fdmprinter.def.json @@ -301,9 +272,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." +msgid "The speed (°C/s) by which the nozzle heats up averaged over the window of normal printing temperatures and the standby temperature." msgstr "噴頭從待機溫度加熱到列印溫度的平均速度(℃/ s)。" #: fdmprinter.def.json @@ -313,9 +282,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." +msgid "The speed (°C/s) by which the nozzle cools down averaged over the window of normal printing temperatures and the standby temperature." msgstr "噴頭從列印溫度冷卻到待機溫度的平均速度(℃/ s)。" #: fdmprinter.def.json @@ -325,13 +292,8 @@ 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 "" -"擠出機必須保持不活動以便噴頭冷卻的最短時間。擠出機必須停用超過此時間,才可以" -"冷卻到待機溫度。" +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 "擠出機必須保持不活動以便噴頭冷卻的最短時間。擠出機必須停用超過此時間,才可以冷卻到待機溫度。" #: fdmprinter.def.json msgctxt "machine_gcode_flavor label" @@ -388,6 +350,16 @@ msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "Repetier" +#: fdmprinter.def.json +msgctxt "machine_firmware_retract label" +msgid "Firmware Retraction" +msgstr "" + +#: fdmprinter.def.json +msgctxt "machine_firmware_retract description" +msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." +msgstr "" + #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -435,9 +407,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)." +msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes)." msgstr "噴頭尖端與吊車之間的高度差。" #: fdmprinter.def.json @@ -457,9 +427,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." +msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size." msgstr "噴頭內徑,在使用非標準噴頭尺寸時需更改此設定。" #: fdmprinter.def.json @@ -479,9 +447,7 @@ msgstr "擠出機初始 Z 軸位置" #: 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." +msgid "The Z coordinate of the position where the nozzle primes at the start of printing." msgstr "列印開始時,噴頭在 Z 軸座標上的起始位置." #: fdmprinter.def.json @@ -491,9 +457,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." +msgid "Make the extruder prime position absolute rather than relative to the last-known location of the head." msgstr "擠出機的控制參數使用絕對位置,而不是與前次位置的相對位移。" #: fdmprinter.def.json @@ -633,9 +597,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)" +msgid "All settings that influence the resolution of the print. These settings have a large impact on the quality (and print time)" msgstr "影響列印解析度的所有設定。這些設定會對品質(和列印時間)產生顯著影響" #: fdmprinter.def.json @@ -645,12 +607,8 @@ 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 "" -"每層的高度(以毫米為單位)。值越高,則列印速度越快,解析度越低;值越低,則列" -"印速度越慢,解析度越高。" +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 "每層的高度(以毫米為單位)。值越高,則列印速度越快,解析度越低;值越低,則列印速度越慢,解析度越高。" #: fdmprinter.def.json msgctxt "layer_height_0 label" @@ -659,47 +617,9 @@ 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." +msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "起始層高(以毫米為單位)。起始層越厚,與列印平台的附著越輕鬆。" -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "切片公差" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "" -"How to slice layers with diagonal surfaces. The areas of a layer can be " -"generated based on where the middle of the layer intersects the surface " -"(Middle). Alternatively each layer can have the areas which fall inside of " -"the volume throughout the height of the layer (Exclusive) or a layer has the " -"areas which fall inside anywhere within the layer (Inclusive). Exclusive " -"retains the most details, Inclusive makes for the best fit and Middle takes " -"the least time to process." -msgstr "" -"如何使用傾斜的外表切片。可以使用層高的中間與外表相交產生的截面(中間)。也可" -"以使用該層高完全不超出模型體積的區域(排除),或是該層高的模型投影區域(包" -"含)。「排除」保留最多的細節,「包含」有最符合的外形,而「中間」花最少的運算" -"時間。" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "中間" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "排除" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "包含" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -707,13 +627,8 @@ 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 "" -"單一線寬。一般而言,每條線條的寬度應與噴頭的寬度對應。但是,稍微降低此值可以" -"產生更好的列印成果。" +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 "單一線寬。一般而言,每條線條的寬度應與噴頭的寬度對應。但是,稍微降低此值可以產生更好的列印成果。" #: fdmprinter.def.json msgctxt "wall_line_width label" @@ -732,9 +647,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." +msgid "Width of the outermost wall line. By lowering this value, higher levels of detail can be printed." msgstr "最外側牆壁的線寬。降低此值,可列印出更高水準的細節。" #: fdmprinter.def.json @@ -744,20 +657,9 @@ 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." +msgid "Width of a single wall line for all wall lines except the outermost one." msgstr "除了外壁以外牆壁的線寬。" -#: fdmprinter.def.json -msgctxt "roofing_line_width label" -msgid "Top Surface Skin Line Width" -msgstr "頂部表層線寬" - -#: fdmprinter.def.json -msgctxt "roofing_line_width description" -msgid "Width of a single line of the areas at the top of the print." -msgstr "列印頂部區域單一線寬。" - #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" @@ -845,9 +747,7 @@ msgstr "起始層線寬" #: fdmprinter.def.json msgctxt "initial_layer_line_width_factor description" -msgid "" -"Multiplier of the line width on the first layer. Increasing this could " -"improve bed adhesion." +msgid "Multiplier of the line width on the first layer. Increasing this could improve bed adhesion." msgstr "第一層線寬倍數。增大此倍數可改善熱床附著。" #: fdmprinter.def.json @@ -867,9 +767,7 @@ msgstr "牆壁擠出機" #: fdmprinter.def.json msgctxt "wall_extruder_nr description" -msgid "" -"The extruder train used for printing the walls. This is used in multi-" -"extrusion." +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." msgstr "用於列印牆壁的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -879,9 +777,7 @@ msgstr "外壁擠出機" #: fdmprinter.def.json msgctxt "wall_0_extruder_nr description" -msgid "" -"The extruder train used for printing the outer wall. This is used in multi-" -"extrusion." +msgid "The extruder train used for printing the outer wall. This is used in multi-extrusion." msgstr "用於列印外壁的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -891,9 +787,7 @@ msgstr "內壁擠出機" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" -msgid "" -"The extruder train used for printing the inner walls. This is used in multi-" -"extrusion." +msgid "The extruder train used for printing the inner walls. This is used in multi-extrusion." msgstr "用於列印內壁的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -903,9 +797,7 @@ msgstr "壁厚" #: fdmprinter.def.json msgctxt "wall_thickness description" -msgid "" -"The thickness of the walls in the horizontal direction. This value divided " -"by the wall line width defines the number of walls." +msgid "The thickness of the walls in the horizontal direction. This value divided by the wall line width defines the number of walls." msgstr "水平方向的牆壁厚度。此值除以壁線寬度決定牆壁數量。" #: fdmprinter.def.json @@ -915,9 +807,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." +msgid "The number of walls. When calculated by the wall thickness, this value is rounded to a whole number." msgstr "牆壁的線條圈數,如果由壁厚計算,會四捨五入為一個整數值。" #: fdmprinter.def.json @@ -927,9 +817,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." +msgid "Distance of a travel move inserted after the outer wall, to hide the Z seam better." msgstr "在列印外壁後插入的空跑距離,以便消除隱藏 Z 縫的銜接痕跡。" #: fdmprinter.def.json @@ -939,9 +827,7 @@ msgstr "頂部表層擠出機" #: fdmprinter.def.json msgctxt "roofing_extruder_nr description" -msgid "" -"The extruder train used for printing the top most skin. This is used in " -"multi-extrusion." +msgid "The extruder train used for printing the top most skin. This is used in multi-extrusion." msgstr "用於列印最頂部表層的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -951,55 +837,9 @@ msgstr "頂部表層" #: fdmprinter.def.json msgctxt "roofing_layer_count description" -msgid "" -"The number of top most skin layers. Usually only one top most layer is " -"sufficient to generate higher quality top surfaces." +msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." msgstr "最頂部表層層數。通常只需一層最頂部就足以產生較高品質的頂部表面。" -#: fdmprinter.def.json -msgctxt "roofing_pattern label" -msgid "Top Surface Skin Pattern" -msgstr "頂部表層列印樣式" - -#: fdmprinter.def.json -msgctxt "roofing_pattern description" -msgid "The pattern of the top most layers." -msgstr "最頂部列印樣式。" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option lines" -msgid "Lines" -msgstr "線條" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option concentric" -msgid "Concentric" -msgstr "同心" - -#: fdmprinter.def.json -msgctxt "roofing_pattern option zigzag" -msgid "Zig Zag" -msgstr "鋸齒狀" - -#: fdmprinter.def.json -msgctxt "roofing_angles label" -msgid "Top Surface Skin Line Directions" -msgstr "頂部表層線條方向" - -#: fdmprinter.def.json -msgctxt "roofing_angles description" -msgid "" -"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)." -msgstr "" -"當頂部表層採用線條或鋸齒狀的列印樣式時使用的整數線條方向的列表。列表中的元素" -"隨層的進度依次使用,當達到列表末尾時,它將從頭開始。列表項以逗號分隔,整個列" -"表包含在方括號中。預設使用傳統的預設角度(45 和 135 度)。" - #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" @@ -1007,9 +847,7 @@ msgstr "頂部/底部擠出機" #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr description" -msgid "" -"The extruder train used for printing the top and bottom skin. This is used " -"in multi-extrusion." +msgid "The extruder train used for printing the top and bottom skin. This is used in multi-extrusion." msgstr "用於列印頂部和底部表層的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -1019,9 +857,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." +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 "列印模型中頂部/底部的厚度。該值除以層高決定頂部/底部的層數。" #: fdmprinter.def.json @@ -1031,9 +867,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." +msgid "The thickness of the top layers in the print. This value divided by the layer height defines the number of top layers." msgstr "列印模型中頂部的厚度。該值除以層高決定頂部的層數。" #: fdmprinter.def.json @@ -1043,9 +877,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." +msgid "The number of top layers. When calculated by the top thickness, this value is rounded to a whole number." msgstr "頂部列印層數,當由頂部厚度來計算時層數時,會四捨五入為一個整數值。" #: fdmprinter.def.json @@ -1055,9 +887,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." +msgid "The thickness of the bottom layers in the print. This value divided by the layer height defines the number of bottom layers." msgstr "列印模型中底部的厚度。此值除以層高決定底部的層數。" #: fdmprinter.def.json @@ -1067,9 +897,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." +msgid "The number of bottom layers. When calculated by the bottom thickness, this value is rounded to a whole number." msgstr "底部列印層數,當由底部厚度來計算時層數時,會四捨五入為一個整數值。" #: fdmprinter.def.json @@ -1129,17 +957,8 @@ 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 "" -"當頂部/底部採用線條或鋸齒狀的列印樣式時使用的整數線條方向的列表。列表中的元素" -"隨層的進度依次使用,當達到列表末尾時,它將從頭開始。列表元素以逗號分隔,整個" -"列表包含在方括號中。空的列表代表使用傳統的預設角度(45 和 135 度)。" +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 "當頂部/底部採用線條或鋸齒狀的列印樣式時使用的整數線條方向的列表。列表中的元素隨層的進度依次使用,當達到列表末尾時,它將從頭開始。列表元素以逗號分隔,整個列表包含在方括號中。空的列表代表使用傳統的預設角度(45 和 135 度)。" #: fdmprinter.def.json msgctxt "wall_0_inset label" @@ -1148,14 +967,18 @@ 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 "" -"內嵌是套用在外壁路徑上的功能。如果外壁小於噴頭,並且在內壁之後列印,則此偏移" -"量將使噴頭孔內移與內壁重疊而不是行走在模型外部。" +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 "內嵌是套用在外壁路徑上的功能。如果外壁小於噴頭,並且在內壁之後列印,則此偏移量將使噴頭孔內移與內壁重疊而不是行走在模型外部。" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "最佳化牆壁列印順序" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "最佳化牆壁列印順序以減少回抽的次數和空跑的距離。啟用此功能對大多數是有益的,但有的可能會花更多的時間。所以請比較有無最佳化的估算時間進行確認。" #: fdmprinter.def.json msgctxt "outer_inset_first label" @@ -1164,14 +987,8 @@ 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 "" -"啟用時以從外向內的順序列印壁。當使用高黏度塑料如 ABS 時,這有助於提高 X 和 Y " -"的尺寸精度;但是,它可能會降低外表面列印品質,特别是在懸垂部分。" +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 "啟用時以從外向內的順序列印壁。當使用高黏度塑料如 ABS 時,這有助於提高 X 和 Y 的尺寸精度;但是,它可能會降低外表面列印品質,特别是在懸垂部分。" #: fdmprinter.def.json msgctxt "alternate_extra_perimeter label" @@ -1180,12 +997,8 @@ 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 "" -"每兩層建立一個額外牆壁,這些額外的牆壁能更緊密地抓填充部分,產生較強壯的模" -"型。" +msgid "Prints an extra wall at every other layer. This way infill gets caught between these extra walls, resulting in stronger prints." +msgstr "每兩層建立一個額外牆壁,這些額外的牆壁能更緊密地抓填充部分,產生較強壯的模型。" #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_enabled label" @@ -1194,9 +1007,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." +msgid "Compensate the flow for parts of a wall being printed where there is already a wall in place." msgstr "彌補牆壁重疊部分的流量。" #: fdmprinter.def.json @@ -1206,9 +1017,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." +msgid "Compensate the flow for parts of an outer wall being printed where there is already a wall in place." msgstr "列印外壁時如果該位置已經有牆壁存在,所進行的的流量補償。" #: fdmprinter.def.json @@ -1218,9 +1027,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." +msgid "Compensate the flow for parts of an inner wall being printed where there is already a wall in place." msgstr "列印內壁時如果該位置已經有牆壁存在,所進行的的流量補償。" #: fdmprinter.def.json @@ -1243,6 +1050,16 @@ msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" msgstr "全部填充" +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps label" +msgid "Filter Out Tiny Gaps" +msgstr "" + +#: fdmprinter.def.json +msgctxt "filter_out_tiny_gaps description" +msgid "Filter out tiny gaps to reduce blobs on outside of model." +msgstr "" + #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" @@ -1250,9 +1067,7 @@ msgstr "列印薄壁" #: fdmprinter.def.json msgctxt "fill_outline_gaps description" -msgid "" -"Print pieces of the model which are horizontally thinner than the nozzle " -"size." +msgid "Print pieces of the model which are horizontally thinner than the nozzle size." msgstr "列印在水平面上比噴頭尺寸更薄的模型部件。" #: fdmprinter.def.json @@ -1262,13 +1077,8 @@ 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 "" -"如果模型有挖孔,以便用來組合、鑲嵌時,這個偏移量可以用來微調孔的大小,當設為" -"正值時,模型外擴,孔會變小;若設為負值,模型內縮,孔會變大。" +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 "如果模型有挖孔,以便用來組合、鑲嵌時,這個偏移量可以用來微調孔的大小,當設為正值時,模型外擴,孔會變小;若設為負值,模型內縮,孔會變大。" #: fdmprinter.def.json msgctxt "xy_offset_layer_0 label" @@ -1277,13 +1087,8 @@ msgstr "起始層水平擴展" #: fdmprinter.def.json msgctxt "xy_offset_layer_0 description" -msgid "" -"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\"." -msgstr "" -"套用到第一層所有多邊形的偏移量。負數值可以補償第一層的壓扁量(被稱為“象" -"脚”)。" +msgid "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\"." +msgstr "套用到第一層所有多邊形的偏移量。負數值可以補償第一層的壓扁量(被稱為“象脚”)。" #: fdmprinter.def.json msgctxt "z_seam_type label" @@ -1292,16 +1097,8 @@ msgstr "Z 接縫對齊" #: 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 "" -"一層中每條路徑的起點。當連續多層的路徑從相同點開始時,則列印物上會顯示一條垂" -"直縫隙。如果將這些路徑靠近一個使用者指定的位置對齊,則縫隙最容易移除。如果隨" -"機放置,則路徑起點的不精準度將較不明顯。採用最短的路徑時,列印將更為快速。" +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 "一層中每條路徑的起點。當連續多層的路徑從相同點開始時,則列印物上會顯示一條垂直縫隙。如果將這些路徑靠近一個使用者指定的位置對齊,則縫隙最容易移除。如果隨機放置,則路徑起點的不精準度將較不明顯。採用最短的路徑時,列印將更為快速。" #: fdmprinter.def.json msgctxt "z_seam_type option back" @@ -1330,9 +1127,7 @@ msgstr "Z 接縫 X 座標" #: 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." +msgid "The X coordinate of the position near where to start printing each part in a layer." msgstr "位置的 X 軸座標,在該位置附近開始列印層中各個部分。" #: fdmprinter.def.json @@ -1342,9 +1137,7 @@ msgstr "Z 接縫 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." +msgid "The Y coordinate of the position near where to start printing each part in a layer." msgstr "位置的 Y 軸座標,在該位置附近開始列印層中各個部分。" #: fdmprinter.def.json @@ -1354,16 +1147,8 @@ msgstr "接縫偏好設定" #: fdmprinter.def.json msgctxt "z_seam_corner description" -msgid "" -"Control whether corners on the model outline influence the position of the " -"seam. None means that corners have no influence on the seam position. Hide " -"Seam makes the seam more likely to occur on an inside corner. Expose Seam " -"makes the seam more likely to occur on an outside corner. Hide or Expose " -"Seam makes the seam more likely to occur at an inside or outside corner." -msgstr "" -"控制接縫是否受模型輪廓上的角影響。'無'表示轉角不影響接縫位置。'隱藏接縫'表示" -"使用盡可能使用凹角做為接縫位置。'暴露接縫'表示盡可能使用凸角做為接縫位置。'隱" -"藏或暴露接縫'則同時使用凹角和凸角做為接縫位置。" +msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner." +msgstr "控制接縫是否受模型輪廓上的角影響。'無'表示轉角不影響接縫位置。'隱藏接縫'表示使用盡可能使用凹角做為接縫位置。'暴露接縫'表示盡可能使用凸角做為接縫位置。'隱藏或暴露接縫'則同時使用凹角和凸角做為接縫位置。" #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_none" @@ -1392,13 +1177,8 @@ msgstr "Z 接縫相對" #: fdmprinter.def.json msgctxt "z_seam_relative description" -msgid "" -"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." -msgstr "" -"啟用時,Z 接縫座標為相對於各個部分中心的值。關閉時,座標固定在列印平台上的一" -"個絕對位置。" +msgid "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." +msgstr "啟用時,Z 接縫座標為相對於各個部分中心的值。關閉時,座標固定在列印平台上的一個絕對位置。" #: fdmprinter.def.json msgctxt "skin_no_small_gaps_heuristic label" @@ -1407,14 +1187,8 @@ msgstr "忽略 Z 方向的小間隙" #: 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 "" -"當模型具有微小的垂直間隙時,為了在這些間隙上產生頂部、底部等表面,會花費大約" -"5%的額外的計算時間。勾選這個項目可以節省時間,但是間隙會消失,若要保留這些間" -"隙,不要勾選這個項目。" +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 "當模型具有微小的垂直間隙時,為了在這些間隙上產生頂部、底部等表面,會花費大約5%的額外的計算時間。勾選這個項目可以節省時間,但是間隙會消失,若要保留這些間隙,不要勾選這個項目。" #: fdmprinter.def.json msgctxt "skin_outline_count label" @@ -1423,13 +1197,8 @@ 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 "" -"用多個同心線代替頂部/底部列印樣式的最外面部分。使用一條或兩條線可以改善列印在" -"填充上的頂板。" +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 "用多個同心線代替頂部/底部列印樣式的最外面部分。使用一條或兩條線可以改善列印在填充上的頂板。" #: fdmprinter.def.json msgctxt "ironing_enabled label" @@ -1438,13 +1207,8 @@ msgstr "啟用燙平" #: fdmprinter.def.json msgctxt "ironing_enabled description" -msgid "" -"Go over the top surface one additional time, but without extruding material. " -"This is meant to melt the plastic on top further, creating a smoother " -"surface." -msgstr "" -"再一次經過頂部表面,但不擠出耗材。這是為了進一步融化頂部的塑料,打造更平滑的" -"表面。" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "再一次經過頂部表面,但不擠出耗材。這是為了進一步融化頂部的塑料,打造更平滑的表面。" #: fdmprinter.def.json msgctxt "ironing_only_highest_layer label" @@ -1453,12 +1217,8 @@ msgstr "只燙平最高層" #: fdmprinter.def.json msgctxt "ironing_only_highest_layer description" -msgid "" -"Only perform ironing on the very last layer of the mesh. This saves time if " -"the lower layers don't need a smooth surface finish." -msgstr "" -"只在網格的最後一層進行燙平處理。 如果下層不需要光滑的表面,可啟用此選項以節省" -"時間。" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "只在網格的最後一層進行燙平處理。 如果下層不需要光滑的表面,可啟用此選項以節省時間。" #: fdmprinter.def.json msgctxt "ironing_pattern label" @@ -1497,14 +1257,8 @@ msgstr "燙平流量" #: fdmprinter.def.json msgctxt "ironing_flow description" -msgid "" -"The amount of material, relative to a normal skin line, to extrude during " -"ironing. Keeping the nozzle filled helps filling some of the crevices of the " -"top surface, but too much results in overextrusion and blips on the side of " -"the surface." -msgstr "" -"燙平期間相對於正常表層線條的擠出耗材量。保持噴頭填充狀态有助於填充頂部表面的" -"一些縫隙,但如填充過多則會導致表面上過度擠出和光點。" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "燙平期間相對於正常表層線條的擠出耗材量。保持噴頭填充狀态有助於填充頂部表面的一些縫隙,但如填充過多則會導致表面上過度擠出和光點。" #: fdmprinter.def.json msgctxt "ironing_inset label" @@ -1513,11 +1267,8 @@ msgstr "燙平內嵌" #: fdmprinter.def.json msgctxt "ironing_inset description" -msgid "" -"A distance to keep from the edges of the model. Ironing all the way to the " -"edge of the mesh may result in a jagged edge on your print." -msgstr "" -"與模型邊緣保持的距離。一直燙平至網格的邊緣可能導致列印品出現鋸齒狀邊緣。" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "與模型邊緣保持的距離。一直燙平至網格的邊緣可能導致列印品出現鋸齒狀邊緣。" #: fdmprinter.def.json msgctxt "speed_ironing label" @@ -1566,8 +1317,7 @@ msgstr "填充擠出機" #: fdmprinter.def.json msgctxt "infill_extruder_nr description" -msgid "" -"The extruder train used for printing infill. This is used in multi-extrusion." +msgid "The extruder train used for printing infill. This is used in multi-extrusion." msgstr "用於列印填充的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -1587,9 +1337,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." +msgid "Distance between the printed infill lines. This setting is calculated by the infill density and the infill line width." msgstr "列印填充線條之間的距離。該設定是通過填充密度和填充線寬度計算。" #: fdmprinter.def.json @@ -1599,18 +1347,8 @@ 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, tri-hexagon, cubic, octet, quarter cubic, cross and concentric " -"patterns are fully printed every layer. Cubic, quarter cubic and octet " -"infill change with every layer to provide a more equal distribution of " -"strength over each direction." -msgstr "" -"填充耗材的樣式。線條和鋸齒狀填充輪流在每一層交換方向,以降低耗材成本。網格、" -"三角形、三-六邊形、立方體、八面體、四分立方體、十字形和同心的列印樣式在每層完" -"整列印。立方體、四分立方體和八面體填充隨每層變化,以在各個方向提供更均衡的强" -"度分布。" +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, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "填充耗材的樣式。線條和鋸齒狀填充輪流在每一層交換方向,以降低耗材成本。網格、三角形、三-六邊形、立方體、八面體、四分立方體、十字形和同心的列印樣式在每層完整列印。立方體、四分立方體和八面體填充隨每層變化,以在各個方向提供更均衡的强度分布。" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1684,16 +1422,8 @@ msgstr "連接填充線條" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "" -"Connect the ends where the infill pattern meets the inner wall using a line " -"which follows the shape of the inner wall. Enabling this setting can make " -"the infill adhere to the walls better and reduce the effects of infill on " -"the quality of vertical surfaces. Disabling this setting reduces the amount " -"of material used." -msgstr "" -"使用一條線沿著內牆的形狀,連接填充線條與內牆交會的末端。啟用此設定可以使填充" -"更好地附著在內牆上,並減少對垂直表面品質的影響。關閉此設定可降低材料的使用" -"量。" +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "使用一條線沿著內牆的形狀,連接填充線條與內牆交會的末端。啟用此設定可以使填充更好地附著在內牆上,並減少對垂直表面品質的影響。關閉此設定可降低材料的使用量。" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1702,18 +1432,8 @@ 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 "" -"要使用的整數線條方向列表。列表中的元素隨層的進度依次使用,當達到列表末尾時," -"它將從頭開始。列表元素以逗號分隔,整個列表包含在方括號中。空的列表代表使用傳" -"統的預設角度(線條和鋸齒狀的列印樣式為 45 和 135 度,其他所有的列印樣式為 45 " -"度)。" +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 "要使用的整數線條方向列表。列表中的元素隨層的進度依次使用,當達到列表末尾時,它將從頭開始。列表元素以逗號分隔,整個列表包含在方括號中。空的列表代表使用傳統的預設角度(線條和鋸齒狀的列印樣式為 45 和 135 度,其他所有的列印樣式為 45 度)。" #: fdmprinter.def.json msgctxt "infill_offset_x label" @@ -1722,8 +1442,8 @@ msgstr "填充 X 軸偏移" #: fdmprinter.def.json msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "填充樣式在 X 軸方向偏移此距離。" +msgid "The infill pattern is moved this distance along the X axis." +msgstr "" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1732,8 +1452,8 @@ msgstr "填充 Y 軸偏移" #: fdmprinter.def.json msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "填充樣式在 Y 軸方向偏移此距離。" +msgid "The infill pattern is moved this distance along the Y axis." +msgstr "" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1742,14 +1462,8 @@ 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 "" -"每個立方體半徑的增加量,用來檢查模型的邊界,決定是否應該細分該立方體。值越" -"大,靠近模型邊界附近的小立方體的殼越厚。" +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 "每個立方體半徑的增加量,用來檢查模型的邊界,決定是否應該細分該立方體。值越大,靠近模型邊界附近的小立方體的殼越厚。" #: fdmprinter.def.json msgctxt "infill_overlap label" @@ -1758,10 +1472,8 @@ 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 "填充和牆壁之間的重疊量。稍微重疊可讓各個牆壁與填充牢固連接。" +msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." +msgstr "" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1770,9 +1482,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." +msgid "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill." msgstr "填充和牆壁之間的重疊量。稍微重疊可讓各個壁與填充牢固連接。" #: fdmprinter.def.json @@ -1782,14 +1492,8 @@ msgstr "表層重疊百分比" #: fdmprinter.def.json msgctxt "skin_overlap description" -msgid "" -"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." +msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." msgstr "" -"表層和牆壁之間的重疊量,以線寬百分比表示。稍微重疊可讓各個牆壁與表層牢固連" -"接。這是表層平均線寬和最內壁的百分比。" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1798,9 +1502,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." +msgid "The amount of overlap between the skin and the walls. A slight overlap allows the walls to connect firmly to the skin." msgstr "表層和牆壁之間的重疊量。稍微重疊可讓各個牆壁與表層牢固連接。" #: fdmprinter.def.json @@ -1810,13 +1512,8 @@ 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 "" -"每條填充線條後插入的空跑距離,讓填充更好地附著到壁上。此選項與填充重疊類似," -"但没有擠出,且僅位於填充線條的一端。" +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 "每條填充線條後插入的空跑距離,讓填充更好地附著到壁上。此選項與填充重疊類似,但没有擠出,且僅位於填充線條的一端。" #: fdmprinter.def.json msgctxt "infill_sparse_thickness label" @@ -1825,9 +1522,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." +msgid "The thickness per layer of infill material. This value should always be a multiple of the layer height and is otherwise rounded." msgstr "每層填充的厚度。此值應該是層高度的倍數,並且否則會四捨五入。" #: fdmprinter.def.json @@ -1837,13 +1532,8 @@ 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 "" -"由模型頂部往下,填充密度減半的次數。愈接近頂部的填充密度愈高,直到所設定的填" -"充密度。" +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 "由模型頂部往下,填充密度減半的次數。愈接近頂部的填充密度愈高,直到所設定的填充密度。" #: fdmprinter.def.json msgctxt "gradual_infill_step_height label" @@ -1852,8 +1542,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." +msgid "The height of infill of a given density before switching to half the density." msgstr "減半填充密度的高度。" #: fdmprinter.def.json @@ -1863,14 +1552,8 @@ 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 "" -"列印牆壁前先列印填充。先列印牆壁可以產生更精確的牆壁,但懸垂列印品質會較差。" -"先列印填充會產生更牢固的牆壁,但有時候填充的列印樣式會透過表面顯現出來。" +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 "列印牆壁前先列印填充。先列印牆壁可以產生更精確的牆壁,但懸垂列印品質會較差。先列印填充會產生更牢固的牆壁,但有時候填充的列印樣式會透過表面顯現出來。" #: fdmprinter.def.json msgctxt "min_infill_area label" @@ -1889,14 +1572,8 @@ msgstr "表層移除寬度" #: fdmprinter.def.json msgctxt "skin_preshrink description" -msgid "" -"The largest width of skin areas which are to be removed. Every skin area " -"smaller than this value will disappear. This can help in limiting the amount " -"of time and material spent on printing top/bottom skin at slanted surfaces " -"in the model." -msgstr "" -"要移除表層區域的最大寬度。寬度小於此值的表層區域將會消失。這有助於減少在列印" -"模型傾斜的頂部表層和底部表層所花費的時間和耗材。" +msgid "The largest width of skin areas which are to be removed. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing top/bottom skin at slanted surfaces in the model." +msgstr "要移除表層區域的最大寬度。寬度小於此值的表層區域將會消失。這有助於減少在列印模型傾斜的頂部表層和底部表層所花費的時間和耗材。" #: fdmprinter.def.json msgctxt "top_skin_preshrink label" @@ -1905,14 +1582,8 @@ msgstr "頂部表層移除寬度" #: fdmprinter.def.json msgctxt "top_skin_preshrink description" -msgid "" -"The largest width of top skin areas which are to be removed. Every skin area " -"smaller than this value will disappear. This can help in limiting the amount " -"of time and material spent on printing top skin at slanted surfaces in the " -"model." -msgstr "" -"要移除頂部表層區域的最大寬度。寬度小於此值的頂部表層區域將會消失。這有助於減" -"少在列印模型傾斜的頂部表層所花費的時間和耗材。" +msgid "The largest width of top skin areas which are to be removed. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing top skin at slanted surfaces in the model." +msgstr "要移除頂部表層區域的最大寬度。寬度小於此值的頂部表層區域將會消失。這有助於減少在列印模型傾斜的頂部表層所花費的時間和耗材。" #: fdmprinter.def.json msgctxt "bottom_skin_preshrink label" @@ -1921,14 +1592,8 @@ msgstr "底部表層移除寬度" #: fdmprinter.def.json msgctxt "bottom_skin_preshrink description" -msgid "" -"The largest width of bottom skin areas which are to be removed. Every skin " -"area smaller than this value will disappear. This can help in limiting the " -"amount of time and material spent on printing bottom skin at slanted " -"surfaces in the model." -msgstr "" -"要移除底部表層區域的最大寬度。寬度小於此值的底部表層區域將會消失。這有助於減" -"少在列印模型傾斜的底部表層所花費的時間和耗材。" +msgid "The largest width of bottom skin areas which are to be removed. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing bottom skin at slanted surfaces in the model." +msgstr "要移除底部表層區域的最大寬度。寬度小於此值的底部表層區域將會消失。這有助於減少在列印模型傾斜的底部表層所花費的時間和耗材。" #: fdmprinter.def.json msgctxt "expand_skins_expand_distance label" @@ -1937,13 +1602,8 @@ msgstr "表層延伸距離" #: fdmprinter.def.json msgctxt "expand_skins_expand_distance description" -msgid "" -"The distance the skins are expanded into the infill. Higher values makes the " -"skin attach better to the infill pattern and makes the walls on neighboring " -"layers adhere better to the skin. Lower values save amount of material used." -msgstr "" -"表層延伸進入填充的距離。值愈高表層與填充之間的附著愈好,並使相鄰層的牆壁與表" -"層黏得更緊。而較低的值可以節省耗材的使用。" +msgid "The distance the skins are expanded into the infill. Higher values makes the skin attach better to the infill pattern and makes the walls on neighboring layers adhere better to the skin. Lower values save amount of material used." +msgstr "表層延伸進入填充的距離。值愈高表層與填充之間的附著愈好,並使相鄰層的牆壁與表層黏得更緊。而較低的值可以節省耗材的使用。" #: fdmprinter.def.json msgctxt "top_skin_expand_distance label" @@ -1952,14 +1612,8 @@ msgstr "頂部表層延伸距離" #: fdmprinter.def.json msgctxt "top_skin_expand_distance description" -msgid "" -"The distance the top skins are expanded into the infill. Higher values makes " -"the skin attach better to the infill pattern and makes the walls on the " -"layer above adhere better to the skin. Lower values save amount of material " -"used." -msgstr "" -"頂部表層延伸進入填充的距離。值愈高表層與填充之間的附著愈好,並使上方的牆壁與" -"表層黏得更緊。而較低的值可以節省耗材的使用。" +msgid "The distance the top skins are expanded into the infill. Higher values makes the skin attach better to the infill pattern and makes the walls on the layer above adhere better to the skin. Lower values save amount of material used." +msgstr "頂部表層延伸進入填充的距離。值愈高表層與填充之間的附著愈好,並使上方的牆壁與表層黏得更緊。而較低的值可以節省耗材的使用。" #: fdmprinter.def.json msgctxt "bottom_skin_expand_distance label" @@ -1968,14 +1622,8 @@ msgstr "底部表層延伸距離" #: fdmprinter.def.json msgctxt "bottom_skin_expand_distance description" -msgid "" -"The distance the bottom skins are expanded into the infill. Higher values " -"makes the skin attach better to the infill pattern and makes the skin adhere " -"better to the walls on the layer below. Lower values save amount of material " -"used." -msgstr "" -"底部表層延伸進入填充的距離。值愈高表層與填充之間的附著愈好,並使下方的牆壁與" -"表層黏得更緊。而較低的值可以節省耗材的使用。" +msgid "The distance the bottom skins are expanded into the infill. Higher values makes the skin attach better to the infill pattern and makes the skin adhere better to the walls on the layer below. Lower values save amount of material used." +msgstr "底部表層延伸進入填充的距離。值愈高表層與填充之間的附著愈好,並使下方的牆壁與表層黏得更緊。而較低的值可以節省耗材的使用。" #: fdmprinter.def.json msgctxt "max_skin_angle_for_expansion label" @@ -1984,16 +1632,8 @@ 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 "" -"如果模型的頂部和/或底部表面的角度大於此設定,則不要延伸其頂部/底部表層。這會" -"避免延伸作用在模型表面有接近垂直的斜面時所形成的狹窄表層區域。0° 的角為水平," -"90° 的角為垂直。" +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 "如果模型的頂部和/或底部表面的角度大於此設定,則不要延伸其頂部/底部表層。這會避免延伸作用在模型表面有接近垂直的斜面時所形成的狹窄表層區域。0° 的角為水平,90° 的角為垂直。" #: fdmprinter.def.json msgctxt "min_skin_width_for_expansion label" @@ -2002,13 +1642,8 @@ 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 "" -"如果表層區域寬度小於此值,則不會延伸。這會避免延伸在模型表面的斜度接近垂直時" -"所形成的狹窄表層區域。" +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 "如果表層區域寬度小於此值,則不會延伸。這會避免延伸在模型表面的斜度接近垂直時所形成的狹窄表層區域。" #: fdmprinter.def.json msgctxt "material label" @@ -2020,18 +1655,6 @@ msgctxt "material description" msgid "Material" msgstr "耗材" -#: fdmprinter.def.json -msgctxt "material_flow_dependent_temperature label" -msgid "Auto Temperature" -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 "根據每一層的平均流速自動更改每層的溫度。" - #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" @@ -2039,13 +1662,8 @@ 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 "" -"用於列印的預設溫度。應為耗材的\"基本\"溫度。所有其他列印溫度均應使用基於此值" -"的偏移量" +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 "用於列印的預設溫度。應為耗材的\"基本\"溫度。所有其他列印溫度均應使用基於此值的偏移量" #: fdmprinter.def.json msgctxt "material_print_temperature label" @@ -2064,9 +1682,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." +msgid "The temperature used for printing the first layer. Set at 0 to disable special handling of the initial layer." msgstr "用於列印第一層的溫度。設為 0 即關閉對起始層的特别處理。" #: fdmprinter.def.json @@ -2076,9 +1692,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." +msgid "The minimal temperature while heating up to the Printing Temperature at which printing can already start." msgstr "加熱到可以開始列印的列印溫度時的最低溫度。" #: fdmprinter.def.json @@ -2088,23 +1702,9 @@ 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." +msgid "The temperature to which to already start cooling down just before the end of printing." msgstr "列印結束前開始冷卻的溫度。" -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph label" -msgid "Flow Temperature Graph" -msgstr "流量溫度圖" - -#: fdmprinter.def.json -msgctxt "material_flow_temp_graph description" -msgid "" -"Data linking material flow (in mm3 per second) to temperature (degrees " -"Celsius)." -msgstr "數據連接耗材流量(mm3/s)到溫度(攝氏)。" - #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" @@ -2112,12 +1712,8 @@ 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 "" -"解決在擠料的同時因為噴頭冷卻所造成的影響的額外速度修正。相同的值被用於表示在" -"擠壓時所失去的升溫速度。" +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 "解決在擠料的同時因為噴頭冷卻所造成的影響的額外速度修正。相同的值被用於表示在擠壓時所失去的升溫速度。" #: fdmprinter.def.json msgctxt "material_bed_temperature label" @@ -2126,11 +1722,8 @@ 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." +msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." msgstr "" -"用於加熱列印平台的溫度。如果列印平台溫度為 0,則熱床將不會為此次列印加熱。" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -2149,9 +1742,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." +msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "調整所使用耗材的直徑。這個數值要等同於所使用耗材的直徑。" #: fdmprinter.def.json @@ -2181,9 +1772,7 @@ msgstr "流量" #: fdmprinter.def.json msgctxt "material_flow description" -msgid "" -"Flow compensation: the amount of material extruded is multiplied by this " -"value." +msgid "Flow compensation: the amount of material extruded is multiplied by this value." msgstr "流量補償:擠出的耗材量乘以此值。" #: fdmprinter.def.json @@ -2193,8 +1782,7 @@ msgstr "啟用回抽" #: fdmprinter.def.json msgctxt "retraction_enable description" -msgid "" -"Retract the filament when the nozzle is moving over a non-printed area. " +msgid "Retract the filament when the nozzle is moving over a non-printed area. " msgstr "當噴頭移動到非列印區域上方時回抽耗材。" #: fdmprinter.def.json @@ -2224,9 +1812,7 @@ msgstr "回抽速度" #: fdmprinter.def.json msgctxt "retraction_speed description" -msgid "" -"The speed at which the filament is retracted and primed during a retraction " -"move." +msgid "The speed at which the filament is retracted and primed during a retraction move." msgstr "回抽移動期間耗材回抽和裝填的速度。" #: fdmprinter.def.json @@ -2256,9 +1842,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." +msgid "Some material can ooze away during a travel move, which can be compensated for here." msgstr "有些耗材可能會在空跑過程中滲出,可以在這裡對其進行補償。" #: fdmprinter.def.json @@ -2268,9 +1852,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." +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 "觸發回抽所需的最小空跑距離。這有助於減少小區域內的回抽次數。" #: fdmprinter.def.json @@ -2280,14 +1862,8 @@ 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 "" -"此設定限制在最小擠出距離範圍內發生的回抽數。此範圍內的額外回抽將會忽略。這避" -"免了在同一件耗材上重複回抽,從而導致耗材變扁並引起磨損問題。" +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 "此設定限制在最小擠出距離範圍內發生的回抽數。此範圍內的額外回抽將會忽略。這避免了在同一件耗材上重複回抽,從而導致耗材變扁並引起磨損問題。" #: fdmprinter.def.json msgctxt "retraction_extrusion_window label" @@ -2296,14 +1872,8 @@ 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 "" -"最大回抽次數範圍。此值應大致與回抽距離相等,從而有效地限制在同一段耗材上的回" -"抽次數。" +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 "最大回抽次數範圍。此值應大致與回抽距離相等,從而有效地限制在同一段耗材上的回抽次數。" #: fdmprinter.def.json msgctxt "material_standby_temperature label" @@ -2312,9 +1882,7 @@ msgstr "待機溫度" #: fdmprinter.def.json msgctxt "material_standby_temperature description" -msgid "" -"The temperature of the nozzle when another nozzle is currently used for " -"printing." +msgid "The temperature of the nozzle when another nozzle is currently used for printing." msgstr "當另一個噴頭進行列印時,這個噴頭要保持的溫度。" #: fdmprinter.def.json @@ -2324,9 +1892,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." +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 "回抽量:設為 0,不進行任何回抽。該值通常應與加熱區的長度相同。" #: fdmprinter.def.json @@ -2336,11 +1902,8 @@ 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 "" -"回抽耗材的速度。較高的回抽速度效果較好,但回抽速度過高可能導致耗材磨損。" +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 "回抽耗材的速度。較高的回抽速度效果較好,但回抽速度過高可能導致耗材磨損。" #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speed label" @@ -2349,8 +1912,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." +msgid "The speed at which the filament is retracted during a nozzle switch retract." msgstr "噴頭切換回抽期間耗材回抽的速度。" #: fdmprinter.def.json @@ -2360,9 +1922,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." +msgid "The speed at which the filament is pushed back after a nozzle switch retraction." msgstr "噴頭切換回抽後耗材被推回的速度。" #: fdmprinter.def.json @@ -2412,14 +1972,8 @@ 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 "" -"列印最外壁的速度。以較低速度列印外壁可改善最終表層品質。但是,如果內壁速度和" -"外壁速度差距過大,則將對品質產生負面影響。" +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 "列印最外壁的速度。以較低速度列印外壁可改善最終表層品質。但是,如果內壁速度和外壁速度差距過大,則將對品質產生負面影響。" #: fdmprinter.def.json msgctxt "speed_wall_x label" @@ -2428,13 +1982,8 @@ 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 "" -"列印所有內壁的速度。以比外壁更快的速度列印內壁將減少列印時間。將該值設為外壁" -"速度和填充速度之間也可行。" +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 "列印所有內壁的速度。以比外壁更快的速度列印內壁將減少列印時間。將該值設為外壁速度和填充速度之間也可行。" #: fdmprinter.def.json msgctxt "speed_roofing label" @@ -2463,13 +2012,8 @@ 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 "" -"在列印支撐結構時的速度。以更高的速度列印支撐可以大大減少列印時間。因為支撐在" -"列印後會被清除,所以表面品質並不重要。" +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 "在列印支撐結構時的速度。以更高的速度列印支撐可以大大減少列印時間。因為支撐在列印後會被清除,所以表面品質並不重要。" #: fdmprinter.def.json msgctxt "speed_support_infill label" @@ -2478,9 +2022,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." +msgid "The speed at which the infill of support is printed. Printing the infill at lower speeds improves stability." msgstr "列印支撐填充的速度。以較低的速度列印填充可改善穩定性。" #: fdmprinter.def.json @@ -2490,9 +2032,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." +msgid "The speed at which the roofs and floors of support are printed. Printing them at lower speeds can improve overhang quality." msgstr "列印支撐頂板和底板的速度。以較低的速度列印可以改善懸垂品質。" #: fdmprinter.def.json @@ -2502,9 +2042,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." +msgid "The speed at which the roofs of support are printed. Printing them at lower speeds can improve overhang quality." msgstr "列印支撐頂板的速度。以較低的速度列印可以改善懸垂品質。" #: fdmprinter.def.json @@ -2514,9 +2052,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." +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 "列印支撐底板的速度。以較低的速度列印可以改善支撐在模型頂部的附著。" #: fdmprinter.def.json @@ -2526,13 +2062,8 @@ 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 "" -"列印換料塔的速度。當不同耗材之間的黏合力不佳時,較慢地列印速度可以讓它更穩" -"定。" +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 "列印換料塔的速度。當不同耗材之間的黏合力不佳時,較慢地列印速度可以讓它更穩定。" #: fdmprinter.def.json msgctxt "speed_travel label" @@ -2551,9 +2082,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." +msgid "The speed for the initial layer. A lower value is advised to improve adhesion to the build plate." msgstr "起始層的速度。建議採用較低的值以便改善與列印平台的附著。" #: fdmprinter.def.json @@ -2563,9 +2092,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." +msgid "The speed of printing for the initial layer. A lower value is advised to improve adhesion to the build plate." msgstr "列印起始層的速度。建議採用較低的值以便改善與列印平台的附著。" #: fdmprinter.def.json @@ -2575,14 +2102,8 @@ 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 "" -"起始層中的空跑速度。建議採用較低的值,以防止將之前列印的部分從列印平台上拉" -"離。該設定的值可以根據空跑速度和列印速度的比率自動計算得出。" +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 "起始層中的空跑速度。建議採用較低的值,以防止將之前列印的部分從列印平台上拉離。該設定的值可以根據空跑速度和列印速度的比率自動計算得出。" #: fdmprinter.def.json msgctxt "skirt_brim_speed label" @@ -2591,13 +2112,8 @@ 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 "" -"列印外圍和邊緣的速度。一般情况是以起始層速度列印這些部分,但有時候你可能想要" -"以不同速度來列印外圍或邊緣。" +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 "列印外圍和邊緣的速度。一般情况是以起始層速度列印這些部分,但有時候你可能想要以不同速度來列印外圍或邊緣。" #: fdmprinter.def.json msgctxt "max_feedrate_z_override label" @@ -2606,11 +2122,8 @@ msgstr "最大 Z 軸速度" #: 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 "" -"列印平台移動的最大速度。將該值設為零會使列印為最大 Z 速度採用韌體預設值。" +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 "列印平台移動的最大速度。將該值設為零會使列印為最大 Z 速度採用韌體預設值。" #: fdmprinter.def.json msgctxt "speed_slowdown_layers label" @@ -2619,13 +2132,8 @@ 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 "" -"前幾層的列印速度比模型的其他層慢,以便實現與列印平台的更好附著,並改善整體的" -"列印成功率。該速度在這些層中會逐漸增加。" +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 "前幾層的列印速度比模型的其他層慢,以便實現與列印平台的更好附著,並改善整體的列印成功率。該速度在這些層中會逐漸增加。" #: fdmprinter.def.json msgctxt "speed_equalize_flow_enabled label" @@ -2634,15 +2142,8 @@ 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 "" -"以較快的速度列印比正常線條更細的線條,使每秒擠出的耗材量保持相同。模型中較薄" -"的部分可能需要以低於設定中所提供寬度的線寬來列印線條。該設定控制這些線條的速" -"度變化。" +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 "以較快的速度列印比正常線條更細的線條,使每秒擠出的耗材量保持相同。模型中較薄的部分可能需要以低於設定中所提供寬度的線寬來列印線條。該設定控制這些線條的速度變化。" #: fdmprinter.def.json msgctxt "speed_equalize_flow_max label" @@ -2651,8 +2152,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." +msgid "Maximum print speed when adjusting the print speed in order to equalize flow." msgstr "調整列印速度以便均衡流量時的最大列印速度。" #: fdmprinter.def.json @@ -2662,9 +2162,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." +msgid "Enables adjusting the print head acceleration. Increasing the accelerations can reduce printing time at the cost of print quality." msgstr "啟用調整噴頭的加速度。增加加速度可以減少列印時間卻會犧牲列印品質。" #: fdmprinter.def.json @@ -2764,9 +2262,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." +msgid "The acceleration with which the roofs and floors of support are printed. Printing them at lower acceleration can improve overhang quality." msgstr "列印支撐頂板和底板的加速度。以較低的加速度列印可以改善懸垂品質。" #: fdmprinter.def.json @@ -2776,9 +2272,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." +msgid "The acceleration with which the roofs of support are printed. Printing them at lower acceleration can improve overhang quality." msgstr "列印支撐頂板的加速度。以較低的加速度列印可以改善懸垂品質。" #: fdmprinter.def.json @@ -2788,9 +2282,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." +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 "列印支撐底板的加速度。以較低的加速度列印可以改善支撐在模型頂部的附著。" #: fdmprinter.def.json @@ -2850,13 +2342,8 @@ 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 "" -"列印外圍和邊緣的加速度。一般情况是以起始層加速度列印這些部分,但有時候你可能" -"想要以不同加速度來列印外圍或邊緣。" +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 "列印外圍和邊緣的加速度。一般情况是以起始層加速度列印這些部分,但有時候你可能想要以不同加速度來列印外圍或邊緣。" #: fdmprinter.def.json msgctxt "jerk_enabled label" @@ -2865,13 +2352,8 @@ 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 "" -"啟用當 X 或 Y 軸的速度變化時調整列印頭的加加速度。提高加加速度可以通過以列印" -"品質為代價來縮短列印時間。" +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 "啟用當 X 或 Y 軸的速度變化時調整列印頭的加加速度。提高加加速度可以通過以列印品質為代價來縮短列印時間。" #: fdmprinter.def.json msgctxt "jerk_print label" @@ -2900,8 +2382,7 @@ msgstr "牆壁加加速度" #: fdmprinter.def.json msgctxt "jerk_wall description" -msgid "" -"The maximum instantaneous velocity change with which the walls are printed." +msgid "The maximum instantaneous velocity change with which the walls are printed." msgstr "列印牆壁時的最大瞬時速度變化。" #: fdmprinter.def.json @@ -2911,9 +2392,7 @@ msgstr "外壁加加速度" #: fdmprinter.def.json msgctxt "jerk_wall_0 description" -msgid "" -"The maximum instantaneous velocity change with which the outermost walls are " -"printed." +msgid "The maximum instantaneous velocity change with which the outermost walls are printed." msgstr "列印最外壁時的最大瞬時速度變化。" #: fdmprinter.def.json @@ -2923,9 +2402,7 @@ msgstr "內壁加加速度" #: fdmprinter.def.json msgctxt "jerk_wall_x description" -msgid "" -"The maximum instantaneous velocity change with which all inner walls are " -"printed." +msgid "The maximum instantaneous velocity change with which all inner walls are printed." msgstr "列印所有內壁時的最大瞬時速度變化。" #: fdmprinter.def.json @@ -2935,9 +2412,7 @@ msgstr "頂部表層加加速度" #: fdmprinter.def.json msgctxt "jerk_roofing description" -msgid "" -"The maximum instantaneous velocity change with which top surface skin layers " -"are printed." +msgid "The maximum instantaneous velocity change with which top surface skin layers are printed." msgstr "列印頂部表層時的最大瞬時速度變化。" #: fdmprinter.def.json @@ -2947,9 +2422,7 @@ msgstr "頂部/底部加加速度" #: fdmprinter.def.json msgctxt "jerk_topbottom description" -msgid "" -"The maximum instantaneous velocity change with which top/bottom layers are " -"printed." +msgid "The maximum instantaneous velocity change with which top/bottom layers are printed." msgstr "列印頂部/底部層時的最大瞬時速度變化。" #: fdmprinter.def.json @@ -2959,9 +2432,7 @@ msgstr "支撐加加速度" #: fdmprinter.def.json msgctxt "jerk_support description" -msgid "" -"The maximum instantaneous velocity change with which the support structure " -"is printed." +msgid "The maximum instantaneous velocity change with which the support structure is printed." msgstr "列印支撐結構時的最大瞬時速度變化。" #: fdmprinter.def.json @@ -2971,9 +2442,7 @@ msgstr "支撐填充加加速度" #: fdmprinter.def.json msgctxt "jerk_support_infill description" -msgid "" -"The maximum instantaneous velocity change with which the infill of support " -"is printed." +msgid "The maximum instantaneous velocity change with which the infill of support is printed." msgstr "列印支撐填充時的最大瞬時速度變化。" #: fdmprinter.def.json @@ -2983,9 +2452,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." +msgid "The maximum instantaneous velocity change with which the roofs and floors of support are printed." msgstr "列印支撐頂板和底板的最大瞬時速度變化。" #: fdmprinter.def.json @@ -2995,9 +2462,7 @@ msgstr "支撐頂板加加速度" #: fdmprinter.def.json msgctxt "jerk_support_roof description" -msgid "" -"The maximum instantaneous velocity change with which the roofs of support " -"are printed." +msgid "The maximum instantaneous velocity change with which the roofs of support are printed." msgstr "列印支撐頂板的最大瞬時速度變化。" #: fdmprinter.def.json @@ -3007,9 +2472,7 @@ msgstr "支撐底板加加速度" #: fdmprinter.def.json msgctxt "jerk_support_bottom description" -msgid "" -"The maximum instantaneous velocity change with which the floors of support " -"are printed." +msgid "The maximum instantaneous velocity change with which the floors of support are printed." msgstr "列印支撐底板時的最大瞬時速度變化。" #: fdmprinter.def.json @@ -3019,9 +2482,7 @@ msgstr "換料塔加加速度" #: fdmprinter.def.json msgctxt "jerk_prime_tower description" -msgid "" -"The maximum instantaneous velocity change with which the prime tower is " -"printed." +msgid "The maximum instantaneous velocity change with which the prime tower is printed." msgstr "列印換料塔時的最大瞬時速度變化。" #: fdmprinter.def.json @@ -3031,8 +2492,7 @@ msgstr "空跑加加速度" #: fdmprinter.def.json msgctxt "jerk_travel description" -msgid "" -"The maximum instantaneous velocity change with which travel moves are made." +msgid "The maximum instantaneous velocity change with which travel moves are made." msgstr "進行空跑時的最大瞬時速度變化。" #: fdmprinter.def.json @@ -3052,9 +2512,7 @@ msgstr "起始層列印加加速度" #: fdmprinter.def.json msgctxt "jerk_print_layer_0 description" -msgid "" -"The maximum instantaneous velocity change during the printing of the initial " -"layer." +msgid "The maximum instantaneous velocity change during the printing of the initial layer." msgstr "列印起始層時的最大瞬時速度變化。" #: fdmprinter.def.json @@ -3074,9 +2532,7 @@ msgstr "外圍/邊緣加加速度" #: fdmprinter.def.json msgctxt "jerk_skirt_brim description" -msgid "" -"The maximum instantaneous velocity change with which the skirt and brim are " -"printed." +msgid "The maximum instantaneous velocity change with which the skirt and brim are printed." msgstr "列印外圍和邊緣時的最大瞬時速度變化。" #: fdmprinter.def.json @@ -3096,16 +2552,8 @@ 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 "" -"梳理可在空跑時讓噴頭保持在已列印區域內。這會使空跑距離稍微延長,但可減少回抽" -"需求。如果關閉梳理,則耗材將回抽,且噴頭沿著直線移動到下一個點。也可以通過僅" -"在填充內進行梳理避免梳理頂部/底部表層區域。" +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 "梳理可在空跑時讓噴頭保持在已列印區域內。這會使空跑距離稍微延長,但可減少回抽需求。如果關閉梳理,則耗材將回抽,且噴頭沿著直線移動到下一個點。也可以通過僅在填充內進行梳理避免梳理頂部/底部表層區域。" #: fdmprinter.def.json msgctxt "retraction_combing option off" @@ -3139,9 +2587,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." +msgid "The nozzle avoids already printed parts when traveling. This option is only available when combing is enabled." msgstr "噴頭會在空跑時避開已列印的部分。此選項僅在啟用梳理功能時可用。" #: fdmprinter.def.json @@ -3151,9 +2597,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." +msgid "The distance between the nozzle and already printed parts when avoiding during travel moves." msgstr "噴頭和已列印部分之間在空跑時避開的距離。" #: fdmprinter.def.json @@ -3163,14 +2607,8 @@ 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 "" -"每一層都在相同點附近開始列印,這樣在列印新的一層時,就不需要列印前一層結束時" -"的那一小段區域。在懸垂部分和小零件有良好的效果,但會增加列印時間。" +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 "每一層都在相同點附近開始列印,這樣在列印新的一層時,就不需要列印前一層結束時的那一小段區域。在懸垂部分和小零件有良好的效果,但會增加列印時間。" #: fdmprinter.def.json msgctxt "layer_start_x label" @@ -3179,9 +2617,7 @@ msgstr "每層列印起始點的 X 座標" #: 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." +msgid "The X coordinate of the position near where to find the part to start printing each layer." msgstr "每一層列印起始點附近位置的 X 坐標。" #: fdmprinter.def.json @@ -3191,9 +2627,7 @@ msgstr "每層列印起始點的 Y 座標" #: 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." +msgid "The Y coordinate of the position near where to find the part to start printing each layer." msgstr "每一層列印起始點附近位置的 Y 坐標。" #: fdmprinter.def.json @@ -3203,14 +2637,8 @@ msgstr "回抽時 Z 抬升" #: 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 "" -"每當回抽完成時,列印平台會降低以便在噴頭和列印品之間形成空隙。它可以防止噴頭" -"在空跑過程中撞到列印品,降低將列印品從列印平台撞掉的幾率。" +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 "每當回抽完成時,列印平台會降低以便在噴頭和列印品之間形成空隙。它可以防止噴頭在空跑過程中撞到列印品,降低將列印品從列印平台撞掉的幾率。" #: fdmprinter.def.json msgctxt "retraction_hop_only_when_collides label" @@ -3219,12 +2647,8 @@ msgstr "僅在已列印部分上 Z 抬升" #: 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 "" -"僅在移動到無法通過“空跑時避開已列印部分”選項的水平操作避開的已列印部分上方時" -"執行 Z 抬升。" +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 "僅在移動到無法通過“空跑時避開已列印部分”選項的水平操作避開的已列印部分上方時執行 Z 抬升。" #: fdmprinter.def.json msgctxt "retraction_hop label" @@ -3243,13 +2667,8 @@ msgstr "擠出機切換後的 Z 抬升" #: 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 "" -"當機器從一個擠出機切換到另一個時,列印平台會降低以便在噴頭和列印品之間形成空" -"隙。這將防止噴頭在列印品外部留下滲出物。" +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 "當機器從一個擠出機切換到另一個時,列印平台會降低以便在噴頭和列印品之間形成空隙。這將防止噴頭在列印品外部留下滲出物。" #: fdmprinter.def.json msgctxt "cooling label" @@ -3268,12 +2687,8 @@ 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 "" -"列印時啟用列印冷卻風扇。風扇可以在列印時間較短的層和橋接/懸垂結構提高列印品" -"質。" +msgid "Enables the print cooling fans while printing. The fans improve print quality on layers with short layer times and bridging / overhangs." +msgstr "列印時啟用列印冷卻風扇。風扇可以在列印時間較短的層和橋接/懸垂結構提高列印品質。" #: fdmprinter.def.json msgctxt "cool_fan_speed label" @@ -3292,14 +2707,8 @@ 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 "" -"在單層列印時間大於門檻值時,風扇運轉的速度。當單層列印時間小於門檻值時,系統" -"會根據單層列印時間決定使用的風扇轉速。列印時間愈短,所使用的風扇轉速愈快,但" -"不會超過最大風扇轉速。" +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 "在單層列印時間大於門檻值時,風扇運轉的速度。當單層列印時間小於門檻值時,系統會根據單層列印時間決定使用的風扇轉速。列印時間愈短,所使用的風扇轉速愈快,但不會超過最大風扇轉速。" #: fdmprinter.def.json msgctxt "cool_fan_speed_max label" @@ -3308,14 +2717,8 @@ 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 "" -"在“最短單層列印時間”時,風扇運轉的速度。當單層列印時間小於門檻值時,系統會根" -"據單層列印時間決定使用的風扇轉速。列印時間愈短,所使用的風扇轉速愈快,但不會" -"超過最大風扇轉速。" +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 "在“最短單層列印時間”時,風扇運轉的速度。當單層列印時間小於門檻值時,系統會根據單層列印時間決定使用的風扇轉速。列印時間愈短,所使用的風扇轉速愈快,但不會超過最大風扇轉速。" #: fdmprinter.def.json msgctxt "cool_min_layer_time_fan_speed_max label" @@ -3324,15 +2727,8 @@ 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 "" -"使用標準風扇轉速的單層列印時間門檻值。如果單層列印時間大於這個門檻值,就使用" -"標準風扇轉速。如果單層列印時間比這個門檻值短,系統會根據單層列印時間決定使用" -"的風扇轉速。列印時間愈短,所使用的風扇轉速愈快,但不會超過最大風扇轉速。" +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 "使用標準風扇轉速的單層列印時間門檻值。如果單層列印時間大於這個門檻值,就使用標準風扇轉速。如果單層列印時間比這個門檻值短,系統會根據單層列印時間決定使用的風扇轉速。列印時間愈短,所使用的風扇轉速愈快,但不會超過最大風扇轉速。" #: fdmprinter.def.json msgctxt "cool_fan_speed_0 label" @@ -3341,13 +2737,8 @@ 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 "" -"列印起始層時的風扇轉速。在隨後的層中,風扇轉速會逐漸增加到對應層所設定的速" -"度。" +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 "列印起始層時的風扇轉速。在隨後的層中,風扇轉速會逐漸增加到對應層所設定的速度。" #: fdmprinter.def.json msgctxt "cool_fan_full_at_height label" @@ -3356,13 +2747,8 @@ 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 "" -"使用標準風扇轉速的高度。風扇轉速會從起始轉速逐漸增加,在此高度達到標準風扇轉" -"速。" +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 "使用標準風扇轉速的高度。風扇轉速會從起始轉速逐漸增加,在此高度達到標準風扇轉速。" #: fdmprinter.def.json msgctxt "cool_fan_full_layer label" @@ -3371,12 +2757,8 @@ 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 "" -"要使用標準風扇轉速的層。如果標準風扇轉速高度已被設定,這個值將使用計算出來後" -"取四捨五入的整數值。" +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 "要使用標準風扇轉速的層。如果標準風扇轉速高度已被設定,這個值將使用計算出來後取四捨五入的整數值。" #: fdmprinter.def.json msgctxt "cool_min_layer_time label" @@ -3385,16 +2767,8 @@ 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 "" -"單層列印時間的下限。這會迫使印表機減速,以便在單層列印中消耗此處所規定的時" -"間。這會讓模型充分冷卻後再列印下一層。如果“噴頭抬升”功能被關閉,為了不違反“最" -"低列印速度”,單層列印時間仍有可能低於此設定值。" +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 "單層列印時間的下限。這會迫使印表機減速,以便在單層列印中消耗此處所規定的時間。這會讓模型充分冷卻後再列印下一層。如果“噴頭抬升”功能被關閉,為了不違反“最低列印速度”,單層列印時間仍有可能低於此設定值。" #: fdmprinter.def.json msgctxt "cool_min_speed label" @@ -3403,13 +2777,8 @@ 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 "" -"列印速度的下限,限制因“最短單層列印時間”的減速。當印表機減速過多時,噴頭中的" -"壓力將過低並導致較差的列印品質。" +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 "列印速度的下限,限制因“最短單層列印時間”的減速。當印表機減速過多時,噴頭中的壓力將過低並導致較差的列印品質。" #: fdmprinter.def.json msgctxt "cool_lift_head label" @@ -3418,13 +2787,8 @@ 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 "" -"當“最短單層列印時間”受到“最低列印速度”限制時,將噴頭從模型上抬高,並等候達到" -"最短單層列印時間。" +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 "當“最短單層列印時間”受到“最低列印速度”限制時,將噴頭從模型上抬高,並等候達到最短單層列印時間。" #: fdmprinter.def.json msgctxt "support label" @@ -3443,12 +2807,8 @@ 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 "" -"在模型的懸垂(Overhangs)部分產生支撐結構。若不這樣做,這些部分在列印時將倒" -"塌。" +msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." +msgstr "在模型的懸垂(Overhangs)部分產生支撐結構。若不這樣做,這些部分在列印時將倒塌。" #: fdmprinter.def.json msgctxt "support_extruder_nr label" @@ -3457,9 +2817,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." +msgid "The extruder train to use for printing the support. This is used in multi-extrusion." msgstr "用於列印支撐的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -3469,9 +2827,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." +msgid "The extruder train to use for printing the infill of the support. This is used in multi-extrusion." msgstr "用於列印支撐填充的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -3481,9 +2837,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." +msgid "The extruder train to use for printing the first layer of support infill. This is used in multi-extrusion." msgstr "用於列印支撐填充第一層的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -3493,9 +2847,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." +msgid "The extruder train to use for printing the roofs and floors of the support. This is used in multi-extrusion." msgstr "用於列印支撐頂板和底板的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -3505,9 +2857,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." +msgid "The extruder train to use for printing the roofs of the support. This is used in multi-extrusion." msgstr "用於列印支撐頂板的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -3517,9 +2867,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." +msgid "The extruder train to use for printing the floors of the support. This is used in multi-extrusion." msgstr "用於列印支撐底板的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -3529,13 +2877,8 @@ 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 "" -"調整支撐結構的位置。位置可以設定為“接觸列印平台”或“每個地方”。當設定為“每個地" -"方”時,在模型上也會列印支撐結構。" +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 "調整支撐結構的位置。位置可以設定為“接觸列印平台”或“每個地方”。當設定為“每個地方”時,在模型上也會列印支撐結構。" #: fdmprinter.def.json msgctxt "support_type option buildplate" @@ -3554,12 +2897,8 @@ 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 "" -"添加支撐的最小懸垂角度。當角度為 0° 時,將支撐所有懸垂,當角度為 90° 時,不提" -"供任何支撐。" +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 "添加支撐的最小懸垂角度。當角度為 0° 時,將支撐所有懸垂,當角度為 90° 時,不提供任何支撐。" #: fdmprinter.def.json msgctxt "support_pattern label" @@ -3568,9 +2907,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." +msgid "The pattern of the support structures of the print. The different options available result in sturdy or easy to remove support." msgstr "支撐結構的列印樣式。有不同的選項可產生堅固的或容易清除的支撐。" #: fdmprinter.def.json @@ -3615,9 +2952,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." +msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "連接鋸齒狀。這將增加鋸齒狀支撐結構的强度。" #: fdmprinter.def.json @@ -3627,9 +2962,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." +msgid "Adjusts the density of the support structure. A higher value results in better overhangs, but the supports are harder to remove." msgstr "調整支撐結構的密度。較高的值會實現更好的懸垂,但支撐將更加難以移除。" #: fdmprinter.def.json @@ -3639,9 +2972,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." +msgid "Distance between the printed support structure lines. This setting is calculated by the support density." msgstr "已列印支撐結構線條之間的距離。該設定通過支撐密度計算。" #: fdmprinter.def.json @@ -3651,13 +2982,8 @@ msgstr "支撐 Z 間距" #: 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 "" -"支撐結構距離模型頂部/底部的距離。這一個小的差距使得它更容易被去除,這個數值會" -"被無條件進位到層高的倍數。" +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 "支撐結構距離模型頂部/底部的距離。這一個小的差距使得它更容易被去除,這個數值會被無條件進位到層高的倍數。" #: fdmprinter.def.json msgctxt "support_top_distance label" @@ -3696,15 +3022,8 @@ 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 "" -"支撐 X/Y 間距是否優先於支撐 Z 間距的設定。當 X/Y 間距優先於 Z 時,X/Y 間距可" -"將支撐從模型上推離,同時影響與懸垂之間的實際 Z 間距。我們可以通過不在懸垂周圍" -"套用 X/Y 間距來關閉此選項。" +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 "支撐 X/Y 間距是否優先於支撐 Z 間距的設定。當 X/Y 間距優先於 Z 時,X/Y 間距可將支撐從模型上推離,同時影響與懸垂之間的實際 Z 間距。我們可以通過不在懸垂周圍套用 X/Y 間距來關閉此選項。" #: fdmprinter.def.json msgctxt "support_xy_overrides_z option xy_overrides_z" @@ -3723,8 +3042,7 @@ msgstr "最小支撐 X/Y 間距" #: fdmprinter.def.json msgctxt "support_xy_distance_overhang description" -msgid "" -"Distance of the support structure from the overhang in the X/Y directions. " +msgid "Distance of the support structure from the overhang in the X/Y directions. " msgstr "支撐結構在 X/Y 方向與懸垂的間距。" #: fdmprinter.def.json @@ -3734,14 +3052,8 @@ 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 "" -"模型上的支撐階梯狀底部的階梯高度。較低的值會使支撐更難於移除,但過高的值可能" -"導致不穩定的支撐結構。設為零可以關閉階梯狀行為。" +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 "模型上的支撐階梯狀底部的階梯高度。較低的值會使支撐更難於移除,但過高的值可能導致不穩定的支撐結構。設為零可以關閉階梯狀行為。" #: fdmprinter.def.json msgctxt "support_bottom_stair_step_width label" @@ -3750,13 +3062,8 @@ 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 "" -"停留在模型上的支撐階梯狀底部的最大階梯寬度。較低的值會使支撐更難於移除,但過" -"高的值可能導致不穩定的支撐結構。" +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 "停留在模型上的支撐階梯狀底部的最大階梯寬度。較低的值會使支撐更難於移除,但過高的值可能導致不穩定的支撐結構。" #: fdmprinter.def.json msgctxt "support_join_distance label" @@ -3765,13 +3072,8 @@ 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 "" -"支撐結構間在 X/Y 方向的最大距離。當分離結構之間的距離小於此值時,這些結構將合" -"併為一個。" +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 "支撐結構間在 X/Y 方向的最大距離。當分離結構之間的距離小於此值時,這些結構將合併為一個。" #: fdmprinter.def.json msgctxt "support_offset label" @@ -3780,12 +3082,8 @@ 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 "" -"套用到每一層所有支撐多邊形的偏移量。正值可以讓支撐區域更平滑,並產生更為牢固" -"的支撐。" +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 "套用到每一層所有支撐多邊形的偏移量。正值可以讓支撐區域更平滑,並產生更為牢固的支撐。" #: fdmprinter.def.json msgctxt "support_infill_sparse_thickness label" @@ -3794,12 +3092,8 @@ msgstr "支撐填充層厚度" #: fdmprinter.def.json msgctxt "support_infill_sparse_thickness description" -msgid "" -"The thickness per layer of support infill material. This value should always " -"be a multiple of the layer height and is otherwise rounded." -msgstr "" -"支撐填充耗材每層的厚度。該值應為層高的倍數,否則數值會被四捨五入到層高的倍" -"數。" +msgid "The thickness per layer of support infill material. This value should always be a multiple of the layer height and is otherwise rounded." +msgstr "支撐填充耗材每層的厚度。該值應為層高的倍數,否則數值會被四捨五入到層高的倍數。" #: fdmprinter.def.json msgctxt "gradual_support_infill_steps label" @@ -3808,13 +3102,8 @@ msgstr "漸進支撐填充步階" #: fdmprinter.def.json msgctxt "gradual_support_infill_steps description" -msgid "" -"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." -msgstr "" -"從支撐頂層往下,填充密度減半的次數。越靠近頂層的填充密度越高,最高密度為支撐" -"填充密度。" +msgid "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." +msgstr "從支撐頂層往下,填充密度減半的次數。越靠近頂層的填充密度越高,最高密度為支撐填充密度。" #: fdmprinter.def.json msgctxt "gradual_support_infill_step_height label" @@ -3823,9 +3112,7 @@ msgstr "漸進支撐填充步階高度" #: fdmprinter.def.json msgctxt "gradual_support_infill_step_height description" -msgid "" -"The height of support infill of a given density before switching to half the " -"density." +msgid "The height of support infill of a given density before switching to half the density." msgstr "支撐層密度減半的厚度。" #: fdmprinter.def.json @@ -3835,13 +3122,8 @@ 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 "" -"在模型和支撐之間產生一個密度較高的介面。這會在承載模型的支撐頂部和座落在模型" -"上的支撐底部創造出一個介面層。" +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 "在模型和支撐之間產生一個密度較高的介面。這會在承載模型的支撐頂部和座落在模型上的支撐底部創造出一個介面層。" #: fdmprinter.def.json msgctxt "support_roof_enable label" @@ -3850,11 +3132,8 @@ 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 "" -"在支撐頂部和模型之間產生一個密集的平板。這會在模型和支撐之間形成一個介面層。" +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 "在支撐頂部和模型之間產生一個密集的平板。這會在模型和支撐之間形成一個介面層。" #: fdmprinter.def.json msgctxt "support_bottom_enable label" @@ -3863,11 +3142,8 @@ 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 "" -"在支撐底部和模型之間產生一個密集的平板。這會在模型和支撐之間形成一個介面層。" +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 "在支撐底部和模型之間產生一個密集的平板。這會在模型和支撐之間形成一個介面層。" #: fdmprinter.def.json msgctxt "support_interface_height label" @@ -3876,9 +3152,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." +msgid "The thickness of the interface of the support where it touches with the model on the bottom or the top." msgstr "支撐與模型在底部或頂部接觸的介面厚度。" #: fdmprinter.def.json @@ -3888,9 +3162,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." +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 "支撐頂板的厚度。這會控制承載模型的支撐頂部密集層的數量。" #: fdmprinter.def.json @@ -3900,9 +3172,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." +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 "支撐底板的厚度。這會控制座落在模型上的支撐底部密集層的數量。" #: fdmprinter.def.json @@ -3912,14 +3182,8 @@ 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 "" -"在檢查支撐上方或下方是否有模型時,所採用步階的高度。值越低切片速度越慢,而較" -"高的值會導致在部分應有支撐介面的位置列印一般的支撐。" +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 "在檢查支撐上方或下方是否有模型時,所採用步階的高度。值越低切片速度越慢,而較高的值會導致在部分應有支撐介面的位置列印一般的支撐。" #: fdmprinter.def.json msgctxt "support_interface_density label" @@ -3928,13 +3192,8 @@ 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 "" -"調整支撐結構頂板和底板的密度。較高的值會實現更好的懸垂,但支撐將更加難以移" -"除。" +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 "調整支撐結構頂板和底板的密度。較高的值會實現更好的懸垂,但支撐將更加難以移除。" #: fdmprinter.def.json msgctxt "support_roof_density label" @@ -3943,9 +3202,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." +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 "支撐結構頂板的密度。較高的值會讓懸垂印得更好,但支撐將更加難以移除。" #: fdmprinter.def.json @@ -3955,9 +3212,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." +msgid "Distance between the printed support roof lines. This setting is calculated by the Support Roof Density, but can be adjusted separately." msgstr "支撐頂板線條之間的距離。該設定是通過支撐頂板密度計算,但可以單獨調整。" #: fdmprinter.def.json @@ -3967,9 +3222,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." +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 "支撐結構底板的密度。較高的值會讓支撐更容易附著在模型上。" #: fdmprinter.def.json @@ -3979,9 +3232,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." +msgid "Distance between the printed support floor lines. This setting is calculated by the Support Floor Density, but can be adjusted separately." msgstr "支撐底板線條之間的距離。該設定是通過支撐底板密度計算,但可以單獨調整。" #: fdmprinter.def.json @@ -3991,9 +3242,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." +msgid "The pattern with which the interface of the support with the model is printed." msgstr "支撐與模型之間介面的列印樣式。" #: fdmprinter.def.json @@ -4113,13 +3362,8 @@ 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 "" -"使用專門的塔來支撐較小的懸垂區域。這些塔的直徑比它們所支撐的區域要大。在靠近" -"懸垂物時,塔的直徑減小,形成頂板。" +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 "使用專門的塔來支撐較小的懸垂區域。這些塔的直徑比它們所支撐的區域要大。在靠近懸垂物時,塔的直徑減小,形成頂板。" #: fdmprinter.def.json msgctxt "support_tower_diameter label" @@ -4138,9 +3382,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." +msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower." msgstr "小區域中支撐塔的 X/Y 軸方向最小直徑。" #: fdmprinter.def.json @@ -4150,11 +3392,19 @@ 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." +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 "塔頂角度。該值越高,塔頂越尖,值越低,塔頂越平。" +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +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 "在支撐網格下方的所有位置進行支撐,讓支撐網格中没有懸垂。" + #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" @@ -4172,14 +3422,8 @@ 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 "" -"列印前是否裝填少量的耗材。開啟此設定將確保列印前擠出機的噴頭處已準備好耗材。" -"列印邊緣或外圍也可作為裝填用途,這種情况下關閉此設定可以節省時間。" +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 "列印前是否裝填少量的耗材。開啟此設定將確保列印前擠出機的噴頭處已準備好耗材。列印邊緣或外圍也可作為裝填用途,這種情况下關閉此設定可以節省時間。" #: fdmprinter.def.json msgctxt "extruder_prime_pos_x label" @@ -4188,9 +3432,7 @@ msgstr "擠出機 X 軸起始位置" #: 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." +msgid "The X coordinate of the position where the nozzle primes at the start of printing." msgstr "列印開始時,噴頭在 X 軸上初始位置。" #: fdmprinter.def.json @@ -4200,9 +3442,7 @@ msgstr "擠出機 Y 軸起始位置" #: 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." +msgid "The Y coordinate of the position where the nozzle primes at the start of printing." msgstr "列印開始時,噴頭在 Y 軸座標上初始位置。" #: fdmprinter.def.json @@ -4212,16 +3452,8 @@ 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 "" -"幫助改善擠出裝填以及與列印平台附著的不同選項。邊緣會在模型基座周圍添加單層平" -"面區域,以防止翹曲。木筏會在模型底下添加一個有頂板的厚網格。外圍是在模型四周" -"列印的一條線,但並不與模型連接。" +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 "幫助改善擠出裝填以及與列印平台附著的不同選項。邊緣會在模型基座周圍添加單層平面區域,以防止翹曲。木筏會在模型底下添加一個有頂板的厚網格。外圍是在模型四周列印的一條線,但並不與模型連接。" #: fdmprinter.def.json msgctxt "adhesion_type option skirt" @@ -4250,9 +3482,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." +msgid "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion." msgstr "用於列印外圍/邊緣/木筏的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json @@ -4262,12 +3492,8 @@ 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 "" -"多條外圍線條有助你在列印小型模型時,更好地裝填的擠出機組。將其設為 0 將關閉外" -"圍。" +msgid "Multiple skirt lines help to prime your extrusion better for small models. Setting this to 0 will disable the skirt." +msgstr "多條外圍線條有助你在列印小型模型時,更好地裝填的擠出機組。將其設為 0 將關閉外圍。" #: fdmprinter.def.json msgctxt "skirt_gap label" @@ -4278,8 +3504,7 @@ msgstr "外圍間距" 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." +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." msgstr "" "外圍和列印第一層之間的水平距離。\n" "這是最小距離,多個外圍線條將從此距離向外延伸。" @@ -4291,14 +3516,8 @@ 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 "" -"外圍或邊緣的最小長度。如果所有外圍或邊緣線條之和都没有達到此長度,則將添加更" -"多外圍或邊緣線條直至達到最小長度。注意:如果線條計數設為 0,則將忽略此選項。" +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 "外圍或邊緣的最小長度。如果所有外圍或邊緣線條之和都没有達到此長度,則將添加更多外圍或邊緣線條直至達到最小長度。注意:如果線條計數設為 0,則將忽略此選項。" #: fdmprinter.def.json msgctxt "brim_width label" @@ -4307,13 +3526,8 @@ 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 "" -"模型到最外側邊緣線的距離。較大的邊緣可增强與列印平台的附著,但也會減少有效列" -"印區域。" +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 "模型到最外側邊緣線的距離。較大的邊緣可增强與列印平台的附著,但也會減少有效列印區域。" #: fdmprinter.def.json msgctxt "brim_line_count label" @@ -4322,12 +3536,8 @@ 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 "" -"邊緣所用線條數量。更多邊緣線條可增强與列印平台的附著,但也會減少有效列印區" -"域。" +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 "邊緣所用線條數量。更多邊緣線條可增强與列印平台的附著,但也會減少有效列印區域。" #: fdmprinter.def.json msgctxt "brim_outside_only label" @@ -4336,13 +3546,8 @@ 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 "" -"僅在模型外部列印邊緣。這會減少你之後需要移除的邊緣量,而不會過度影響列印平台" -"附著。" +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 "僅在模型外部列印邊緣。這會減少你之後需要移除的邊緣量,而不會過度影響列印平台附著。" #: fdmprinter.def.json msgctxt "raft_margin label" @@ -4351,13 +3556,8 @@ 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 "" -"如果啟用了木筏,在模型周圍也會增加額外邊緣。增大這個邊緣將產生更強的木筏,不" -"過也會使用更多的耗材,並減少印表機的可列印面積。" +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 "如果啟用了木筏,在模型周圍也會增加額外邊緣。增大這個邊緣將產生更強的木筏,不過也會使用更多的耗材,並減少印表機的可列印面積。" #: fdmprinter.def.json msgctxt "raft_smoothing label" @@ -4366,14 +3566,8 @@ msgstr "木筏平滑處理" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "" -"This setting controls how much inner corners in the raft outline are " -"rounded. Inward corners are rounded to a semi circle with a radius equal to " -"the value given here. This setting also removes holes in the raft outline " -"which are smaller than such a circle." -msgstr "" -"此設定控制木筏輪廓凹角導圓角的量。向內的轉角會被導為圓弧,其半徑等於此設定" -"值。此設定同時可以移除木筏輪廓中半徑小於此設定值的圓孔。" +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "此設定控制木筏輪廓凹角導圓角的量。向內的轉角會被導為圓弧,其半徑等於此設定值。此設定同時可以移除木筏輪廓中半徑小於此設定值的圓孔。" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4382,13 +3576,8 @@ 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 "" -"木筏最後一層與模型第一層之間的間隙。只有第一層被提高了這個距離,以便降低木筏" -"和模型之間的附著。讓木筏更容易剝離。" +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 "木筏最後一層與模型第一層之間的間隙。只有第一層被提高了這個距離,以便降低木筏和模型之間的附著。讓木筏更容易剝離。" #: fdmprinter.def.json msgctxt "layer_0_z_overlap label" @@ -4397,13 +3586,8 @@ msgstr "起始層 Z 重疊" #: 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 "" -"使模型的第一層和第二層在 Z 方向上重疊以補償在空隙中損失的耗材。第一個模型層上" -"方的所有模型將向下移動此重疊量。" +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 "使模型的第一層和第二層在 Z 方向上重疊以補償在空隙中損失的耗材。第一個模型層上方的所有模型將向下移動此重疊量。" #: fdmprinter.def.json msgctxt "raft_surface_layers label" @@ -4412,13 +3596,8 @@ 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 "" -"位於木筏中層上方的頂部層數。這是承載模型的完全填充層。兩層會產生比一層更平滑" -"的頂部表面。" +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 "位於木筏中層上方的頂部層數。這是承載模型的完全填充層。兩層會產生比一層更平滑的頂部表面。" #: fdmprinter.def.json msgctxt "raft_surface_thickness label" @@ -4437,9 +3616,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." +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 "木筏頂部表面的線寬。這些線條可以是細線,以便讓木筏頂部變得平滑。" #: fdmprinter.def.json @@ -4449,9 +3626,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." +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 "木筏頂部線條之間的距離。間距應等於線寬,以便打造堅固表面。" #: fdmprinter.def.json @@ -4471,9 +3646,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." +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 "木筏中層的線寬。第二層擠出多一些會讓線條附著在列印平台上。" #: fdmprinter.def.json @@ -4483,13 +3656,8 @@ 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 "" -"木筏中層線條之間的距離。中層的間距應足夠寬,同時也要足夠密集,以便支撐木筏頂" -"部。" +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 "木筏中層線條之間的距離。中層的間距應足夠寬,同時也要足夠密集,以便支撐木筏頂部。" #: fdmprinter.def.json msgctxt "raft_base_thickness label" @@ -4498,9 +3666,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." +msgid "Layer thickness of the base raft layer. This should be a thick layer which sticks firmly to the printer build plate." msgstr "木筏底部的層厚。本層應為與印表機列印平台穩固附著厚實的一層。" #: fdmprinter.def.json @@ -4510,9 +3676,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." +msgid "Width of the lines in the base raft layer. These should be thick lines to assist in build plate adhesion." msgstr "木筏底部的線寬。這些線條應該是粗線,以便協助列印平台附著。" #: fdmprinter.def.json @@ -4522,9 +3686,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." +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 "木筏底部線條之間的距離。寬間距方便讓木筏從列印平台移除。" #: fdmprinter.def.json @@ -4544,13 +3706,8 @@ 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 "" -"列印木筏頂部的速度。這些層應以稍慢的速度列印,以便噴頭緩慢地整平臨近的表面線" -"條。" +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 "列印木筏頂部的速度。這些層應以稍慢的速度列印,以便噴頭緩慢地整平臨近的表面線條。" #: fdmprinter.def.json msgctxt "raft_interface_speed label" @@ -4559,12 +3716,8 @@ 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 "" -"列印木筏中層的速度。這些層應以很慢的速度列印,因為噴頭所出的耗材量非常高。" +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 "列印木筏中層的速度。這些層應以很慢的速度列印,因為噴頭所出的耗材量非常高。" #: fdmprinter.def.json msgctxt "raft_base_speed label" @@ -4573,12 +3726,8 @@ 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 "" -"列印木筏底部的速度。這些層應以很慢的速度列印,因為噴頭所出的耗材量非常高。" +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 "列印木筏底部的速度。這些層應以很慢的速度列印,因為噴頭所出的耗材量非常高。" #: fdmprinter.def.json msgctxt "raft_acceleration label" @@ -4717,9 +3866,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." +msgid "Print a tower next to the print which serves to prime the material after each nozzle switch." msgstr "在列印件旁邊印一個塔,用在每次切換噴頭後填充耗材。" #: fdmprinter.def.json @@ -4739,9 +3886,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." +msgid "The minimum volume for each layer of the prime tower in order to purge enough material." msgstr "為了清除足夠的耗材,換料塔每層的最小體積。" #: fdmprinter.def.json @@ -4751,12 +3896,8 @@ 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 "" -"空心換料塔的厚度。如果厚度大於換料塔最小體積的一半,則將形成一個密集的換料" -"塔。" +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 "空心換料塔的厚度。如果厚度大於換料塔最小體積的一半,則將形成一個密集的換料塔。" #: fdmprinter.def.json msgctxt "prime_tower_position_x label" @@ -4785,9 +3926,7 @@ msgstr "換料塔流量" #: fdmprinter.def.json msgctxt "prime_tower_flow description" -msgid "" -"Flow compensation: the amount of material extruded is multiplied by this " -"value." +msgid "Flow compensation: the amount of material extruded is multiplied by this value." msgstr "流量補償:擠出的耗材量乘以此值。" #: fdmprinter.def.json @@ -4797,9 +3936,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." +msgid "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower." msgstr "在一個噴頭列印換料塔後,在換料塔上擦拭另一個噴頭滲出的耗材。" #: fdmprinter.def.json @@ -4809,13 +3946,8 @@ 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 "" -"切換擠出機後,在列印的第一個物件上擦拭噴頭上的滲出耗材。這會在滲出耗材對列印" -"品表面品質造成最小損害的位置進行緩慢安全的擦拭動作。" +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 "切換擠出機後,在列印的第一個物件上擦拭噴頭上的滲出耗材。這會在滲出耗材對列印品表面品質造成最小損害的位置進行緩慢安全的擦拭動作。" #: fdmprinter.def.json msgctxt "prime_tower_purge_volume label" @@ -4824,13 +3956,8 @@ msgstr "換料塔清洗量" #: fdmprinter.def.json msgctxt "prime_tower_purge_volume description" -msgid "" -"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." -msgstr "" -"在換料塔上進行擦拭時要清洗的耗材量。清洗可用於補償在噴頭不活動期間由於滲出而" -"損失的耗材。" +msgid "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." +msgstr "在換料塔上進行擦拭時要清洗的耗材量。清洗可用於補償在噴頭不活動期間由於滲出而損失的耗材。" #: fdmprinter.def.json msgctxt "ooze_shield_enabled label" @@ -4839,13 +3966,8 @@ 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 "" -"啟用外部擦拭牆。這將在模型周圍創建一個外殼,如果與第一個噴頭處於相同的高度," -"則可能會擦拭第二個噴頭。" +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 "啟用外部擦拭牆。這將在模型周圍創建一個外殼,如果與第一個噴頭處於相同的高度,則可能會擦拭第二個噴頭。" #: fdmprinter.def.json msgctxt "ooze_shield_angle label" @@ -4854,13 +3976,8 @@ 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 "" -"擦拭牆中的一部分的最大角度。0度為垂直,90度為水平。較小的角度擦拭效果較好,但" -"是要用更多的耗材。" +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 "擦拭牆中的一部分的最大角度。0度為垂直,90度為水平。較小的角度擦拭效果較好,但是要用更多的耗材。" #: fdmprinter.def.json msgctxt "ooze_shield_dist label" @@ -4889,13 +4006,8 @@ 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 "" -"忽略由網格內的重疊體積產生的內部幾何,並將多個部分作為一個列印。這可能會導致" -"意外的內部孔洞消失。" +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 "忽略由網格內的重疊體積產生的內部幾何,並將多個部分作為一個列印。這可能會導致意外的內部孔洞消失。" #: fdmprinter.def.json msgctxt "meshfix_union_all_remove_holes label" @@ -4904,13 +4016,8 @@ 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 "" -"移除每層的孔洞,僅保留外部形狀。這會忽略任何不可見的內部幾何。但是,也會忽略" -"可從上方或下方看到的層孔洞。" +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 "移除每層的孔洞,僅保留外部形狀。這會忽略任何不可見的內部幾何。但是,也會忽略可從上方或下方看到的層孔洞。" #: fdmprinter.def.json msgctxt "meshfix_extensive_stitching label" @@ -4919,13 +4026,8 @@ 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 "" -"廣泛縫合嘗試通過接觸多邊形來閉合孔洞,以此縫合網格中的開孔。此選項可能會產生" -"大量的處理時間。" +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 "廣泛縫合嘗試通過接觸多邊形來閉合孔洞,以此縫合網格中的開孔。此選項可能會產生大量的處理時間。" #: fdmprinter.def.json msgctxt "meshfix_keep_open_polygons label" @@ -4934,31 +4036,8 @@ 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 "" -"一般情况下,Cura 會嘗試縫合網格中的小孔,並移除有大孔的部分層。啟用此選項將保" -"留那些無法縫合的部分。當其他所有方法都無法產生正確的 GCode 時,該選項應該被用" -"作最後手段。" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "最高解析度" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "" -"The minimum size of a line segment after slicing. If you increase this, the " -"mesh will have a lower resolution. This may allow the printer to keep up " -"with the speed it has to process g-code and will increase slice speed by " -"removing details of the mesh that it can't process anyway." -msgstr "" -"切片後線段的最小尺寸。 如果你增加此設定值,網格的解析度將較低。 這允許印表機" -"保持處理 G-code 的速度,並通過移除無法處理的網格細節來增加切片速度。" +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 "一般情况下,Cura 會嘗試縫合網格中的小孔,並移除有大孔的部分層。啟用此選項將保留那些無法縫合的部分。當其他所有方法都無法產生正確的 GCode 時,該選項應該被用作最後手段。" #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4967,9 +4046,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." +msgid "Make meshes which are touching each other overlap a bit. This makes them bond together better." msgstr "使彼此接觸的網格稍微重疊。使他們能更緊密地結合在一起。" #: fdmprinter.def.json @@ -4979,12 +4056,8 @@ 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 "" -"刪除多個網格彼此重疊的區域。如果合併的雙重耗材對象彼此重疊,則可以使用此選" -"項。" +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 "刪除多個網格彼此重疊的區域。如果合併的雙重耗材對象彼此重疊,則可以使用此選項。" #: fdmprinter.def.json msgctxt "alternate_carve_order label" @@ -4993,15 +4066,8 @@ 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 "" -"將網格重疊的部分,交互的在每一層中歸屬到不同的網格,以便重疊的網格交織在一" -"起。關閉此設定將使其中一個網格物體獲得重疊中的所有體積,而從其他網格物體中移" -"除。" +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 "將網格重疊的部分,交互的在每一層中歸屬到不同的網格,以便重疊的網格交織在一起。關閉此設定將使其中一個網格物體獲得重疊中的所有體積,而從其他網格物體中移除。" #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" @@ -5010,13 +4076,8 @@ msgstr "移除空的第一層" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" -msgid "" -"Remove empty layers beneath the first printed layer if they are present. " -"Disabling this setting can cause empty first layers if the Slicing Tolerance " -"setting is set to Exclusive or Middle." -msgstr "" -"如果可列印的第一層下方有空的層,將其移除。假如「切片公差」設定為「排除」或" -"「中間」,關閉此設定可能會導致空的第一層。" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "如果可列印的第一層下方有空的層,將其移除。假如「切片公差」設定為「排除」或「中間」,關閉此設定可能會導致空的第一層。" #: fdmprinter.def.json msgctxt "blackmagic label" @@ -5035,16 +4096,8 @@ 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 "" -"選擇一次列印一層中的所有模型或等待一個模型完成後再轉到下一個模型。排隊模式只" -"有在所有模型以一種整個列印頭可以在各個模型之間移動的方式分隔開,且所有模型都" -"低於噴頭和 X / Y 軸之間距離的情况下可用。" +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 "選擇一次列印一層中的所有模型或等待一個模型完成後再轉到下一個模型。排隊模式只有在所有模型以一種整個列印頭可以在各個模型之間移動的方式分隔開,且所有模型都低於噴頭和 X / Y 軸之間距離的情况下可用。" #: fdmprinter.def.json msgctxt "print_sequence option all_at_once" @@ -5063,13 +4116,8 @@ 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 "" -"使用此網格修改與其重疊的其他網格的填充。利用此網格的區域替換其他網格的填充區" -"域。建議僅為此網格列印一個壁,而不列印頂部/底部表層。" +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 "使用此網格修改與其重疊的其他網格的填充。利用此網格的區域替換其他網格的填充區域。建議僅為此網格列印一個壁,而不列印頂部/底部表層。" #: fdmprinter.def.json msgctxt "infill_mesh_order label" @@ -5078,13 +4126,8 @@ 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 "" -"確定哪個填充網格在另一個填充網格的填充內。順序較高的填充網格將修改順序較低的" -"填充網格以及普通網格的填充。" +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 "確定哪個填充網格在另一個填充網格的填充內。順序較高的填充網格將修改順序較低的填充網格以及普通網格的填充。" #: fdmprinter.def.json msgctxt "cutting_mesh label" @@ -5093,13 +4136,8 @@ 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 "" -"將此網格的體積限制在其他網格內。你可以使用它來制作採用不同的設定以及完全不同" -"的擠出機的網格列印的特定區域。" +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 "將此網格的體積限制在其他網格內。你可以使用它來制作採用不同的設定以及完全不同的擠出機的網格列印的特定區域。" #: fdmprinter.def.json msgctxt "mold_enabled label" @@ -5108,9 +4146,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." +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 "將模型作為模具列印,可進行鑄造,以便獲取與列印平台上的模型類似的模型。" #: fdmprinter.def.json @@ -5120,9 +4156,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." +msgid "The minimal distance between the ouside of the mold and the outside of the model." msgstr "模具外側和模型外側之間的最小距離。" #: fdmprinter.def.json @@ -5142,13 +4176,8 @@ 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 "" -"為模具創建的外壁的懸垂角度。0° 將使模具的外殼垂直,而 90° 將使模型的外部遵循" -"模型的輪廓。" +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 "為模具創建的外壁的懸垂角度。0° 將使模具的外殼垂直,而 90° 將使模型的外部遵循模型的輪廓。" #: fdmprinter.def.json msgctxt "support_mesh label" @@ -5157,23 +4186,9 @@ msgstr "支撐網格" #: fdmprinter.def.json msgctxt "support_mesh description" -msgid "" -"Use this mesh to specify support areas. This can be used to generate support " -"structure." +msgid "Use this mesh to specify support areas. This can be used to generate support structure." msgstr "使用此網格指定支撐區域。可用於產生支撐結構。" -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -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 "在支撐網格下方的所有位置進行支撐,讓支撐網格中没有懸垂。" - #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" @@ -5181,12 +4196,8 @@ 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 "" -"使用此網格指定模型的任何部分不應被檢測為懸垂的區域。可用於移除不需要的支撐結" -"構。" +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 "使用此網格指定模型的任何部分不應被檢測為懸垂的區域。可用於移除不需要的支撐結構。" #: fdmprinter.def.json msgctxt "magic_mesh_surface_mode label" @@ -5195,16 +4206,8 @@ 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 "" -"將模型作為僅表面、一個空間或多個具有鬆散表面的空間處理。“正常”僅列印封閉的空" -"間。“表面”列印模型表面的單壁,没有填充,也没有頂部/底部表層。“兩者”將封閉空間" -"正常列印,並將任何剩餘多邊形作為表面列印。" +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 "將模型作為僅表面、一個空間或多個具有鬆散表面的空間處理。“正常”僅列印封閉的空間。“表面”列印模型表面的單壁,没有填充,也没有頂部/底部表層。“兩者”將封閉空間正常列印,並將任何剩餘多邊形作為表面列印。" #: fdmprinter.def.json msgctxt "magic_mesh_surface_mode option normal" @@ -5228,15 +4231,8 @@ 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 "" -"螺旋列印實現外部邊緣的平滑 Z 移動。這會在整個列印上改成 Z 軸穩定增動。該功能" -"會將一個實心模型轉變為具有實體底部的單壁列印。只有在當每一層只包含一個封閉面" -"時才應啟用此功能。" +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 "螺旋列印實現外部邊緣的平滑 Z 移動。這會在整個列印上改成 Z 軸穩定增動。該功能會將一個實心模型轉變為具有實體底部的單壁列印。只有在當每一層只包含一個封閉面時才應啟用此功能。" #: fdmprinter.def.json msgctxt "smooth_spiralized_contours label" @@ -5245,13 +4241,8 @@ 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 "" -"平滑螺旋輪廓可以減少 Z 縫的出現(Z 縫應在列印品上幾乎看不到,但在分層檢視中仍" -"然可見)。請注意,平滑操作將傾向於模糊精細的表面細節。" +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 "平滑螺旋輪廓可以減少 Z 縫的出現(Z 縫應在列印品上幾乎看不到,但在分層檢視中仍然可見)。請注意,平滑操作將傾向於模糊精細的表面細節。" #: fdmprinter.def.json msgctxt "relative_extrusion label" @@ -5260,18 +4251,8 @@ msgstr "相對模式擠出" #: fdmprinter.def.json msgctxt "relative_extrusion description" -msgid "" -"Use relative extrusion rather than absolute extrusion. Using relative E-" -"steps makes for easier post-processing of the Gcode. However, it's not " -"supported by all printers and it may produce very slight deviations in the " -"amount of deposited material compared to absolute E-steps. Irrespective of " -"this setting, the extrusion mode will always be set to absolute before any " -"Gcode script is output." -msgstr "" -"擠出控制使用相對模式而非絕對模式。使用相對的 E 步數使 G-code 在後處理上更為簡" -"便。然而並非所有印表機都支援此模式,而且和絕對的 E 步數相比,它可能在沉積耗材" -"的使用量上產生輕微的偏差。無論此設定為何,在輸出任何 G-code 腳本之前,擠出模" -"式將始終設定為絕對模式。" +msgid "Use relative extrusion rather than absolute extrusion. Using relative E-steps makes for easier post-processing of the Gcode. However, it's not supported by all printers and it may produce very slight deviations in the amount of deposited material compared to absolute E-steps. Irrespective of this setting, the extrusion mode will always be set to absolute before any Gcode script is output." +msgstr "擠出控制使用相對模式而非絕對模式。使用相對的 E 步數使 G-code 在後處理上更為簡便。然而並非所有印表機都支援此模式,而且和絕對的 E 步數相比,它可能在沉積耗材的使用量上產生輕微的偏差。無論此設定為何,在輸出任何 G-code 腳本之前,擠出模式將始終設定為絕對模式。" #: fdmprinter.def.json msgctxt "experimental label" @@ -5284,20 +4265,194 @@ msgid "experimental!" msgstr "實驗性!" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "最佳化牆壁列印順序" +msgctxt "support_tree_enable label" +msgid "Tree Support" +msgstr "" #: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "" -"Optimize the order in which walls are printed so as to reduce the number of " -"retractions and the distance travelled. Most parts will benefit from this " -"being enabled but some may actually take longer so please compare the print " -"time estimates with and without optimization." +msgctxt "support_tree_enable description" +msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." msgstr "" -"最佳化牆壁列印順序以減少回抽的次數和空跑的距離。啟用此功能對大多數是有益的," -"但有的可能會花更多的時間。所以請比較有無最佳化的估算時間進行確認。" + +#: fdmprinter.def.json +msgctxt "support_tree_angle label" +msgid "Tree Support Branch Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_angle description" +msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance label" +msgid "Tree Support Branch Distance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_distance description" +msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter label" +msgid "Tree Support Branch Diameter" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter description" +msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle label" +msgid "Tree Support Branch Diameter Angle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_branch_diameter_angle description" +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution label" +msgid "Tree Support Collision Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_collision_resolution description" +msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness label" +msgid "Tree Support Wall Thickness" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_thickness description" +msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count label" +msgid "Tree Support Wall Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_tree_wall_count description" +msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "切片公差" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "如何使用傾斜的外表切片。可以使用層高的中間與外表相交產生的截面(中間)。也可以使用該層高完全不超出模型體積的區域(排除),或是該層高的模型投影區域(包含)。「排除」保留最多的細節,「包含」有最符合的外形,而「中間」花最少的運算時間。" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "中間" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "排除" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "包含" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "頂部表層線寬" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "列印頂部區域單一線寬。" + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "頂部表層列印樣式" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "最頂部列印樣式。" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "線條" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "頂部表層線條方向" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "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)." +msgstr "當頂部表層採用線條或鋸齒狀的列印樣式時使用的整數線條方向的列表。列表中的元素隨層的進度依次使用,當達到列表末尾時,它將從頭開始。列表項以逗號分隔,整個列表包含在方括號中。預設使用傳統的預設角度(45 和 135 度)。" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization label" +msgid "Infill Travel Optimization" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_enable_travel_optimization description" +msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +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 "根據每一層的平均流速自動更改每層的溫度。" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "流量溫度圖" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "Data linking material flow (in mm3 per second) to temperature (degrees Celsius)." +msgstr "數據連接耗材流量(mm3/s)到溫度(攝氏)。" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "最高解析度" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "切片後線段的最小尺寸。 如果你增加此設定值,網格的解析度將較低。 這允許印表機保持處理 G-code 的速度,並通過移除無法處理的網格細節來增加切片速度。" #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -5306,11 +4461,8 @@ msgstr "將支撐拆成塊狀" #: fdmprinter.def.json msgctxt "support_skip_some_zags description" -msgid "" -"Skip some support line connections to make the support structure easier to " -"break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "" -"省略支撐的部分連接線,讓支撐結構更容易拆除。此設定適用於鋸齒狀的支撐樣式。" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "省略支撐的部分連接線,讓支撐結構更容易拆除。此設定適用於鋸齒狀的支撐樣式。" #: fdmprinter.def.json msgctxt "support_skip_zag_per_mm label" @@ -5319,9 +4471,7 @@ msgstr "支撐塊大小" #: fdmprinter.def.json msgctxt "support_skip_zag_per_mm description" -msgid "" -"Leave out a connection between support lines once every N millimeter to make " -"the support structure easier to break away." +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." msgstr "每隔 N 毫米省略一次連接線,讓支撐結構更容易拆除。" #: fdmprinter.def.json @@ -5331,9 +4481,7 @@ msgstr "支撐塊線條數" #: fdmprinter.def.json msgctxt "support_zag_skip_count description" -msgid "" -"Skip one in every N connection lines to make the support structure easier to " -"break away." +msgid "Skip one in every N connection lines to make the support structure easier to break away." msgstr "每隔 N 個連接線省略一次,讓支撐結構更容易拆除。" #: fdmprinter.def.json @@ -5343,12 +4491,8 @@ 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 "" -"這將在模型周圍建立一個牆壁留住(熱)空氣並遮住外部氣流。對於容易翹曲的耗材非" -"常有用。" +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 "這將在模型周圍建立一個牆壁留住(熱)空氣並遮住外部氣流。對於容易翹曲的耗材非常有用。" #: fdmprinter.def.json msgctxt "draft_shield_dist label" @@ -5367,9 +4511,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." +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 "設定防風罩的高度。選擇防風罩與模型同高或只列印到限制的高度。" #: fdmprinter.def.json @@ -5389,9 +4531,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." +msgid "Height limitation of the draft shield. Above this height no draft shield will be printed." msgstr "防風罩的高度限制。超過這個高度就不再列印防風罩。" #: fdmprinter.def.json @@ -5401,13 +4541,8 @@ 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 "" -"更改列印模型的幾何形狀,以最大程度減少需要的支撐。陡峭的懸垂物將變淺。懸垂區" -"域將下降變得更垂直。" +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 "更改列印模型的幾何形狀,以最大程度減少需要的支撐。陡峭的懸垂物將變淺。懸垂區域將下降變得更垂直。" #: fdmprinter.def.json msgctxt "conical_overhang_angle label" @@ -5416,13 +4551,8 @@ 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 "" -"在懸垂變得可列印後懸垂的最大角度。當該值為 0° 時,所有懸垂將被與列印平台連接" -"的模型的一個部分替代,如果為 90° 時,不會以任何方式更改模型。" +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 "在懸垂變得可列印後懸垂的最大角度。當該值為 0° 時,所有懸垂將被與列印平台連接的模型的一個部分替代,如果為 90° 時,不會以任何方式更改模型。" #: fdmprinter.def.json msgctxt "coasting_enable label" @@ -5431,13 +4561,8 @@ 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 "" -"滑行會用一個空跑路徑替代擠出路徑的最後部分。滲出耗材用於列印擠出路徑的最後部" -"分,以便減少牽絲。" +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 "滑行會用一個空跑路徑替代擠出路徑的最後部分。滲出耗材用於列印擠出路徑的最後部分,以便減少牽絲。" #: fdmprinter.def.json msgctxt "coasting_volume label" @@ -5446,9 +4571,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." +msgid "The volume otherwise oozed. This value should generally be close to the nozzle diameter cubed." msgstr "不進行滑行時,會滲出的體積。該值一般應接近噴頭直徑的立方。" #: fdmprinter.def.json @@ -5458,14 +4581,8 @@ 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 "" -"可以進行滑行前,擠出路徑應有的最小體積。對於較小的擠出路徑,喉管內累積的壓力" -"較少,因此滑行體積採用線性比率縮小。該值應大於滑行體積。" +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 "可以進行滑行前,擠出路徑應有的最小體積。對於較小的擠出路徑,喉管內累積的壓力較少,因此滑行體積採用線性比率縮小。該值應大於滑行體積。" #: fdmprinter.def.json msgctxt "coasting_speed label" @@ -5474,13 +4591,8 @@ 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 "" -"滑行期間相對於擠出路徑的移動速度。建議採用略低於 100% 的值,因為在滑行移動期" -"間喉管中的壓力會下降。" +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 "滑行期間相對於擠出路徑的移動速度。建議採用略低於 100% 的值,因為在滑行移動期間喉管中的壓力會下降。" #: fdmprinter.def.json msgctxt "skin_alternate_rotation label" @@ -5489,13 +4601,8 @@ 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 "" -"交替列印頂部/底部層的方向。通常它們只進行對角線列印。此設定添加純 X 和純 Y 方" -"向。" +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 "交替列印頂部/底部層的方向。通常它們只進行對角線列印。此設定添加純 X 和純 Y 方向。" #: fdmprinter.def.json msgctxt "cross_infill_pocket_size label" @@ -5504,9 +4611,7 @@ msgstr "立體十字形氣囊大小" #: fdmprinter.def.json msgctxt "cross_infill_pocket_size description" -msgid "" -"The size of pockets at four-way crossings in the cross 3D pattern at heights " -"where the pattern is touching itself." +msgid "The size of pockets at four-way crossings in the cross 3D pattern at heights where the pattern is touching itself." msgstr "立體十字形在樣式閉合的高度處,中央十字交叉的氣囊大小。" #: fdmprinter.def.json @@ -5516,13 +4621,8 @@ msgstr "交錯立體十字形氣囊" #: fdmprinter.def.json msgctxt "cross_infill_apply_pockets_alternatingly description" -msgid "" -"Only apply pockets at half of the four-way crossings in the cross 3D pattern " -"and alternate the location of the pockets between heights where the pattern " -"is touching itself." -msgstr "" -"在立體十字形樣式中,只在半數樣式閉合的中央十字交叉處使用氣囊,並在高度上交錯" -"排列。" +msgid "Only apply pockets at half of the four-way crossings in the cross 3D pattern and alternate the location of the pockets between heights where the pattern is touching itself." +msgstr "在立體十字形樣式中,只在半數樣式閉合的中央十字交叉處使用氣囊,並在高度上交錯排列。" #: fdmprinter.def.json msgctxt "spaghetti_infill_enabled label" @@ -5531,13 +4631,8 @@ 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 "" -"經常列印填充,使得耗材在模型內部混亂地捲曲。這會縮短列印時間,但行為會難以預" -"測。" +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 "經常列印填充,使得耗材在模型內部混亂地捲曲。這會縮短列印時間,但行為會難以預測。" #: fdmprinter.def.json msgctxt "spaghetti_infill_stepped label" @@ -5546,9 +4641,7 @@ msgstr "義大利麵式逐步填充" #: fdmprinter.def.json msgctxt "spaghetti_infill_stepped description" -msgid "" -"Whether to print spaghetti infill in steps or extrude all the infill " -"filament at the end of the print." +msgid "Whether to print spaghetti infill in steps or extrude all the infill filament at the end of the print." msgstr "是否逐步列印義大利麵式填充或在列印結束時一次擠出所有填充耗材。" #: fdmprinter.def.json @@ -5558,13 +4651,8 @@ 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 "" -"允許延後填充義大利麵式填充的最大角度,取列印物內側與 Z 軸的夾角。降低此值會導" -"致模型中的更多有角度部位在各層填充。" +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 "允許延後填充義大利麵式填充的最大角度,取列印物內側與 Z 軸的夾角。降低此值會導致模型中的更多有角度部位在各層填充。" #: fdmprinter.def.json msgctxt "spaghetti_max_height label" @@ -5573,9 +4661,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." +msgid "The maximum height of inside space which can be combined and filled from the top." msgstr "可以從頂部組合和填充的內部空間的最大高度。" #: fdmprinter.def.json @@ -5585,8 +4671,7 @@ msgstr "義大利麵式填充內嵌" #: fdmprinter.def.json msgctxt "spaghetti_inset description" -msgid "" -"The offset from the walls from where the spaghetti infill will be printed." +msgid "The offset from the walls from where the spaghetti infill will be printed." msgstr "列印義大利麵式填充開始位置與牆壁的偏移量。" #: fdmprinter.def.json @@ -5596,13 +4681,8 @@ 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 "" -"調整義大利麵式填充的密度。注意,填充密度僅控制填充列印樣式的線條間距,而不是" -"義大利麵式填充的擠出量。" +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 "調整義大利麵式填充的密度。注意,填充密度僅控制填充列印樣式的線條間距,而不是義大利麵式填充的擠出量。" #: fdmprinter.def.json msgctxt "spaghetti_infill_extra_volume label" @@ -5611,9 +4691,7 @@ msgstr "義大利麵式填充額外體積" #: fdmprinter.def.json msgctxt "spaghetti_infill_extra_volume description" -msgid "" -"A correction term to adjust the total volume being extruded each time when " -"filling spaghetti." +msgid "A correction term to adjust the total volume being extruded each time when filling spaghetti." msgstr "一個用於調整每次進行義大利麵式填充時擠出總量的修正項。" #: fdmprinter.def.json @@ -5623,9 +4701,7 @@ msgstr "啟用錐形支撐" #: fdmprinter.def.json msgctxt "support_conical_enabled description" -msgid "" -"Experimental feature: Make support areas smaller at the bottom than at the " -"overhang." +msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang." msgstr "實驗性功能: 讓底部的支撐區域小於懸垂處的支撐區域。" #: fdmprinter.def.json @@ -5635,14 +4711,8 @@ 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 "" -"錐形支撐的傾斜角度。角度 0 度時為垂直,角度 90 度時為水平。較小的角度會讓支撐" -"更為牢固,但需要更多耗材。負值會讓支撐底座比頂部寬。" +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 "錐形支撐的傾斜角度。角度 0 度時為垂直,角度 90 度時為水平。較小的角度會讓支撐更為牢固,但需要更多耗材。負值會讓支撐底座比頂部寬。" #: fdmprinter.def.json msgctxt "support_conical_min_width label" @@ -5651,9 +4721,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." +msgid "Minimum width to which the base of the conical support area is reduced. Small widths can lead to unstable support structures." msgstr "錐形支撐區域底部的最小寬度。寬度較小可能導致不穩定的支撐結構。" #: fdmprinter.def.json @@ -5663,8 +4731,7 @@ msgstr "挖空模型" #: fdmprinter.def.json msgctxt "infill_hollow description" -msgid "" -"Remove all infill and make the inside of the object eligible for support." +msgid "Remove all infill and make the inside of the object eligible for support." msgstr "移除所有填充並讓模型內部可以進行支撐。" #: fdmprinter.def.json @@ -5674,9 +4741,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." +msgid "Randomly jitter while printing the outer wall, so that the surface has a rough and fuzzy look." msgstr "在列印外牆時隨機抖動,使表面具有粗糙和模糊的外觀。" #: fdmprinter.def.json @@ -5686,9 +4751,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." +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 "進行抖動的寬度。建議讓此值低於外壁寬度,因為內壁不會更改。" #: fdmprinter.def.json @@ -5698,13 +4761,8 @@ 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 "" -"在每一層中,每個多邊形上改變的點的平均密度。注意,多邊形的原始點會被捨棄,因" -"此低密度導致解析度降低。" +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 "在每一層中,每個多邊形上改變的點的平均密度。注意,多邊形的原始點會被捨棄,因此低密度導致解析度降低。" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_dist label" @@ -5713,14 +4771,8 @@ 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 "" -"在每個線條部分改變的隨機點之間的平均距離。注意,多邊形的原始點會被捨棄,因此" -"高平滑度導致解析度降低。該值必須大於絨毛皮膚厚度的一半。" +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 "在每個線條部分改變的隨機點之間的平均距離。注意,多邊形的原始點會被捨棄,因此高平滑度導致解析度降低。該值必須大於絨毛皮膚厚度的一半。" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" @@ -5749,14 +4801,8 @@ msgstr "鐵絲網列印(以下簡稱 WP)" #: 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 "" -"只列印一個具有稀疏網狀結構的外表面,在“稀疏的空中”列印。這是在给定的 Z 軸間隔" -"內,通過上行線和下行斜線連接,橫向列印模型的輪廓來實現的。" +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 "只列印一個具有稀疏網狀結構的外表面,在“稀疏的空中”列印。這是在给定的 Z 軸間隔內,通過上行線和下行斜線連接,橫向列印模型的輪廓來實現的。" #: fdmprinter.def.json msgctxt "wireframe_height label" @@ -5765,13 +4811,8 @@ msgstr "WP 連接高度" #: 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 "" -"兩個水平部分之間上行線和下行斜線的高度。這决定網狀結構的整體密度。僅套用於鐵" -"絲網列印。" +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 "兩個水平部分之間上行線和下行斜線的高度。這决定網狀結構的整體密度。僅套用於鐵絲網列印。" #: fdmprinter.def.json msgctxt "wireframe_roof_inset label" @@ -5780,9 +4821,7 @@ msgstr "WP 頂板嵌入距離" #: 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." +msgid "The distance covered when making a connection from a roof outline inward. Only applies to Wire Printing." msgstr "在從頂板輪廓向內進行連接時所覆蓋的距離。僅套用於鐵絲網列印。" #: fdmprinter.def.json @@ -5792,9 +4831,7 @@ msgstr "WP 速度" #: fdmprinter.def.json msgctxt "wireframe_printspeed description" -msgid "" -"Speed at which the nozzle moves when extruding material. Only applies to " -"Wire Printing." +msgid "Speed at which the nozzle moves when extruding material. Only applies to Wire Printing." msgstr "擠出耗材時噴頭移動的速度。僅套用於鐵絲網列印。" #: fdmprinter.def.json @@ -5804,9 +4841,7 @@ msgstr "WP 底部列印速度" #: 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." +msgid "Speed of printing the first layer, which is the only layer touching the build platform. Only applies to Wire Printing." msgstr "列印第一層的速度,該層是唯一接觸列印平台的層。僅套用於鐵絲網列印。" #: fdmprinter.def.json @@ -5816,8 +4851,7 @@ msgstr "WP 上升列印速度" #: fdmprinter.def.json msgctxt "wireframe_printspeed_up description" -msgid "" -"Speed of printing a line upward 'in thin air'. Only applies to Wire Printing." +msgid "Speed of printing a line upward 'in thin air'. Only applies to Wire Printing." msgstr "在“稀疏的空中”向上列印線條的速度。僅套用於鐵絲網列印。" #: fdmprinter.def.json @@ -5827,8 +4861,7 @@ msgstr "WP 下降列印速度" #: fdmprinter.def.json msgctxt "wireframe_printspeed_down description" -msgid "" -"Speed of printing a line diagonally downward. Only applies to Wire Printing." +msgid "Speed of printing a line diagonally downward. Only applies to Wire Printing." msgstr "列印下行斜線的速度。僅套用於鐵絲網列印。" #: fdmprinter.def.json @@ -5838,9 +4871,7 @@ msgstr "WP 水平列印速度" #: fdmprinter.def.json msgctxt "wireframe_printspeed_flat description" -msgid "" -"Speed of printing the horizontal contours of the model. Only applies to Wire " -"Printing." +msgid "Speed of printing the horizontal contours of the model. Only applies to Wire Printing." msgstr "列印模型水平輪廓的速度。僅套用於鐵絲網列印。" #: fdmprinter.def.json @@ -5850,9 +4881,7 @@ msgstr "WP 列印流量" #: 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." +msgid "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing." msgstr "流量補償:擠出的耗材量乘以此值。僅套用於鐵絲網列印。" #: fdmprinter.def.json @@ -5872,8 +4901,7 @@ msgstr "WP 平面流量" #: fdmprinter.def.json msgctxt "wireframe_flow_flat description" -msgid "" -"Flow compensation when printing flat lines. Only applies to Wire Printing." +msgid "Flow compensation when printing flat lines. Only applies to Wire Printing." msgstr "列印平面線條時的流量補償。僅套用於鐵絲網列印。" #: fdmprinter.def.json @@ -5883,9 +4911,7 @@ msgstr "WP 頂部延遲" #: 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." +msgid "Delay time after an upward move, so that the upward line can harden. Only applies to Wire Printing." msgstr "向上移動後的延遲時間,以便上行線條硬化。僅套用於鐵絲網列印。" #: fdmprinter.def.json @@ -5905,13 +4931,8 @@ msgstr "WP 平面延遲" #: 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 "" -"兩個水平部分之間的延遲時間。引入這樣的延遲可以在連接點處與先前的層產生更好的" -"附著,而太長的延遲會引起下垂。僅套用於鐵絲網列印。" +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 "兩個水平部分之間的延遲時間。引入這樣的延遲可以在連接點處與先前的層產生更好的附著,而太長的延遲會引起下垂。僅套用於鐵絲網列印。" #: fdmprinter.def.json msgctxt "wireframe_up_half_speed label" @@ -5922,12 +4943,10 @@ msgstr "WP 輕鬆上行" 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." +"This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." msgstr "" "以半速擠出的上行移動的距離。\n" -"這會與之前的層產生更好的附著,而不會將這些層中的耗材過度加熱。僅套用於鐵絲網" -"列印。" +"這會與之前的層產生更好的附著,而不會將這些層中的耗材過度加熱。僅套用於鐵絲網列印。" #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5936,13 +4955,8 @@ msgstr "WP 紐結大小" #: 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 "" -"在上行線條的頂部創建一個小紐結,使連續的水平層有更好的機會與其連接。僅套用於" -"鐵絲網列印。" +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 "在上行線條的頂部創建一個小紐結,使連續的水平層有更好的機會與其連接。僅套用於鐵絲網列印。" #: fdmprinter.def.json msgctxt "wireframe_fall_down label" @@ -5951,9 +4965,7 @@ msgstr "WP 倒塌" #: 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." +msgid "Distance with which the material falls down after an upward extrusion. This distance is compensated for. Only applies to Wire Printing." msgstr "耗材在向上擠出後倒塌的距離。將對此距離進行補償。僅套用於鐵絲網列印。" #: fdmprinter.def.json @@ -5963,13 +4975,8 @@ msgstr "WP 拖行" #: 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 "" -"向上擠出耗材與斜向下擠出一起拖動的距離。將對此距離進行補償。僅套用於鐵絲網列" -"印。" +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 "向上擠出耗材與斜向下擠出一起拖動的距離。將對此距離進行補償。僅套用於鐵絲網列印。" #: fdmprinter.def.json msgctxt "wireframe_strategy label" @@ -5978,19 +4985,8 @@ msgstr "WP 使用策略" #: 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 "" -"用於確定兩個連續層在每個連接點連接的策略。回抽可讓上行線條在正確的位置硬化," -"但可能導致耗材磨損。紐結可以在上行線條的尾端進行打結以便提高與其連接的幾率," -"並讓線條冷卻;但這會需要較慢的列印速度。另一種策略是補償上行線條頂部的下垂;" -"然而,線條不會總是如預期的那樣下降。" +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 "用於確定兩個連續層在每個連接點連接的策略。回抽可讓上行線條在正確的位置硬化,但可能導致耗材磨損。紐結可以在上行線條的尾端進行打結以便提高與其連接的幾率,並讓線條冷卻;但這會需要較慢的列印速度。另一種策略是補償上行線條頂部的下垂;然而,線條不會總是如預期的那樣下降。" #: fdmprinter.def.json msgctxt "wireframe_strategy option compensate" @@ -6014,13 +5010,8 @@ msgstr "WP 拉直下行線條" #: 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 "" -"水平線條部分所覆蓋的斜下行線條的百分比。這可以防止上行線最頂端點下垂。僅套用" -"於鐵絲網列印。" +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 "水平線條部分所覆蓋的斜下行線條的百分比。這可以防止上行線最頂端點下垂。僅套用於鐵絲網列印。" #: fdmprinter.def.json msgctxt "wireframe_roof_fall_down label" @@ -6029,13 +5020,8 @@ msgstr "WP 頂板倒塌" #: 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 "" -"列印時,在“稀疏的空中”列印的水平頂板線條倒塌的距離。將對此距離進行補償。僅套" -"用於鐵絲網列印。" +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 "列印時,在“稀疏的空中”列印的水平頂板線條倒塌的距離。將對此距離進行補償。僅套用於鐵絲網列印。" #: fdmprinter.def.json msgctxt "wireframe_roof_drag_along label" @@ -6044,13 +5030,8 @@ msgstr "WP 頂板拖行" #: 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 "" -"向內線的末端在返回至頂板外部輪廓時被拖行的距離。將對此距離進行補償。僅套用於" -"鐵絲網列印。" +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 "向內線的末端在返回至頂板外部輪廓時被拖行的距離。將對此距離進行補償。僅套用於鐵絲網列印。" #: fdmprinter.def.json msgctxt "wireframe_roof_outer_delay label" @@ -6059,12 +5040,8 @@ msgstr "WP 頂板外部延遲" #: 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 "" -"在成為頂板的孔的外圍花費的時間。較長的時間可確保更好的連接。僅套用於鐵絲網列" -"印。" +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 "在成為頂板的孔的外圍花費的時間。較長的時間可確保更好的連接。僅套用於鐵絲網列印。" #: fdmprinter.def.json msgctxt "wireframe_nozzle_clearance label" @@ -6073,14 +5050,48 @@ msgstr "WP 噴頭間隙" #: 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." +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 "噴頭和水平下行線之間的距離。較大的間隙會讓斜下行線角度較平緩,進而使第二層的上行連接較少。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled label" +msgid "Use adaptive layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_enabled description" +msgid "Adaptive layers computes the layer heights depending on the shape of the model." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation label" +msgid "Adaptive layers maximum variation" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation description" +msgid "The maximum allowed height different from the base layer height in mm." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step label" +msgid "Adaptive layers variation step size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_variation_step description" +msgid "The difference in height of the next layer height compared to the previous one." +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold label" +msgid "Adaptive layers threshold" +msgstr "" + +#: fdmprinter.def.json +msgctxt "adaptive_layer_height_threshold description" +msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." msgstr "" -"噴頭和水平下行線之間的距離。較大的間隙會讓斜下行線角度較平緩,進而使第二層的" -"上行連接較少。僅套用於鐵絲網列印。" #: fdmprinter.def.json msgctxt "command_line_settings label" @@ -6089,9 +5100,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." +msgid "Settings which are only used if CuraEngine isn't called from the Cura frontend." msgstr "未從 Cura 前端調用 CuraEngine 時使用的設定。" #: fdmprinter.def.json @@ -6101,9 +5110,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." +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 "是否將模型放置在列印平台中心 (0,0),而不是使用模型內儲存的座標系統。" #: fdmprinter.def.json @@ -6133,12 +5140,8 @@ msgstr "網格位置 z" #: 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 "" -"套用在模型 z 方向上的偏移量。利用此選項,你可以執行過去被稱為“模型沉降”的操" -"作。" +msgid "Offset applied to the object in the z direction. With this you can perform what was used to be called 'Object Sink'." +msgstr "套用在模型 z 方向上的偏移量。利用此選項,你可以執行過去被稱為“模型沉降”的操作。" #: fdmprinter.def.json msgctxt "mesh_rotation_matrix label" @@ -6147,31 +5150,40 @@ msgstr "網格旋轉矩陣" #: fdmprinter.def.json msgctxt "mesh_rotation_matrix description" -msgid "" -"Transformation matrix to be applied to the model when loading it from file." +msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "在將模型從檔案中載入時套用在模型上的轉換矩陣。" +#~ msgctxt "infill_offset_x description" +#~ msgid "The infill pattern is offset this distance along the X axis." +#~ msgstr "填充樣式在 X 軸方向偏移此距離。" + +#~ msgctxt "infill_offset_y description" +#~ msgid "The infill pattern is offset this distance along the Y axis." +#~ msgstr "填充樣式在 Y 軸方向偏移此距離。" + +#~ 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 "填充和牆壁之間的重疊量。稍微重疊可讓各個牆壁與填充牢固連接。" + +#~ msgctxt "skin_overlap description" +#~ msgid "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." +#~ msgstr "表層和牆壁之間的重疊量,以線寬百分比表示。稍微重疊可讓各個牆壁與表層牢固連接。這是表層平均線寬和最內壁的百分比。" + +#~ 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 "用於加熱列印平台的溫度。如果列印平台溫度為 0,則熱床將不會為此次列印加熱。" + #~ msgctxt "z_offset_layer_0 description" -#~ msgid "" -#~ "The extruder is offset from the normal height of the first layer by this " -#~ "amount. It can be positive (raised) or negative (lowered). Some filament " -#~ "types adhere to the build plate better if the extruder is raised slightly." -#~ msgstr "" -#~ "擠出機在第一層從正常高度偏移了此設定量。它可以是正值(上升)或負值(下" -#~ "降)。某些耗材類型在擠出機稍微上升情況下,會更好地附著在列印平台上。" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "擠出機在第一層從正常高度偏移了此設定量。它可以是正值(上升)或負值(下降)。某些耗材類型在擠出機稍微上升情況下,會更好地附著在列印平台上。" #~ msgctxt "z_offset_taper_layers label" #~ msgid "Z Offset Taper Layers" #~ msgstr "Z 軸偏移漸減層數" #~ msgctxt "z_offset_taper_layers description" -#~ msgid "" -#~ "When non-zero, the Z offset is reduced to 0 over that many layers. A " -#~ "value of 0 means that the Z offset remains constant for all the layers in " -#~ "the print." -#~ msgstr "" -#~ "當此值不為 0 時,Z 軸偏移量在經過此層數時逐漸降為 0。此值設為 0 表示所有列" -#~ "印層的 Z 軸偏移量保持為固定值。" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "當此值不為 0 時,Z 軸偏移量在經過此層數時逐漸降為 0。此值設為 0 表示所有列印層的 Z 軸偏移量保持為固定值。" #~ msgctxt "infill_pattern option tetrahedral" #~ msgid "Tetrahedral" @@ -6182,25 +5194,15 @@ msgstr "在將模型從檔案中載入時套用在模型上的轉換矩陣。" #~ msgstr "將表層延伸到填充中" #~ 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 "" -#~ "延伸平面頂部和/或底部表層的區域。預設情况下,表層會在環繞填充的壁線下方停" -#~ "止,但如果填充密度較低,則可能導致出現孔洞。該設定將表層延展到壁線以外,因" -#~ "此下一層的填充會座落在表層上。" +#~ 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 "延伸平面頂部和/或底部表層的區域。預設情况下,表層會在環繞填充的壁線下方停止,但如果填充密度較低,則可能導致出現孔洞。該設定將表層延展到壁線以外,因此下一層的填充會座落在表層上。" #~ msgctxt "expand_upper_skins label" #~ msgid "Expand Top Skins Into Infill" #~ msgstr "將頂部表層延伸到填充中" #~ msgctxt "expand_upper_skins description" -#~ msgid "" -#~ "Expand the top skin areas (areas with air above) so that they support " -#~ "infill above." +#~ msgid "Expand the top skin areas (areas with air above) so that they support infill above." #~ msgstr "延伸頂部表層區域(上方有空氣的區域),讓它們支撐上方的填充。" #~ msgctxt "expand_lower_skins label" @@ -6208,9 +5210,7 @@ msgstr "在將模型從檔案中載入時套用在模型上的轉換矩陣。" #~ msgstr "將底部表層延伸到填充中" #~ 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." +#~ msgid "Expand the bottom skin areas (areas with air below) so that they are anchored by the infill layers above and below." #~ msgstr "延伸底部表層區域(下方有空氣的區域),讓它們由上下的填充層錨定。" #~ msgctxt "support_skip_some_zags label" From 63ac8412e639e0fc6c959f076678c90fab527e0c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 29 Jan 2018 11:17:27 +0100 Subject: [PATCH 444/551] Fix importing legacy INI quality profiles CURA-4876 --- plugins/LegacyProfileReader/LegacyProfileReader.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 07cd8b0aad..73a305a0f5 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -125,7 +125,10 @@ class LegacyProfileReader(ProfileReader): Logger.log("e", "Dictionary of Doom has no translation. Is it the correct JSON file?") return None current_printer_definition = global_container_stack.definition - profile.setDefinition(current_printer_definition.getId()) + quality_definition = current_printer_definition.getMetaDataEntry("quality_definition") + if not quality_definition: + quality_definition = current_printer_definition.getId() + profile.setDefinition(quality_definition) for new_setting in dict_of_doom["translation"]: # Evaluate all new settings that would get a value from the translations. old_setting_expression = dict_of_doom["translation"][new_setting] compiled = compile(old_setting_expression, new_setting, "eval") @@ -162,6 +165,10 @@ class LegacyProfileReader(ProfileReader): data = stream.getvalue() profile.deserialize(data) + # The definition can get reset to fdmprinter during the deserialization's upgrade. Here we set the definition + # again. + profile.setDefinition(quality_definition) + #We need to return one extruder stack and one global stack. global_container_id = container_registry.uniqueName("Global Imported Legacy Profile") global_profile = profile.duplicate(new_id = global_container_id, new_name = profile_id) #Needs to have the same name as the extruder profile. From 7dfc1a4aa717c00819bf0f11e714c1f93116b352 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 29 Jan 2018 12:29:20 +0100 Subject: [PATCH 445/551] Add encoding='utf-8' for text file reading CURA-4875 When encoding is not provided, the behaviour is system dependent and it can break on OS X. --- cura/CrashHandler.py | 6 +++--- cura/Settings/ContainerManager.py | 2 +- cura/Settings/CuraContainerRegistry.py | 2 +- cura_app.py | 4 ++-- plugins/CuraProfileReader/CuraProfileReader.py | 2 +- plugins/GCodeReader/GCodeReader.py | 2 +- .../VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py | 2 +- .../VersionUpgrade30to31/VersionUpgrade30to31.py | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index b5d4001fe2..0c6740f740 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -189,7 +189,7 @@ class CrashHandler: json_metadata_file = os.path.join(directory, "plugin.json") try: - with open(json_metadata_file, "r") as f: + with open(json_metadata_file, "r", encoding = "utf-8") as f: try: metadata = json.loads(f.read()) module_version = metadata["version"] @@ -217,9 +217,9 @@ class CrashHandler: text_area = QTextEdit() tmp_file_fd, tmp_file_path = tempfile.mkstemp(prefix = "cura-crash", text = True) os.close(tmp_file_fd) - with open(tmp_file_path, "w") as f: + with open(tmp_file_path, "w", encoding = "utf-8") as f: faulthandler.dump_traceback(f, all_threads=True) - with open(tmp_file_path, "r") as f: + with open(tmp_file_path, "r", encoding = "utf-8") as f: logdata = f.read() text_area.setText(logdata) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 21fc3f43c0..007b0917a0 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -486,7 +486,7 @@ class ContainerManager(QObject): container = container_type(container_id) try: - with open(file_url, "rt") as f: + with open(file_url, "rt", encoding = "utf-8") as f: container.deserialize(f.read()) except PermissionError: return { "status": "error", "message": "Permission denied when trying to read the file"} diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 41b2c492f0..589948216d 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -693,7 +693,7 @@ class CuraContainerRegistry(ContainerRegistry): continue instance_container = InstanceContainer(container_id) - with open(file_path, "r") as f: + with open(file_path, "r", encoding = "utf-8") as f: serialized = f.read() instance_container.deserialize(serialized, file_path) self.addContainer(instance_container) diff --git a/cura_app.py b/cura_app.py index 6d1ff6ab6b..b9afb9bbcc 100755 --- a/cura_app.py +++ b/cura_app.py @@ -30,8 +30,8 @@ if not known_args["debug"]: if hasattr(sys, "frozen"): dirpath = get_cura_dir_path() os.makedirs(dirpath, exist_ok = True) - sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w") - sys.stderr = open(os.path.join(dirpath, "stderr.log"), "w") + sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w", encoding = "utf-8") + sys.stderr = open(os.path.join(dirpath, "stderr.log"), "w", encoding = "utf-8") import platform import faulthandler diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py index 5631d138aa..3a0f0ee1aa 100644 --- a/plugins/CuraProfileReader/CuraProfileReader.py +++ b/plugins/CuraProfileReader/CuraProfileReader.py @@ -39,7 +39,7 @@ class CuraProfileReader(ProfileReader): except zipfile.BadZipFile: # It must be an older profile from Cura 2.1. - with open(file_name, encoding="utf-8") as fhandle: + with open(file_name, encoding = "utf-8") as fhandle: serialized = fhandle.read() return [self._loadProfile(serialized, profile_id) for serialized, profile_id in self._upgradeProfile(serialized, file_name)] diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index cb2f5d99e0..050f243f9b 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -26,7 +26,7 @@ class GCodeReader(MeshReader): # PreRead is used to get the correct flavor. If not, Marlin is set by default def preRead(self, file_name, *args, **kwargs): - with open(file_name, "r") as file: + with open(file_name, "r", encoding = "utf-8") as file: for line in file: if line[:len(self._flavor_keyword)] == self._flavor_keyword: try: diff --git a/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py b/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py index 19f0563f10..7505911049 100644 --- a/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py +++ b/plugins/VersionUpgrade/VersionUpgrade22to24/VersionUpgrade.py @@ -74,7 +74,7 @@ class VersionUpgrade22to24(VersionUpgrade): def __convertVariant(self, variant_path): # Copy the variant to the machine_instances/*_settings.inst.cfg variant_config = configparser.ConfigParser(interpolation=None) - with open(variant_path, "r") as fhandle: + with open(variant_path, "r", encoding = "utf-8") as fhandle: variant_config.read_file(fhandle) config_name = "Unknown Variant" diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index 8c5a160ff4..517b5659b2 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -231,5 +231,5 @@ class VersionUpgrade30to31(VersionUpgrade): quality_changes_dir = Resources.getPath(CuraApplication.ResourceTypes.QualityInstanceContainer) - with open(os.path.join(quality_changes_dir, extruder_quality_changes_filename), "w") as f: + with open(os.path.join(quality_changes_dir, extruder_quality_changes_filename), "w", encoding = "utf-8") as f: f.write(extruder_quality_changes_output.getvalue()) From 2d48fbb6088e9c44f7db7108ff3a1c1ddf41ca4c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 29 Jan 2018 12:51:23 +0100 Subject: [PATCH 446/551] Rename file_type parameter to relation_type It was renamed in libCharon for better semantic meaning. Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 06c3cce14e..feaf049db8 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -21,7 +21,7 @@ class UFPWriter(MeshWriter): gcode = archive.getStream("/3D/model.gcode") gcode.write(gcode_textio.getvalue().encode("UTF-8")) gcode.close() - archive.addRelation(virtual_path = "/3D/model.gcode", file_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") + archive.addRelation(virtual_path = "/3D/model.gcode", relation_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") #Store the thumbnail. #TODO: Generate the thumbnail image. Below is just a placeholder. @@ -29,6 +29,6 @@ class UFPWriter(MeshWriter): thumbnail = archive.getStream("/Metadata/thumbnail.png") thumbnail.write(open(os.path.join(os.path.dirname(__file__), "kitten.png"), "rb").read()) thumbnail.close() - archive.addRelation(virtual_path = "/Metadata/thumbnail.png", file_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") + archive.addRelation(virtual_path = "/Metadata/thumbnail.png", relation_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") archive.close() \ No newline at end of file From b9fc3997e570bdf46882198f1ac137a5b372ee33 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 29 Jan 2018 13:00:45 +0100 Subject: [PATCH 447/551] Fix jellybox -> imade3d_jellybox renaming CURA-4863 --- .../VersionUpgrade30to31.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index 517b5659b2..c1f32b424f 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -59,6 +59,12 @@ _EMPTY_CONTAINER_DICT = { } +# Renamed definition files +_RENAMED_DEFINITION_DICT = { + "jellybox": "imade3d_jellybox", +} + + class VersionUpgrade30to31(VersionUpgrade): ## Gets the version number from a CFG file in Uranium's 3.0 format. # @@ -122,6 +128,10 @@ class VersionUpgrade30to31(VersionUpgrade): if len(all_quality_changes) <= 1 and not parser.has_option("metadata", "extruder"): self._createExtruderQualityChangesForSingleExtrusionMachine(filename, parser) + # Check renamed definitions + if "definition" in parser["general"] and parser["general"]["definition"] in _RENAMED_DEFINITION_DICT: + parser["general"]["definition"] = _RENAMED_DEFINITION_DICT[parser["general"]["definition"]] + # Update version numbers parser["general"]["version"] = "2" parser["metadata"]["setting_version"] = "4" @@ -156,6 +166,10 @@ class VersionUpgrade30to31(VersionUpgrade): if parser.has_option("containers", key) and parser["containers"][key] == "empty": parser["containers"][key] = specific_empty_container + # check renamed definition + if parser.has_option("containers", "6") and parser["containers"]["6"] in _RENAMED_DEFINITION_DICT: + parser["containers"]["6"] = _RENAMED_DEFINITION_DICT[parser["containers"]["6"]] + # Update version numbers if "general" not in parser: parser["general"] = {} @@ -219,6 +233,10 @@ class VersionUpgrade30to31(VersionUpgrade): extruder_quality_changes_parser["general"]["name"] = global_quality_changes["general"]["name"] extruder_quality_changes_parser["general"]["definition"] = global_quality_changes["general"]["definition"] + # check renamed definition + if extruder_quality_changes_parser["general"]["definition"] in _RENAMED_DEFINITION_DICT: + extruder_quality_changes_parser["general"]["definition"] = _RENAMED_DEFINITION_DICT[extruder_quality_changes_parser["general"]["definition"]] + extruder_quality_changes_parser.add_section("metadata") extruder_quality_changes_parser["metadata"]["quality_type"] = global_quality_changes["metadata"]["quality_type"] extruder_quality_changes_parser["metadata"]["type"] = global_quality_changes["metadata"]["type"] From fec553dbeeb8ff6d22394d6daac73ab61ba0a345 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 29 Jan 2018 13:06:38 +0100 Subject: [PATCH 448/551] Return true after successfully writing the file This is how Uranium detects that it's been written successfully. Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index feaf049db8..c3da529a98 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -31,4 +31,5 @@ class UFPWriter(MeshWriter): thumbnail.close() archive.addRelation(virtual_path = "/Metadata/thumbnail.png", relation_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") - archive.close() \ No newline at end of file + archive.close() + return True \ No newline at end of file From 750a86d2fd0d2540c7c8eddcfa1d826977c718a5 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 29 Jan 2018 13:47:24 +0100 Subject: [PATCH 449/551] Added new lines to distinguis error message CURA-4876 --- plugins/LegacyProfileReader/LegacyProfileReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 73a305a0f5..5634018196 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -76,7 +76,7 @@ class LegacyProfileReader(ProfileReader): multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 if multi_extrusion: Logger.log("e", "Unable to import legacy profile %s. Multi extrusion is not supported", file_name) - raise Exception("Unable to import legacy profile. Multi extrusion is not supported") + raise Exception("\r\rUnable to import legacy profile. Multi extrusion is not supported") Logger.log("i", "Importing legacy profile from file " + file_name + ".") container_registry = ContainerRegistry.getInstance() From 0e5395dfd55853b453e65c4e0fb5fb5ae6619a42 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 29 Jan 2018 14:29:13 +0100 Subject: [PATCH 450/551] Fix crash when removing manually added device. I forgot to rename a variable :( CURA-4861 --- plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index c639c25007..5ff5eb9e3e 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -126,7 +126,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): def removeManualDevice(self, key, address = None): if key in self._discovered_devices: if not address: - address = self._printers[key].ipAddress + address = self._discovered_devices[key].ipAddress self._onRemoveDevice(key) if address in self._manual_instances: From 507b9679469bbb0ce00e10d77dff6eacc0d5db3c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 29 Jan 2018 14:46:55 +0100 Subject: [PATCH 451/551] Minor fixes CURA-4868 --- cura/Settings/ContainerManager.py | 2 +- plugins/CuraProfileReader/CuraProfileReader.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 007b0917a0..7ad185cf66 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -3,7 +3,7 @@ import copy import os.path -import urllib +import urllib.parse import uuid from typing import Any, Dict, List, Union diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py index 3a0f0ee1aa..69b2187541 100644 --- a/plugins/CuraProfileReader/CuraProfileReader.py +++ b/plugins/CuraProfileReader/CuraProfileReader.py @@ -52,10 +52,10 @@ class CuraProfileReader(ProfileReader): parser = configparser.ConfigParser(interpolation=None) parser.read_string(serialized) - if not "general" in parser: + if "general" not in parser: Logger.log("w", "Missing required section 'general'.") return [] - if not "version" in parser["general"]: + if "version" not in parser["general"]: Logger.log("w", "Missing required 'version' property") return [] From 34e6816f835bf6a13dff132b69d0269692334b70 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 29 Jan 2018 14:47:32 +0100 Subject: [PATCH 452/551] Fix container ID modification in profile importing CURA-4868 --- 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 589948216d..e89c8722cc 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -296,7 +296,7 @@ class CuraContainerRegistry(ContainerRegistry): profile.setDirty(True) # Ensure the profiles are correctly saved new_id = self.createUniqueName("quality_changes", "", id_seed, catalog.i18nc("@label", "Custom profile")) - profile._id = new_id + profile.setMetaDataEntry("id", new_id) profile.setName(new_name) # Set the unique Id to the profile, so it's generating a new one even if the user imports the same profile From 924f3972fd69b381ea233438a20753022a69d027 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 29 Jan 2018 14:49:06 +0100 Subject: [PATCH 453/551] Create quality_changes for extruder stack if missing in profile importing CURA-4868 --- cura/Settings/CuraContainerRegistry.py | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index e89c8722cc..aa3034848f 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -246,6 +246,41 @@ class CuraContainerRegistry(ContainerRegistry): if type(profile_or_list) is not list: profile_or_list = [profile_or_list] + # Make sure that there are also extruder stacks' quality_changes, not just one for the global stack + if len(profile_or_list) == 1: + global_profile = profile_or_list[0] + extruder_profiles = [] + for idx, extruder in enumerate(global_container_stack.extruders.values()): + profile_id = ContainerRegistry.getInstance().uniqueName(global_container_stack.getId() + "_extruder_" + str(idx + 1)) + profile = InstanceContainer(profile_id) + profile.setName(global_profile.getName()) + profile.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) + profile.addMetaDataEntry("type", "quality_changes") + profile.addMetaDataEntry("definition", global_profile.getMetaDataEntry("definition")) + profile.addMetaDataEntry("quality_type", global_profile.getMetaDataEntry("quality_type")) + profile.addMetaDataEntry("extruder", extruder.getId()) + profile.setDirty(True) + if idx == 0: + # move all per-extruder settings to the first extruder's quality_changes + for qc_setting_key in global_profile.getAllKeys(): + settable_per_extruder = global_container_stack.getProperty(qc_setting_key, + "settable_per_extruder") + if settable_per_extruder: + setting_value = global_profile.getProperty(qc_setting_key, "value") + + setting_definition = global_container_stack.getSettingDefinition(qc_setting_key) + new_instance = SettingInstance(setting_definition, profile) + new_instance.setProperty("value", setting_value) + new_instance.resetState() # Ensure that the state is not seen as a user state. + profile.addInstance(new_instance) + profile.setDirty(True) + + global_profile.removeInstance(qc_setting_key, postpone_emit=True) + extruder_profiles.append(profile) + + for profile in extruder_profiles: + profile_or_list.append(profile) + # Import all profiles for profile_index, profile in enumerate(profile_or_list): if profile_index == 0: From d351eba75863356182de148f9af93308da1ce33d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 29 Jan 2018 14:55:56 +0100 Subject: [PATCH 454/551] Use \n instead of \r for message formatting CURA-4863 --- plugins/LegacyProfileReader/LegacyProfileReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 5634018196..35c77f840b 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -76,7 +76,7 @@ class LegacyProfileReader(ProfileReader): multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 if multi_extrusion: Logger.log("e", "Unable to import legacy profile %s. Multi extrusion is not supported", file_name) - raise Exception("\r\rUnable to import legacy profile. Multi extrusion is not supported") + raise Exception("\nUnable to import legacy profile. Multi extrusion is not supported") Logger.log("i", "Importing legacy profile from file " + file_name + ".") container_registry = ContainerRegistry.getInstance() From 0954211be8fb8a78a995b05d961c00bb89809b86 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 29 Jan 2018 16:01:11 +0100 Subject: [PATCH 455/551] Fix: Wrong print time CURA-4874 --- plugins/UM3NetworkPrinting/PrinterInfoBlock.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index 6d7d6c8a7d..eb5cbff8e3 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -413,7 +413,7 @@ Rectangle { if(printJob.state == "printing" || printJob.state == "post_print") { - return OutputDevice.getDateCompleted(printJob.time_total - printJob.time_elapsed) + return OutputDevice.getDateCompleted(printJob.timeTotal - printJob.timeElapsed) } } return ""; From f1363fab73d5020b26f2ae389c0cba9cafe504d3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 29 Jan 2018 16:33:52 +0100 Subject: [PATCH 456/551] Move newline format CURA-4863 --- cura/Settings/CuraContainerRegistry.py | 2 +- plugins/LegacyProfileReader/LegacyProfileReader.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index aa3034848f..dc8104d300 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -208,7 +208,7 @@ class CuraContainerRegistry(ContainerRegistry): except Exception as e: # Note that this will fail quickly. That is, if any profile reader throws an exception, it will stop reading. It will only continue reading if the reader returned None. Logger.log("e", "Failed to import profile from %s: %s while using profile reader. Got exception %s", file_name,profile_reader.getPluginId(), str(e)) - return { "status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "Failed to import profile from {0}: {1}", file_name, str(e))} + return { "status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "Failed to import profile from {0}: {1}", file_name, "\n" + str(e))} if profile_or_list: # Ensure it is always a list of profiles diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 35c77f840b..73a305a0f5 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -76,7 +76,7 @@ class LegacyProfileReader(ProfileReader): multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 if multi_extrusion: Logger.log("e", "Unable to import legacy profile %s. Multi extrusion is not supported", file_name) - raise Exception("\nUnable to import legacy profile. Multi extrusion is not supported") + raise Exception("Unable to import legacy profile. Multi extrusion is not supported") Logger.log("i", "Importing legacy profile from file " + file_name + ".") container_registry = ContainerRegistry.getInstance() From a9048a587d272fe3b3c5e47d15e83c04458fe23b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 29 Jan 2018 17:25:36 +0100 Subject: [PATCH 457/551] Use new open_stream This allows us to do something else than write to a file, too. Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index c3da529a98..4089a1ae3a 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -12,7 +12,7 @@ from UM.PluginRegistry import PluginRegistry #To get the g-code writer. class UFPWriter(MeshWriter): def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode): archive = VirtualFile() - archive.open(stream, OpenMode.WriteOnly) + archive.open_stream(stream, "application/x-ufp", OpenMode.WriteOnly) #Store the g-code from the scene. archive.addContentType(extension = "gcode", mime_type = "text/x-gcode") From a4a1832a58683cc18ac4862668021dd616990d6e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 30 Jan 2018 09:49:31 +0100 Subject: [PATCH 458/551] Fix legacy profile importing for CFP CURA-4876 --- .../LegacyProfileReader.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 73a305a0f5..824fc959a1 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -174,15 +174,12 @@ class LegacyProfileReader(ProfileReader): global_profile = profile.duplicate(new_id = global_container_id, new_name = profile_id) #Needs to have the same name as the extruder profile. global_profile.setDirty(True) - #Only the extruder stack has an extruder metadata entry. - profile.addMetaDataEntry("extruder", ExtruderManager.getInstance().getActiveExtruderStack().definition.getId()) + profile_definition = "fdmprinter" + from UM.Util import parseBool + if parseBool(global_container_stack.getMetaDataEntry("has_machine_quality", "False")): + profile_definition = global_container_stack.getMetaDataEntry("quality_definition") + if not profile_definition: + profile_definition = global_container_stack.definition.getId() + global_profile.setDefinition(profile_definition) - #Split all settings into per-extruder and global settings. - for setting_key in profile.getAllKeys(): - settable_per_extruder = global_container_stack.getProperty(setting_key, "settable_per_extruder") - if settable_per_extruder: - global_profile.removeInstance(setting_key) - else: - profile.removeInstance(setting_key) - - return [global_profile, profile] + return [global_profile] From bdfb8f1b5be708a12402d1f07d69d4f4b12550b8 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 30 Jan 2018 11:23:00 +0100 Subject: [PATCH 459/551] CURA-4885 Remove the part in which the version upgrader creates a quality changes instance. This instance container is created in the workspace reader. This avoids the profile to appear twice. --- .../VersionUpgrade30to31/VersionUpgrade30to31.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index c1f32b424f..d7b2c1a001 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -117,17 +117,6 @@ class VersionUpgrade30to31(VersionUpgrade): if not parser.has_section(each_section): parser.add_section(each_section) - # Copy global quality changes to extruder quality changes for single extrusion machines - if parser["metadata"]["type"] == "quality_changes": - all_quality_changes = self._getSingleExtrusionMachineQualityChanges(parser) - # Note that DO NOT!!! use the quality_changes returned from _getSingleExtrusionMachineQualityChanges(). - # Those are loaded from the hard drive which are original files that haven't been upgraded yet. - # NOTE 2: The number can be 0 or 1 depends on whether you are loading it from the qualities folder or - # from a project file. When you load from a project file, the custom profile may not be in cura - # yet, so you will get 0. - if len(all_quality_changes) <= 1 and not parser.has_option("metadata", "extruder"): - self._createExtruderQualityChangesForSingleExtrusionMachine(filename, parser) - # Check renamed definitions if "definition" in parser["general"] and parser["general"]["definition"] in _RENAMED_DEFINITION_DICT: parser["general"]["definition"] = _RENAMED_DEFINITION_DICT[parser["general"]["definition"]] From b7093e8b57d46bfa2743f45a4050908c157ba496 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 30 Jan 2018 11:26:01 +0100 Subject: [PATCH 460/551] Make the menu separator only show if there are quality changes profiles --- resources/qml/Menus/ProfileMenu.qml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index edce2641af..f543bb36eb 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -29,7 +29,11 @@ Menu onObjectRemoved: menu.removeItem(object); } - MenuSeparator { id: customSeparator } + MenuSeparator + { + id: customSeparator + visible: Cura.UserProfilesModel.rowCount > 0 + } Instantiator { From 759e596eb626679c1ebd5bc711c8eda5bce4acd0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 30 Jan 2018 11:52:46 +0100 Subject: [PATCH 461/551] Fix add extruder function CURA-4868 --- cura/Settings/CuraContainerRegistry.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index dc8104d300..a4b48822b7 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -542,9 +542,10 @@ class CuraContainerRegistry(ContainerRegistry): user_container = InstanceContainer(user_container_id) user_container.setName(user_container_name) user_container.addMetaDataEntry("type", "user") - user_container.addMetaDataEntry("machine", extruder_stack.getId()) + user_container.addMetaDataEntry("machine", machine.Id()) user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) user_container.setDefinition(machine.definition.getId()) + user_container.setMetaDataEntry("extruder", extruder_stack.getId()) if machine.userChanges: # for the newly created extruder stack, we need to move all "per-extruder" settings to the user changes From e227ab5a23ff97cdea39b484391ce2fe3080b182 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 30 Jan 2018 13:29:28 +0100 Subject: [PATCH 462/551] CURA-4881 Remove the automatic option for buildplates if there is no information about them --- resources/qml/Menus/BuildplateMenu.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Menus/BuildplateMenu.qml b/resources/qml/Menus/BuildplateMenu.qml index 908cccf1c8..957837bc41 100644 --- a/resources/qml/Menus/BuildplateMenu.qml +++ b/resources/qml/Menus/BuildplateMenu.qml @@ -33,14 +33,14 @@ Menu id: automaticBuildplate text: { - if(printerConnected && Cura.MachineManager.printerOutputDevices[0].buildplateId != "" && !isClusterPrinter) + if (visible) { var buildplateName = Cura.MachineManager.printerOutputDevices[0].buildplateId return catalog.i18nc("@title:menuitem %1 is the buildplate currently loaded in the printer", "Automatic: %1").arg(buildplateName) } return "" } - visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].buildplateId != "" && !isClusterPrinter + visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds != undefined && Cura.MachineManager.printerOutputDevices[0].buildplateId != "" && !isClusterPrinter onTriggered: { var buildplateId = Cura.MachineManager.printerOutputDevices[0].buildplateId From 3981b717a8bcd153dd6eb280c7c2a71f15991641 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 30 Jan 2018 13:31:14 +0100 Subject: [PATCH 463/551] CURA-4881 Remove the automatic option for buildplates --- resources/qml/Menus/BuildplateMenu.qml | 45 -------------------------- 1 file changed, 45 deletions(-) diff --git a/resources/qml/Menus/BuildplateMenu.qml b/resources/qml/Menus/BuildplateMenu.qml index 957837bc41..4b85aa9e93 100644 --- a/resources/qml/Menus/BuildplateMenu.qml +++ b/resources/qml/Menus/BuildplateMenu.qml @@ -12,51 +12,6 @@ Menu id: menu title: "Build plate" - property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 - property bool isClusterPrinter: - { - if(Cura.MachineManager.printerOutputDevices.length == 0) - { - return false; - } - var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize; - // This is not a cluster printer or the cluster it is just one printer - if(clusterSize == undefined || clusterSize == 1) - { - return false; - } - return true; - } - - MenuItem - { - id: automaticBuildplate - text: - { - if (visible) - { - var buildplateName = Cura.MachineManager.printerOutputDevices[0].buildplateId - return catalog.i18nc("@title:menuitem %1 is the buildplate currently loaded in the printer", "Automatic: %1").arg(buildplateName) - } - return "" - } - visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds != undefined && Cura.MachineManager.printerOutputDevices[0].buildplateId != "" && !isClusterPrinter - onTriggered: - { - var buildplateId = Cura.MachineManager.printerOutputDevices[0].buildplateId - var itemIndex = buildplateInstantiator.model.find("name", buildplateId) - if(itemIndex > -1) - { - Cura.MachineManager.setActiveVariantBuildplate(buildplateInstantiator.model.getItem(itemIndex).id) - } - } - } - - MenuSeparator - { - visible: automaticBuildplate.visible - } - Instantiator { id: buildplateInstantiator From c403d52972fe42aba0bfdd5be12b6de5cce57441 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 30 Jan 2018 13:44:18 +0100 Subject: [PATCH 464/551] Only limit retraction speed if retraction is enabled For some printers the feedrate might be too low for the defaults. --- 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 10a7b1f1ff..bdce508df0 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2072,7 +2072,7 @@ "default_value": 25, "minimum_value": "0.0001", "minimum_value_warning": "1", - "maximum_value": "machine_max_feedrate_e", + "maximum_value": "machine_max_feedrate_e if retraction_enable else float('inf')", "maximum_value_warning": "70", "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"", "settable_per_mesh": false, @@ -2087,7 +2087,7 @@ "type": "float", "default_value": 25, "minimum_value": "0.0001", - "maximum_value": "machine_max_feedrate_e", + "maximum_value": "machine_max_feedrate_e if retraction_enable else float('inf')", "minimum_value_warning": "1", "maximum_value_warning": "70", "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"", @@ -2103,7 +2103,7 @@ "type": "float", "default_value": 25, "minimum_value": "0.0001", - "maximum_value": "machine_max_feedrate_e", + "maximum_value": "machine_max_feedrate_e if retraction_enable else float('inf')", "minimum_value_warning": "1", "maximum_value_warning": "70", "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"", @@ -2204,7 +2204,7 @@ "default_value": 20, "minimum_value": "0.1", "minimum_value_warning": "1", - "maximum_value": "machine_max_feedrate_e", + "maximum_value": "machine_max_feedrate_e if retraction_enable else float('inf')", "maximum_value_warning": "70", "settable_per_mesh": false, "settable_per_extruder": true, @@ -2221,7 +2221,7 @@ "value": "switch_extruder_retraction_speeds", "minimum_value": "0.1", "minimum_value_warning": "1", - "maximum_value": "machine_max_feedrate_e", + "maximum_value": "machine_max_feedrate_e if retraction_enable else float('inf')", "maximum_value_warning": "70", "settable_per_mesh": false, "settable_per_extruder": true @@ -2237,7 +2237,7 @@ "value": "switch_extruder_retraction_speeds", "minimum_value": "0.1", "minimum_value_warning": "1", - "maximum_value": "machine_max_feedrate_e", + "maximum_value": "machine_max_feedrate_e if retraction_enable else float('inf')", "maximum_value_warning": "70", "settable_per_mesh": false, "settable_per_extruder": true From f065a08c82221d51e8b2cd2d69d2890ef4a6f9fd Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 30 Jan 2018 15:26:15 +0100 Subject: [PATCH 465/551] Added visible settings CURA-3710 --- cura/CuraApplication.py | 33 +-- .../qml/Preferences/SettingVisibilityPage.qml | 2 - resources/visibility_presets/advanced.cfg | 222 ++++++++++++++++++ resources/visibility_presets/expert.cfg | 221 ++++++++++++++++- 4 files changed, 460 insertions(+), 18 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 0df64dbacb..e2719b7a5d 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1,6 +1,7 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +#Type hinting. +from typing import Dict from PyQt5.QtNetwork import QLocalServer from PyQt5.QtNetwork import QLocalSocket @@ -96,6 +97,7 @@ import os import argparse import json + numpy.seterr(all="ignore") MYPY = False @@ -349,7 +351,7 @@ class CuraApplication(QtApplication): preferences.setDefault("local_file/last_used_type", "text/x-gcode") - setting_visibily_preset_names = self.getVisibilitySettingsPresetTypes() + setting_visibily_preset_names = self.getVisibilitySettingPresetTypes() preferences.setDefault("general/visible_settings_preset", setting_visibily_preset_names) visible_settings_preset_choice = Preferences.getInstance().getValue("general/visible_settings_preset_choice") @@ -373,30 +375,29 @@ class CuraApplication(QtApplication): self.getCuraSceneController().setActiveBuildPlate(0) # Initialize - @pyqtSlot(str, result=str) - def getVisibilitySettingPreset(self, settings_preset_name): - + @pyqtSlot(str, result = str) + def getVisibilitySettingPreset(self, settings_preset_name) -> str: result = self._load_visibilyty_setting_preset(settings_preset_name) - formatted_preset_settings = self.format_visibility_setting_preset(result) return formatted_preset_settings - def format_visibility_setting_preset(self, settings_data): - + ## Format visibitlity settings into string which is concatenated by ";" + # + def format_visibility_setting_preset(self, settings_data) -> str: result_string = "" for key in settings_data: result_string += key + ";" - for value in settings_data[key]: result_string += value + ";" return result_string - - def _load_visibilyty_setting_preset(self, visibility_preset_name): - preset_dir = Resources.getPath(Resources.VisibilitySettingsPreset) + ## Load visibility settings according to selected preset name + # + def _load_visibilyty_setting_preset(self, visibility_preset_name) -> Dict[str, str]: + preset_dir = Resources.getPath(Resources.VisibilitySettingPresets) result = {} right_preset_found = False @@ -434,8 +435,10 @@ class CuraApplication(QtApplication): return result - def getVisibilitySettingsPresetTypes(self): - preset_dir = Resources.getPath(Resources.VisibilitySettingsPreset) + ## Check visibility setting preset folder and returns available types + # + def getVisibilitySettingPresetTypes(self): + preset_dir = Resources.getPath(Resources.VisibilitySettingPresets) result = {} for item in os.listdir(preset_dir): diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index e1707fa196..967c0d05bf 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -176,8 +176,6 @@ UM.PreferencesPage if (model.get(index).text == "Custom") return - console.log("SETTING VALUE : " + model.get(index).text) - var newVisibleSettings = CuraApplication.getVisibilitySettingPreset(model.get(index).text) UM.Preferences.setValue("general/visible_settings", newVisibleSettings) UM.Preferences.setValue("general/visible_settings_preset_choice", model.get(index).text) diff --git a/resources/visibility_presets/advanced.cfg b/resources/visibility_presets/advanced.cfg index 335ae67afe..ab2d2faa99 100644 --- a/resources/visibility_presets/advanced.cfg +++ b/resources/visibility_presets/advanced.cfg @@ -6,27 +6,249 @@ weight = 2 [resolution] layer_height +layer_height_0 +slicing_tolerance +line_width [shell] +wall_extruder_nr +wall_thickness +wall_0_wipe_dist +roofing_extruder_nr +roofing_layer_count +roofing_pattern +roofing_angles +top_bottom_extruder_nr +top_bottom_thickness +top_bottom_pattern +top_bottom_pattern_0 +skin_angles +wall_0_inset +optimize_wall_printing_order +outer_inset_first +alternate_extra_perimeter +travel_compensate_overlapping_walls_enabled +fill_perimeter_gaps +filter_out_tiny_gaps +fill_outline_gaps +xy_offset +xy_offset_layer_0 +z_seam_type +z_seam_x +z_seam_y +z_seam_corner +z_seam_relative +skin_no_small_gaps_heuristic +skin_outline_count +ironing_enabled +ironing_only_highest_layer +ironing_pattern +ironing_line_spacing +ironing_flow +ironing_inset +speed_ironing +acceleration_ironing +jerk_ironing [infill] +infill_extruder_nr +infill_sparse_density +infill_pattern +zig_zaggify_infill +infill_angles +infill_offset_x +infill_offset_y +sub_div_rad_add +infill_overlap +skin_overlap +infill_wipe_dist +infill_sparse_thickness +gradual_infill_steps +gradual_infill_step_height +infill_before_walls +min_infill_area +skin_preshrink +expand_skins_expand_distance +max_skin_angle_for_expansion +infill_enable_travel_optimization [material] +material_flow_dependent_temperature +default_material_print_temperature +material_print_temperature +material_print_temperature_layer_0 +material_initial_print_temperature +material_final_print_temperature +material_flow_temp_graph +material_extrusion_cool_down_speed +default_material_bed_temperature +material_bed_temperature +material_bed_temperature_layer_0 +material_diameter +material_adhesion_tendency +material_surface_energy +material_flow +retraction_enable +retract_at_layer_change +retraction_amount +retraction_speed +retraction_extra_prime_amount +retraction_min_travel +retraction_count_max +retraction_extrusion_window +material_standby_temperature +switch_extruder_retraction_amount +switch_extruder_retraction_speeds [speed] +speed_print +speed_travel +speed_layer_0 +skirt_brim_speed +max_feedrate_z_override +speed_slowdown_layers +speed_equalize_flow_enabled +speed_equalize_flow_max +acceleration_enabled +acceleration_print +acceleration_travel +acceleration_layer_0 +acceleration_skirt_brim +jerk_enabled +jerk_print +jerk_travel +jerk_layer_0 +jerk_skirt_brim [travel] +retraction_combing +travel_retract_before_outer_wall +travel_avoid_other_parts +travel_avoid_distance +start_layers_at_same_position +layer_start_x +layer_start_y +retraction_hop_enabled +retraction_hop_only_when_collides +retraction_hop +retraction_hop_after_extruder_switch [cooling] +cool_fan_enabled +cool_fan_speed +cool_min_layer_time_fan_speed_max +cool_fan_speed_0 +cool_fan_full_at_height +cool_min_layer_time +cool_min_speed +cool_lift_head [support] +support_enable +support_tree_enable +support_extruder_nr +support_type +support_angle +support_pattern +support_connect_zigzags +support_infill_rate +support_z_distance +support_xy_distance +support_xy_overrides_z +support_xy_distance_overhang +support_bottom_stair_step_height +support_bottom_stair_step_width +support_join_distance +support_offset +support_infill_sparse_thickness +support_tree_angle +support_tree_branch_distance +support_tree_branch_diameter +support_tree_branch_diameter_angle +support_tree_collision_resolution +support_tree_wall_thickness +gradual_support_infill_steps +gradual_support_infill_step_height +support_interface_enable +support_interface_height +support_interface_skip_height +support_interface_density +support_interface_pattern +support_use_towers +support_tower_diameter +support_minimal_diameter +support_tower_roof_angle +support_mesh_drop_down [platform_adhesion] +prime_blob_enable +extruder_prime_pos_x +extruder_prime_pos_y +adhesion_type +adhesion_extruder_nr +skirt_line_count +skirt_gap +skirt_brim_minimal_length +brim_width +brim_outside_only +raft_margin +raft_smoothing +raft_airgap +layer_0_z_overlap +raft_surface_layers +raft_surface_thickness +raft_surface_line_width +raft_surface_line_spacing +raft_interface_thickness +raft_interface_line_width +raft_interface_line_spacing +raft_base_thickness +raft_base_line_width +raft_base_line_spacing +raft_speed +raft_acceleration +raft_jerk +raft_fan_speed [dual] +prime_tower_enable +prime_tower_size +prime_tower_min_volume +prime_tower_position_x +prime_tower_position_y +prime_tower_flow +prime_tower_wipe_enabled +dual_pre_wipe +prime_tower_purge_volume +ooze_shield_enabled +ooze_shield_angle +ooze_shield_dist [meshfix] +meshfix_union_all +meshfix_union_all_remove_holes +meshfix_extensive_stitching +meshfix_keep_open_polygons +meshfix_maximum_resolution +multiple_mesh_overlap +carve_multiple_volumes +alternate_carve_order +remove_empty_first_layers [blackmagic] +print_sequence +infill_mesh +infill_mesh_order +cutting_mesh +mold_enabled +mold_width +mold_roof_height +mold_angle +support_mesh +anti_overhang_mesh +magic_mesh_surface_mode +magic_spiralize +smooth_spiralized_contours +relative_extrusion [experimental] \ No newline at end of file diff --git a/resources/visibility_presets/expert.cfg b/resources/visibility_presets/expert.cfg index 130c75c6b9..38e756e6b8 100644 --- a/resources/visibility_presets/expert.cfg +++ b/resources/visibility_presets/expert.cfg @@ -6,61 +6,280 @@ weight = 3 [resolution] layer_height +layer_height_0 +slicing_tolerance +line_width [shell] +wall_extruder_nr wall_thickness +wall_0_wipe_dist +roofing_extruder_nr +roofing_layer_count +roofing_pattern +roofing_angles +top_bottom_extruder_nr top_bottom_thickness +top_bottom_pattern +top_bottom_pattern_0 +skin_angles +wall_0_inset +optimize_wall_printing_order +outer_inset_first +alternate_extra_perimeter +travel_compensate_overlapping_walls_enabled +fill_perimeter_gaps +filter_out_tiny_gaps +fill_outline_gaps +xy_offset +xy_offset_layer_0 +z_seam_type z_seam_x z_seam_y +z_seam_corner +z_seam_relative +skin_no_small_gaps_heuristic +skin_outline_count +ironing_enabled +ironing_only_highest_layer +ironing_pattern +ironing_line_spacing +ironing_flow +ironing_inset +speed_ironing +acceleration_ironing +jerk_ironing [infill] +infill_extruder_nr infill_sparse_density +infill_pattern +zig_zaggify_infill +infill_angles +infill_offset_x +infill_offset_y +sub_div_rad_add +infill_overlap +skin_overlap +infill_wipe_dist +infill_sparse_thickness gradual_infill_steps +gradual_infill_step_height +infill_before_walls +min_infill_area +skin_preshrink +expand_skins_expand_distance +max_skin_angle_for_expansion +infill_enable_travel_optimization [material] +material_flow_dependent_temperature +default_material_print_temperature material_print_temperature +material_print_temperature_layer_0 +material_initial_print_temperature +material_final_print_temperature +material_flow_temp_graph +material_extrusion_cool_down_speed +default_material_bed_temperature material_bed_temperature +material_bed_temperature_layer_0 material_diameter +material_adhesion_tendency +material_surface_energy material_flow retraction_enable +retract_at_layer_change +retraction_amount +retraction_speed +retraction_extra_prime_amount +retraction_min_travel +retraction_count_max +retraction_extrusion_window +material_standby_temperature +switch_extruder_retraction_amount +switch_extruder_retraction_speeds [speed] speed_print speed_travel +speed_layer_0 +skirt_brim_speed +max_feedrate_z_override +speed_slowdown_layers +speed_equalize_flow_enabled +speed_equalize_flow_max +acceleration_enabled acceleration_print acceleration_travel +acceleration_layer_0 +acceleration_skirt_brim +jerk_enabled jerk_print jerk_travel +jerk_layer_0 +jerk_skirt_brim [travel] +retraction_combing +travel_retract_before_outer_wall +travel_avoid_other_parts +travel_avoid_distance +start_layers_at_same_position +layer_start_x +layer_start_y +retraction_hop_enabled +retraction_hop_only_when_collides +retraction_hop +retraction_hop_after_extruder_switch [cooling] cool_fan_enabled +cool_fan_speed +cool_min_layer_time_fan_speed_max +cool_fan_speed_0 +cool_fan_full_at_height +cool_min_layer_time +cool_min_speed +cool_lift_head [support] support_enable +support_tree_enable support_extruder_nr support_type +support_angle +support_pattern +support_connect_zigzags +support_infill_rate +support_z_distance +support_xy_distance +support_xy_overrides_z +support_xy_distance_overhang +support_bottom_stair_step_height +support_bottom_stair_step_width +support_join_distance +support_offset +support_infill_sparse_thickness +support_tree_angle +support_tree_branch_distance +support_tree_branch_diameter +support_tree_branch_diameter_angle +support_tree_collision_resolution +support_tree_wall_thickness +gradual_support_infill_steps +gradual_support_infill_step_height +support_interface_enable +support_interface_height +support_interface_skip_height +support_interface_density +support_interface_pattern +support_use_towers +support_tower_diameter +support_minimal_diameter +support_tower_roof_angle +support_mesh_drop_down [platform_adhesion] +prime_blob_enable +extruder_prime_pos_x +extruder_prime_pos_y adhesion_type adhesion_extruder_nr +skirt_line_count +skirt_gap +skirt_brim_minimal_length brim_width +brim_outside_only +raft_margin +raft_smoothing raft_airgap layer_0_z_overlap raft_surface_layers +raft_surface_thickness +raft_surface_line_width +raft_surface_line_spacing +raft_interface_thickness +raft_interface_line_width +raft_interface_line_spacing +raft_base_thickness +raft_base_line_width +raft_base_line_spacing +raft_speed +raft_acceleration +raft_jerk +raft_fan_speed [dual] prime_tower_enable prime_tower_size +prime_tower_min_volume prime_tower_position_x prime_tower_position_y +prime_tower_flow +prime_tower_wipe_enabled +dual_pre_wipe +prime_tower_purge_volume +ooze_shield_enabled +ooze_shield_angle +ooze_shield_dist [meshfix] +meshfix_union_all +meshfix_union_all_remove_holes +meshfix_extensive_stitching +meshfix_keep_open_polygons +meshfix_maximum_resolution +multiple_mesh_overlap +carve_multiple_volumes +alternate_carve_order +remove_empty_first_layers [blackmagic] print_sequence infill_mesh +infill_mesh_order cutting_mesh +mold_enabled +mold_width +mold_roof_height +mold_angle +support_mesh +anti_overhang_mesh +magic_mesh_surface_mode +magic_spiralize +smooth_spiralized_contours +relative_extrusion -[experimental] \ No newline at end of file +[experimental] +support_skip_some_zags +support_skip_zag_per_mm +draft_shield_enabled +draft_shield_dist +draft_shield_height_limitation +draft_shield_height +conical_overhang_enabled +conical_overhang_angle +coasting_enable +coasting_volume +coasting_min_volume +coasting_speed +skin_alternate_rotation +cross_infill_pocket_size +cross_infill_apply_pockets_alternatingly +spaghetti_infill_enabled +spaghetti_infill_stepped +spaghetti_max_infill_angle +spaghetti_max_height +spaghetti_inset +spaghetti_flow +spaghetti_infill_extra_volume +support_conical_enabled +support_conical_angle +support_conical_min_width +infill_hollow +magic_fuzzy_skin_enabled +magic_fuzzy_skin_thickness +magic_fuzzy_skin_point_density +flow_rate_max_extrusion_offset +flow_rate_extrusion_offset_factor \ No newline at end of file From 4cf07f5fe6efb435407952133ea5980822083b3e Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 30 Jan 2018 17:23:55 +0100 Subject: [PATCH 466/551] CURA-4868 Fix typo --- 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 a4b48822b7..0b328cebda 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -542,7 +542,7 @@ class CuraContainerRegistry(ContainerRegistry): user_container = InstanceContainer(user_container_id) user_container.setName(user_container_name) user_container.addMetaDataEntry("type", "user") - user_container.addMetaDataEntry("machine", machine.Id()) + user_container.addMetaDataEntry("machine", machine.getId()) user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) user_container.setDefinition(machine.definition.getId()) user_container.setMetaDataEntry("extruder", extruder_stack.getId()) From cfd60e555745b18d2e5e5f8a123fc32131b79339 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 30 Jan 2018 17:32:41 +0100 Subject: [PATCH 467/551] Fix Olsson Block binding in UM2 machine settings CURA-4897 --- .../UM2UpgradeSelection.py | 34 +++++++++++++------ .../UM2UpgradeSelectionMachineAction.qml | 10 +++++- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/plugins/UltimakerMachineActions/UM2UpgradeSelection.py b/plugins/UltimakerMachineActions/UM2UpgradeSelection.py index 1bf0b98217..0fd31ec445 100644 --- a/plugins/UltimakerMachineActions/UM2UpgradeSelection.py +++ b/plugins/UltimakerMachineActions/UM2UpgradeSelection.py @@ -2,7 +2,6 @@ # Uranium is released under the terms of the LGPLv3 or higher. from UM.Settings.ContainerRegistry import ContainerRegistry -from UM.Settings.InstanceContainer import InstanceContainer from cura.MachineAction import MachineAction from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty @@ -11,8 +10,6 @@ from UM.Application import Application from UM.Util import parseBool catalog = i18nCatalog("cura") -import UM.Settings.InstanceContainer - ## The Ultimaker 2 can have a few revisions & upgrades. class UM2UpgradeSelection(MachineAction): @@ -22,18 +19,29 @@ class UM2UpgradeSelection(MachineAction): self._container_registry = ContainerRegistry.getInstance() + self._current_global_stack = None + + from cura.CuraApplication import CuraApplication + CuraApplication.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) + self._reset() + def _reset(self): self.hasVariantsChanged.emit() + def _onGlobalStackChanged(self): + if self._current_global_stack: + self._current_global_stack.metaDataChanged.disconnect(self._onGlobalStackMetaDataChanged) + + self._current_global_stack = Application.getInstance().getGlobalContainerStack() + if self._current_global_stack: + self._current_global_stack.metaDataChanged.connect(self._onGlobalStackMetaDataChanged) + self._reset() + + def _onGlobalStackMetaDataChanged(self): + self._reset() + hasVariantsChanged = pyqtSignal() - @pyqtProperty(bool, notify = hasVariantsChanged) - def hasVariants(self): - global_container_stack = Application.getInstance().getGlobalContainerStack() - if global_container_stack: - return parseBool(global_container_stack.getMetaDataEntry("has_variants", "false")) - - @pyqtSlot(bool) def setHasVariants(self, has_variants = True): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: @@ -62,3 +70,9 @@ class UM2UpgradeSelection(MachineAction): global_container_stack.extruders["0"].variant = ContainerRegistry.getInstance().getEmptyInstanceContainer() Application.getInstance().globalContainerStackChanged.emit() + self._reset() + + @pyqtProperty(bool, fset = setHasVariants, notify = hasVariantsChanged) + def hasVariants(self): + if self._current_global_stack: + return parseBool(self._current_global_stack.getMetaDataEntry("has_variants", "false")) diff --git a/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml b/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml index 988c9d6128..793f3f00a8 100644 --- a/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml +++ b/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml @@ -13,6 +13,7 @@ import Cura 1.0 as Cura Cura.MachineAction { anchors.fill: parent; + Item { id: upgradeSelectionMachineAction @@ -39,12 +40,19 @@ Cura.MachineAction CheckBox { + id: olssonBlockCheckBox anchors.top: pageDescription.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height text: catalog.i18nc("@label", "Olsson Block") checked: manager.hasVariants - onClicked: manager.setHasVariants(checked) + onClicked: manager.hasVariants = checked + + Connections + { + target: manager + onHasVariantsChanged: olssonBlockCheckBox.checked = manager.hasVariants + } } UM.I18nCatalog { id: catalog; name: "cura"; } From ebe221f604b9314a93ef029a379d04c620b4722b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 31 Jan 2018 08:43:40 +0100 Subject: [PATCH 468/551] Add origin to thumbnail relation This thumbnail is now about the g-code, so let the relation say that. Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 4089a1ae3a..ff4662ae3c 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -12,7 +12,7 @@ from UM.PluginRegistry import PluginRegistry #To get the g-code writer. class UFPWriter(MeshWriter): def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode): archive = VirtualFile() - archive.open_stream(stream, "application/x-ufp", OpenMode.WriteOnly) + archive.openStream(stream, "application/x-ufp", OpenMode.WriteOnly) #Store the g-code from the scene. archive.addContentType(extension = "gcode", mime_type = "text/x-gcode") From f54767ae9311b2f3e6eac300336956ab70a53a42 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 31 Jan 2018 08:45:52 +0100 Subject: [PATCH 469/551] Remove unused _namespaces field The code that used to use this is now in libSavitar. Discovered while working on issue CURA-4872. --- plugins/3MFReader/ThreeMFReader.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 09ed1e126d..1726818100 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import os.path @@ -37,10 +37,6 @@ class ThreeMFReader(MeshReader): super().__init__() self._supported_extensions = [".3mf"] self._root = None - self._namespaces = { - "3mf": "http://schemas.microsoft.com/3dmanufacturing/core/2015/02", - "cura": "http://software.ultimaker.com/xml/cura/3mf/2015/10" - } self._base_name = "" self._unit = None self._object_count = 0 # Used to name objects as there is no node name yet. From 2fe9860bb913d2a3fd57303ec5010b81cfbbacb9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 31 Jan 2018 08:51:10 +0100 Subject: [PATCH 470/551] Use streaming open function This way we can actually write the result to the correct stream rather than opening a random file separately (which was placeholder). Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index ff4662ae3c..7f471d03b2 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -29,7 +29,7 @@ class UFPWriter(MeshWriter): thumbnail = archive.getStream("/Metadata/thumbnail.png") thumbnail.write(open(os.path.join(os.path.dirname(__file__), "kitten.png"), "rb").read()) thumbnail.close() - archive.addRelation(virtual_path = "/Metadata/thumbnail.png", relation_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") + archive.addRelation(virtual_path = "/Metadata/thumbnail.png", relation_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail", origin = "/3D/model.gcode") archive.close() return True \ No newline at end of file From ac266581c6f9bb3871fb8614c55dc025343e0ea8 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Wed, 31 Jan 2018 10:32:08 +0100 Subject: [PATCH 471/551] Update_changelog_CURA-4886 Update to 3.2, CURA-4886 --- plugins/ChangeLogPlugin/ChangeLog.txt | 46 +++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index de895b3e41..195656fa4d 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -1,3 +1,49 @@ +[3.2.0] +*Tree support +Experimental tree-like support structure that uses ‘branches’ to support prints. Branches ‘grow’ and multiply towards towards the model, with fewer contact points than alternative support methods. This results in better surface finishes for organic-shaped prints. + +*Adaptive layers +Prints with a variable layer thickness which adapts to the angle of the model’s surfaces. The result is high-quality surface finishes with a marginally increased print time. This setting can be found under the experimental category. + +*Faster startup +Printer definitions are now loaded when adding a printer, instead of loading all available printers on startup. + +*Backface culling in layer view +Doubled frame rate by only rendering visible surfaces of the model in the layer view, instead of rendering the entire model. Good for lower spec GPUs as it is less resource-intensive. + +*Multi build plate +Experimental feature that creates separate build plates with shared settings in a single session, eliminating the need to clear the build plate multiple times. Multiple build plates can be sliced and sent to a printer or printer group in Cura Connect. This feature must be enabled manually in the preferences ‘general’ tab. + +*Improved mesh type selection +New button in the left toolbar to edit per model settings, giving the user more control over where to place support. Objects can be used as meshes, with a drop down list where ‘Print as support’, ‘Don't overlap support with other models’, ‘Modify settings for overlap with other models’, or ‘Modify settings for infill of other models’ can be specified. Contributed by fieldOfView. + +*View optimization +Quick camera controls introduced in version 3.1 have been revised to create more accurate isometric, front, left, and right views. + +*Updated sidebar to QtQuick 2.0 +Application framework updated to increase speed, achieve a better width and style fit, and gives users dropdown menus that are styled to fit the enabled Ultimaker Cura theme, instead of the operating system’s theme. + +*Hide sidebar +The sidebar can now be hidden/shown by selecting View > Expand/Collapse Sidebar, or with the hotkey CMD + E (Mac) or CTRL + E (PC and Linux). + +*Disable ‘Send slice information’ +A shortcut to disable ‘Send slice information’ has been added to the first launch to make it easier for privacy-conscious users to keep slice information private. + +*Signed binaries (Windows) +For security-conscious users, the Windows installer and Windows binaries have been digitally signed to prevent “Unknown application” warnings and virus scanner false-positives. + +*Start/end gcode script per extruder +Variables from both extruders in the start and end gcode snippets can now be accessed and edited, creating uniformity between profiles in different slicing environments. Contributed by fieldOfView. + +*OctoPrint plugin added to plugin browser +This plugin enables printers managed with OctoPrint to print via Ultimaker Cura interface (version 3.2 or later). + +*Bugfixes +- Fixed a bug where the mirror tool and center model options when used together would reset the model transformations +- Updated config file path to fix crashes caused by user config files that are located on remote drives +- Updated Arduino drivers to fix triggering errors during OTA updates in shared environments. This also fixes an issue when upgrading the firmware of the Ultimaker Original. +- Fixed an issue where arranging small models would fail, due to conflict with small model files combined with the “Ensure models are kept apart” option + [3.1.0] *Profile added for 0.25 mm print core This new print core gives extra fine line widths which gives prints extra definition and surface quality. From 68366ccc8df541767b14083fec986cc175dda112 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 31 Jan 2018 11:01:42 +0100 Subject: [PATCH 472/551] CURA-4897 Minor changes --- plugins/UltimakerMachineActions/UM2UpgradeSelection.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/UltimakerMachineActions/UM2UpgradeSelection.py b/plugins/UltimakerMachineActions/UM2UpgradeSelection.py index 0fd31ec445..e21256f6bd 100644 --- a/plugins/UltimakerMachineActions/UM2UpgradeSelection.py +++ b/plugins/UltimakerMachineActions/UM2UpgradeSelection.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Uranium is released under the terms of the LGPLv3 or higher. from UM.Settings.ContainerRegistry import ContainerRegistry @@ -21,8 +21,7 @@ class UM2UpgradeSelection(MachineAction): self._current_global_stack = None - from cura.CuraApplication import CuraApplication - CuraApplication.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) self._reset() def _reset(self): From e1da097970ca1dcadfbde6577f73ac7a3f634d3d Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Wed, 31 Jan 2018 12:55:41 +0100 Subject: [PATCH 473/551] Added Support Eraser Plugin This is the first draft of the Support Eraser tool. The plugin creates a cube mesh which has the `anti_overhang_mesh` decorator causing it to block the creation of support material for overhangs within its volume. This distinction is necessary to avoid confusing this behavior from actually erasing a _portion_ of a support structure. Some (non-necessary) improvements could be made such as: - Better graphical style - Discussion of whether the cube should be able to pass through the build plate or not - Possible improvements to the tool's icon - Placing the cube at a cursor click location --- plugins/SupportEraser/SupportEraser.py | 68 ++++++++++++++++++++++++++ plugins/SupportEraser/__init__.py | 20 ++++++++ plugins/SupportEraser/plugin.json | 8 +++ plugins/SupportEraser/tool_icon.svg | 11 +++++ 4 files changed, 107 insertions(+) create mode 100644 plugins/SupportEraser/SupportEraser.py create mode 100644 plugins/SupportEraser/__init__.py create mode 100644 plugins/SupportEraser/plugin.json create mode 100644 plugins/SupportEraser/tool_icon.svg diff --git a/plugins/SupportEraser/SupportEraser.py b/plugins/SupportEraser/SupportEraser.py new file mode 100644 index 0000000000..5a58d1bc2e --- /dev/null +++ b/plugins/SupportEraser/SupportEraser.py @@ -0,0 +1,68 @@ +from UM.Tool import Tool +from PyQt5.QtCore import Qt, QUrl +from UM.Application import Application +from UM.Event import Event +from UM.Mesh.MeshBuilder import MeshBuilder +from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation +from UM.Settings.SettingInstance import SettingInstance +from cura.Scene.CuraSceneNode import CuraSceneNode +from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator +from cura.Scene.BuildPlateDecorator import BuildPlateDecorator +from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator + +import os +import os.path + +class SupportEraser(Tool): + def __init__(self): + super().__init__() + self._shortcut_key = Qt.Key_G + self._controller = Application.getInstance().getController() + + def event(self, event): + super().event(event) + + if event.type == Event.ToolActivateEvent: + + # Load the remover mesh: + self._createEraserMesh() + + # After we load the mesh, deactivate the tool again: + self.getController().setActiveTool(None) + + def _createEraserMesh(self): + # Selection.clear() + + node = CuraSceneNode() + + node.setName("Eraser") + node.setSelectable(True) + mesh = MeshBuilder() + mesh.addCube(10,10,10) + node.setMeshData(mesh.build()) + + active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate + + node.addDecorator(SettingOverrideDecorator()) + node.addDecorator(BuildPlateDecorator(active_build_plate)) + node.addDecorator(SliceableObjectDecorator()) + + stack = node.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway. + if not stack: + node.addDecorator(SettingOverrideDecorator()) + stack = node.callDecoration("getStack") + + print(stack) + settings = stack.getTop() + + if not (settings.getInstance("anti_overhang_mesh") and settings.getProperty("anti_overhang_mesh", "value")): + definition = stack.getSettingDefinition("anti_overhang_mesh") + new_instance = SettingInstance(definition, settings) + new_instance.setProperty("value", True) + new_instance.resetState() # Ensure that the state is not seen as a user state. + settings.addInstance(new_instance) + + scene = self._controller.getScene() + op = AddSceneNodeOperation(node, scene.getRoot()) + op.push() + Application.getInstance().getController().getScene().sceneChanged.emit(node) diff --git a/plugins/SupportEraser/__init__.py b/plugins/SupportEraser/__init__.py new file mode 100644 index 0000000000..904a25b425 --- /dev/null +++ b/plugins/SupportEraser/__init__.py @@ -0,0 +1,20 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import SupportEraser + +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("uranium") + +def getMetaData(): + return { + "tool": { + "name": i18n_catalog.i18nc("@label", "Support Blocker"), + "description": i18n_catalog.i18nc("@info:tooltip", "Create a volume in which supports are not printed."), + "icon": "tool_icon.svg", + "weight": 4 + } + } + +def register(app): + return { "tool": SupportEraser.SupportEraser() } diff --git a/plugins/SupportEraser/plugin.json b/plugins/SupportEraser/plugin.json new file mode 100644 index 0000000000..5ccb639913 --- /dev/null +++ b/plugins/SupportEraser/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Support Eraser", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Creates an eraser mesh to block the printing of support in certain places", + "api": 4, + "i18n-catalog": "cura" +} diff --git a/plugins/SupportEraser/tool_icon.svg b/plugins/SupportEraser/tool_icon.svg new file mode 100644 index 0000000000..a0f8a3e3c3 --- /dev/null +++ b/plugins/SupportEraser/tool_icon.svg @@ -0,0 +1,11 @@ + + + Created with Sketch. + + + + + + + + From 3927c70625108c71ba63045bc7d1dd6a595db8d0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 31 Jan 2018 13:31:48 +0100 Subject: [PATCH 474/551] Fix material_diameter handling in ExtruderStacks CURA-4898 --- cura/Settings/ExtruderStack.py | 36 ++++++++++++++++------ cura/Settings/MachineManager.py | 8 +++++ resources/definitions/fdmextruder.def.json | 24 +++++++++++++++ 3 files changed, 59 insertions(+), 9 deletions(-) diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index 0854964898..6f89d33393 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -60,18 +60,33 @@ class ExtruderStack(CuraContainerStack): keys_to_copy = ["material_diameter", "machine_nozzle_size"] # these will be copied over to all extruders for key in keys_to_copy: - # Since material_diameter is not on the extruder definition, we need to add it here - # WARNING: this might be very dangerous and should be refactored ASAP! - definition = stack.getSettingDefinition(key) - if definition: - self.definition.addDefinition(definition) - # Only copy the value when this extruder doesn't have the value. if self.definitionChanges.hasProperty(key, "value"): continue - setting_value = stack.definitionChanges.getProperty(key, "value") - if setting_value is None: + # WARNING: this might be very dangerous and should be refactored ASAP! + # + # We cannot add a setting definition of "material_diameter" into the extruder's definition at runtime + # because all other machines which uses "fdmextruder" as the extruder definition will be affected. + # + # The problem is that single extrusion machines have their default material diameter defined in the global + # definitions. Now we automatically create an extruder stack for those machines using "fdmextruder" + # definition, which doesn't have the specific "material_diameter" and "machine_nozzle_size" defined for + # each machine. This results in wrong values which can be found in the MachineSettings dialog. + # + # To solve this, we put "material_diameter" back into the "fdmextruder" definition because modifying it in + # the extruder definition will affect all machines which uses the "fdmextruder" definition. Moreover, now + # we also check the value defined in the machine definition. If present, the value defined in the global + # stack's definition changes container will be copied. Otherwise, we will check if the default values in the + # machine definition and the extruder definition are the same, and if not, the default value in the machine + # definition will be copied to the extruder stack's definition changes. + # + setting_value_in_global_def_changes = stack.definitionChanges.getProperty(key, "value") + setting_value_in_global_def = stack.definition.getProperty(key, "value") + setting_value = setting_value_in_global_def + if setting_value_in_global_def_changes is not None: + setting_value = setting_value_in_global_def_changes + if setting_value == self.definition.getProperty(key, "value"): continue setting_definition = stack.getSettingDefinition(key) @@ -83,8 +98,11 @@ class ExtruderStack(CuraContainerStack): # Make sure the material diameter is up to date for the extruder stack. if key == "material_diameter": + from cura.CuraApplication import CuraApplication + machine_manager = CuraApplication.getInstance().getMachineManager() position = self.getMetaDataEntry("position", "0") - Application.getInstance().getExtruderManager().updateMaterialForDiameter(position) + func = lambda p = position: CuraApplication.getInstance().getExtruderManager().updateMaterialForDiameter(p) + machine_manager.machine_extruder_material_update_dict[stack.getId()].append(func) # NOTE: We cannot remove the setting from the global stack's definition changes container because for # material diameter, it needs to be applied to all extruders, but here we don't know how many extruders diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e84f8d2237..1ce6e4b9c2 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1,6 +1,7 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import collections import time #Type hinting. from typing import Union, List, Dict @@ -51,6 +52,8 @@ class MachineManager(QObject): self._active_container_stack = None # type: CuraContainerStack self._global_container_stack = None # type: GlobalStack + self.machine_extruder_material_update_dict = collections.defaultdict(list) + # Used to store the new containers until after confirming the dialog self._new_variant_container = None self._new_material_container = None @@ -317,6 +320,11 @@ class MachineManager(QObject): extruder_stack.propertyChanged.connect(self._onPropertyChanged) extruder_stack.containersChanged.connect(self._onInstanceContainersChanged) + if self._global_container_stack.getId() in self.machine_extruder_material_update_dict: + for func in self.machine_extruder_material_update_dict[self._global_container_stack.getId()]: + Application.getInstance().callLater(func) + del self.machine_extruder_material_update_dict[self._global_container_stack.getId()] + self._error_check_timer.start() ## Update self._stacks_valid according to _checkStacksForErrors and emit if change. diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json index 2b314cd6a5..3f84ed69a4 100644 --- a/resources/definitions/fdmextruder.def.json +++ b/resources/definitions/fdmextruder.def.json @@ -216,6 +216,30 @@ "enabled": false } } + }, + "material": + { + "label": "Material", + "icon": "category_material", + "description": "Material", + "type": "category", + "children": + { + "material_diameter": + { + "label": "Diameter", + "description": "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament.", + "unit": "mm", + "type": "float", + "default_value": 2.85, + "minimum_value": "0.0001", + "minimum_value_warning": "0.4", + "maximum_value_warning": "3.5", + "enabled": "machine_gcode_flavor != \"UltiGCode\"", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } } } } From 9d267cb9c7828393818e1f3f9a4a4d66bca1569e Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 31 Jan 2018 14:36:16 +0100 Subject: [PATCH 475/551] Check if there is any gcode in the scene before executing a post process --- plugins/PostProcessingPlugin/PostProcessingPlugin.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.py b/plugins/PostProcessingPlugin/PostProcessingPlugin.py index 657e5c5387..2c6fc3f492 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.py +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.py @@ -54,6 +54,9 @@ class PostProcessingPlugin(QObject, Extension): ## Execute all post-processing scripts on the gcode. def execute(self, output_device): scene = Application.getInstance().getController().getScene() + # If the scene does not have a gcode, do nothing + if not hasattr(scene, "gcode_dict"): + return gcode_dict = getattr(scene, "gcode_dict") if not gcode_dict: return From e5c72cfdc5cef3d1cb995d5e9504e45fb94216c6 Mon Sep 17 00:00:00 2001 From: alekseisasin Date: Wed, 31 Jan 2018 14:58:44 +0100 Subject: [PATCH 476/551] Validate material profile CURA-4851 --- cura/Settings/ContainerManager.py | 5 +++-- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 6 ++++++ resources/qml/Preferences/MaterialsPage.qml | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 21fc3f43c0..aae4f5a23e 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -459,7 +459,7 @@ class ContainerManager(QObject): # \return \type{Dict} dict with a 'status' key containing the string 'success' or 'error', and a 'message' key # containing a message for the user @pyqtSlot(QUrl, result = "QVariantMap") - def importContainer(self, file_url_or_string: Union[QUrl, str]) -> Dict[str, str]: + def importMaterialContainer(self, file_url_or_string: Union[QUrl, str]) -> Dict[str, str]: if not file_url_or_string: return { "status": "error", "message": "Invalid path"} @@ -490,8 +490,9 @@ class ContainerManager(QObject): container.deserialize(f.read()) except PermissionError: return { "status": "error", "message": "Permission denied when trying to read the file"} + except Exception as ex: + return {"status": "error", "message": str(ex)} - container.setName(container_id) container.setDirty(True) self._container_registry.addContainer(container) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 18b043806c..cdbbd1839e 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -17,6 +17,8 @@ import UM.Dictionary from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry +from .XmlMaterialValidator import XmlMaterialValidater + ## Handles serializing and deserializing material containers from an XML file class XmlMaterialProfile(InstanceContainer): CurrentFdmMaterialVersion = "1.3" @@ -480,6 +482,10 @@ class XmlMaterialProfile(InstanceContainer): if "adhesion_info" not in meta_data: meta_data["adhesion_info"] = "" + validation_message = XmlMaterialValidater.validateMaterialMetaDate(meta_data) + if validation_message is not None: + raise Exception("Not valid material profile: %s" % (validation_message)) + property_values = {} properties = data.iterfind("./um:properties/*", self.__namespaces) for entry in properties: diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index 228f9c8ea2..fa2c68ef36 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -301,7 +301,7 @@ UM.ManagementPage folder: CuraApplication.getDefaultPath("dialog_material_path") onAccepted: { - var result = Cura.ContainerManager.importContainer(fileUrl) + var result = Cura.ContainerManager.importMaterialContainer(fileUrl) messageDialog.title = catalog.i18nc("@title:window", "Import Material") messageDialog.text = catalog.i18nc("@info:status Don't translate the XML tags or !", "Could not import material %1: %2").arg(fileUrl).arg(result.message) From a446ca2759170b78bb17d14fdc15c9d5c9e00010 Mon Sep 17 00:00:00 2001 From: alekseisasin Date: Wed, 31 Jan 2018 15:00:46 +0100 Subject: [PATCH 477/551] Material container validation CURA-4851 --- .../XmlMaterialValidator.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 plugins/XmlMaterialProfile/XmlMaterialValidator.py diff --git a/plugins/XmlMaterialProfile/XmlMaterialValidator.py b/plugins/XmlMaterialProfile/XmlMaterialValidator.py new file mode 100644 index 0000000000..42fd505e2d --- /dev/null +++ b/plugins/XmlMaterialProfile/XmlMaterialValidator.py @@ -0,0 +1,31 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + + + +class XmlMaterialValidater(): + + @classmethod + def validateMaterialMetaDate(cls, validation_metadata): + + if validation_metadata.get("GUID") is None: + return "Missing GUID" + + if validation_metadata.get("brand") is None: + return "Missing Brand" + + if validation_metadata.get("material") is None: + return "Missing Material" + + if validation_metadata.get("version") is None: + return "Missing Version" + + if validation_metadata.get("description") is None: + return "Missing Description" + + if validation_metadata.get("adhesion_info") is None: + return "Missing Adhesion Info" + + return None + + From 9b8e7cb7229b9dd918c1cb61622e106f2ccfebd1 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Wed, 31 Jan 2018 15:46:30 +0100 Subject: [PATCH 478/551] Update_changelog_CURA-4886 Update to 3.2 --- plugins/ChangeLogPlugin/ChangeLog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 195656fa4d..6b394f1e2e 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -1,6 +1,6 @@ [3.2.0] *Tree support -Experimental tree-like support structure that uses ‘branches’ to support prints. Branches ‘grow’ and multiply towards towards the model, with fewer contact points than alternative support methods. This results in better surface finishes for organic-shaped prints. +Experimental tree-like support structure that uses ‘branches’ to support prints. Branches ‘grow’ and multiply towards the model, with fewer contact points than alternative support methods. This results in better surface finishes for organic-shaped prints. *Adaptive layers Prints with a variable layer thickness which adapts to the angle of the model’s surfaces. The result is high-quality surface finishes with a marginally increased print time. This setting can be found under the experimental category. From f3372bce7c1aed470910a4e592047ba728b5e897 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Wed, 31 Jan 2018 16:03:20 +0100 Subject: [PATCH 479/551] Added 2018 copyright and license information --- plugins/SupportEraser/SupportEraser.py | 3 +++ plugins/SupportEraser/__init__.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/SupportEraser/SupportEraser.py b/plugins/SupportEraser/SupportEraser.py index 5a58d1bc2e..b91c5e10b6 100644 --- a/plugins/SupportEraser/SupportEraser.py +++ b/plugins/SupportEraser/SupportEraser.py @@ -1,3 +1,6 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + from UM.Tool import Tool from PyQt5.QtCore import Qt, QUrl from UM.Application import Application diff --git a/plugins/SupportEraser/__init__.py b/plugins/SupportEraser/__init__.py index 904a25b425..72700571fe 100644 --- a/plugins/SupportEraser/__init__.py +++ b/plugins/SupportEraser/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from . import SupportEraser From c42f1868124a5c8d0b67f3235671f2c30707895f Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 31 Jan 2018 17:08:32 +0100 Subject: [PATCH 480/551] CURA-4425 first thumbnail in UFP file; updated CuraSceneModel and PreviewPass --- cura/PreviewPass.py | 17 +++++--- cura/Scene/CuraSceneNode.py | 72 +++++++++++++++++++++++++++++++++ cura/Snapshot.py | 74 ++++++++++++++++++++++++++++++++++ plugins/UFPWriter/UFPWriter.py | 40 +++++++++++++----- 4 files changed, 189 insertions(+), 14 deletions(-) create mode 100644 cura/Snapshot.py diff --git a/cura/PreviewPass.py b/cura/PreviewPass.py index c1880e82ef..af42b59b78 100644 --- a/cura/PreviewPass.py +++ b/cura/PreviewPass.py @@ -1,7 +1,7 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Uranium is released under the terms of the LGPLv3 or higher. - +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. from UM.Application import Application +from UM.Math.Color import Color from UM.Resources import Resources from UM.View.RenderPass import RenderPass @@ -39,7 +39,11 @@ class PreviewPass(RenderPass): def render(self) -> None: if not self._shader: - self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "object.shader")) + self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "overhang.shader")) + self._shader.setUniformValue("u_overhangAngle", 1.0) + + self._gl.glClearColor(0.0, 0.0, 0.0, 0.0) + self._gl.glClear(self._gl.GL_COLOR_BUFFER_BIT | self._gl.GL_DEPTH_BUFFER_BIT) # Create a new batch to be rendered batch = RenderBatch(self._shader) @@ -47,7 +51,9 @@ class PreviewPass(RenderPass): # Fill up the batch with objects that can be sliced. ` for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible(): - batch.addItem(node.getWorldTransformation(), node.getMeshData()) + uniforms = {} + uniforms["diffuse_color"] = node.getDiffuseColor() + batch.addItem(node.getWorldTransformation(), node.getMeshData(), uniforms = uniforms) self.bind() if self._camera is None: @@ -55,3 +61,4 @@ class PreviewPass(RenderPass): else: batch.render(self._camera) self.release() + diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py index 1bffe4392b..0dbcdd30c3 100644 --- a/cura/Scene/CuraSceneNode.py +++ b/cura/Scene/CuraSceneNode.py @@ -1,7 +1,10 @@ +from typing import List + from UM.Application import Application from UM.Logger import Logger from UM.Scene.SceneNode import SceneNode from copy import deepcopy +from cura.Settings.ExtrudersModel import ExtrudersModel ## Scene nodes that are models are only seen when selecting the corresponding build plate @@ -23,6 +26,75 @@ class CuraSceneNode(SceneNode): def isSelectable(self) -> bool: return super().isSelectable() and self.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate + def getPrintingExtruderPosition(self) -> int: + # took bits and pieces from extruders model, solid view + + global_container_stack = Application.getInstance().getGlobalContainerStack() + per_mesh_stack = self.callDecoration("getStack") + # It's only set if you explicitly choose an extruder + extruder_id = self.callDecoration("getActiveExtruder") + + machine_extruder_count = global_container_stack.getProperty("machine_extruder_count", "value") + + extruder_index = 0 + + for extruder in Application.getInstance().getExtruderManager().getMachineExtruders(global_container_stack.getId()): + position = extruder.getMetaDataEntry("position", default = "0") # Get the position + try: + position = int(position) + except ValueError: + # Not a proper int. + position = -1 + if position > machine_extruder_count: + continue + + # Find out the extruder index if we know the id. + if extruder_id is not None and extruder_id == extruder.getId(): + extruder_index = position + break + + # Use the support extruder instead of the active extruder if this is a support_mesh + if per_mesh_stack: + if per_mesh_stack.getProperty("support_mesh", "value"): + extruder_index = int(global_container_stack.getProperty("support_extruder_nr", "value")) + + return extruder_index + + def getDiffuseColor(self) -> List[float]: + # took bits and pieces from extruders model, solid view + + global_container_stack = Application.getInstance().getGlobalContainerStack() + machine_extruder_count = global_container_stack.getProperty("machine_extruder_count", "value") + + extruder_index = self.getPrintingExtruderPosition() + + material_color = ExtrudersModel.defaultColors[extruder_index] + + # Collect color from the extruder we want + for extruder in Application.getInstance().getExtruderManager().getMachineExtruders(global_container_stack.getId()): + position = extruder.getMetaDataEntry("position", default = "0") # Get the position + try: + position = int(position) + except ValueError: + # Not a proper int. + position = -1 + if position > machine_extruder_count: + continue + + if extruder.material and position == extruder_index: + material_color = extruder.material.getMetaDataEntry("color_code", default = material_color) + break + + # Colors are passed as rgb hex strings (eg "#ffffff"), and the shader needs + # an rgba list of floats (eg [1.0, 1.0, 1.0, 1.0]) + return [ + int(material_color[1:3], 16) / 255, + int(material_color[3:5], 16) / 255, + int(material_color[5:7], 16) / 255, + 1.0 + ] + + ## Taken from SceneNode, but replaced SceneNode with CuraSceneNode def __deepcopy__(self, memo): copy = CuraSceneNode() diff --git a/cura/Snapshot.py b/cura/Snapshot.py new file mode 100644 index 0000000000..83881dbdee --- /dev/null +++ b/cura/Snapshot.py @@ -0,0 +1,74 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. +from PyQt5 import QtCore + +from cura.PreviewPass import PreviewPass + +from UM.Application import Application +from UM.Math.AxisAlignedBox import AxisAlignedBox +from UM.Math.Matrix import Matrix +from UM.Math.Vector import Vector +from UM.Scene.Camera import Camera +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator + + +class Snapshot: + @staticmethod + def snapshot(width = 300, height = 300): + scene = Application.getInstance().getController().getScene() + cam = scene.getActiveCamera() + render_width, render_height = cam.getWindowSize() + pp = PreviewPass(render_width, render_height) + + root = scene.getRoot() + camera = Camera("snapshot", root) + + # determine zoom and look at + bbox = None + for node in DepthFirstIterator(root): + if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible(): + if bbox is None: + bbox = node.getBoundingBox() + else: + bbox += node.getBoundingBox() + if bbox is None: + bbox = AxisAlignedBox() + look_at = bbox.center + size = max(bbox.width, bbox.height, bbox.depth * 0.5) + + looking_from_offset = Vector(1, 1, 2) + if size > 0: + # determine the watch distance depending on the size + looking_from_offset = looking_from_offset * size * 1.3 + camera.setViewportSize(render_width, render_height) + camera.setWindowSize(render_width, render_height) + camera.setPosition(look_at + looking_from_offset) + camera.lookAt(look_at) + + # Somehow the aspect ratio is also influenced in reverse by the screen width/height + # So you have to set it to render_width/render_height to get 1 + projection_matrix = Matrix() + projection_matrix.setPerspective(30, render_width / render_height, 1, 500) + + camera.setProjectionMatrix(projection_matrix) + + pp.setCamera(camera) + pp.setSize(render_width, render_height) # texture size + pp.render() + pixel_output = pp.getOutput() + + # It's a bit annoying that window size has to be taken into account + if pixel_output.width() >= pixel_output.height(): + # Scale it to the correct height + image = pixel_output.scaledToHeight(height, QtCore.Qt.SmoothTransformation) + # Then chop of the width + cropped_image = image.copy(image.width() // 2 - width // 2, 0, width, height) + else: + # Scale it to the correct width + image = pixel_output.scaledToWidth(width, QtCore.Qt.SmoothTransformation) + # Then chop of the height + cropped_image = image.copy(0, image.height() // 2 - height // 2, width, height) + + return cropped_image + # if cropped_image.save("/home/jack/preview.png"): + # print("yooo") diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 7f471d03b2..4e7463735c 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -3,13 +3,29 @@ from charon.VirtualFile import VirtualFile #To open UFP files. from charon.OpenMode import OpenMode #To indicate that we want to write to UFP files. -from io import StringIO #For converting g-code to bytes. +from io import BytesIO, StringIO #For converting g-code to bytes. import os.path #To get the placeholder kitty icon. +from UM.Application import Application +from UM.Logger import Logger from UM.Mesh.MeshWriter import MeshWriter #The writer we need to implement. from UM.PluginRegistry import PluginRegistry #To get the g-code writer. +from PyQt5.QtCore import QBuffer + +from cura.Snapshot import Snapshot + class UFPWriter(MeshWriter): + def __init__(self): + super().__init__() + self._snapshot = None + Application.getInstance().getOutputDeviceManager().writeStarted.connect(self._createSnapshot) + + def _createSnapshot(self, *args): + # must be called from the main thread because of OpenGL + Logger.log("d", "Creating thumbnail image...") + self._snapshot = Snapshot.snapshot() + def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode): archive = VirtualFile() archive.openStream(stream, "application/x-ufp", OpenMode.WriteOnly) @@ -20,16 +36,22 @@ class UFPWriter(MeshWriter): PluginRegistry.getInstance().getPluginObject("GCodeWriter").write(gcode_textio, None) gcode = archive.getStream("/3D/model.gcode") gcode.write(gcode_textio.getvalue().encode("UTF-8")) - gcode.close() archive.addRelation(virtual_path = "/3D/model.gcode", relation_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") #Store the thumbnail. - #TODO: Generate the thumbnail image. Below is just a placeholder. - archive.addContentType(extension = "png", mime_type = "image/png") - thumbnail = archive.getStream("/Metadata/thumbnail.png") - thumbnail.write(open(os.path.join(os.path.dirname(__file__), "kitten.png"), "rb").read()) - thumbnail.close() - archive.addRelation(virtual_path = "/Metadata/thumbnail.png", relation_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail", origin = "/3D/model.gcode") + if self._snapshot: + archive.addContentType(extension = "png", mime_type = "image/png") + thumbnail = archive.getStream("/Metadata/thumbnail.png") + + thumbnail_buffer = QBuffer() + thumbnail_buffer.open(QBuffer.ReadWrite) + thumbnail_image = self._snapshot + thumbnail_image.save(thumbnail_buffer, "PNG") + + thumbnail.write(thumbnail_buffer.data()) + archive.addRelation(virtual_path = "/Metadata/thumbnail.png", relation_type = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail", origin = "/3D/model.gcode") + else: + Logger.log("d", "Thumbnail not created, cannot save it") archive.close() - return True \ No newline at end of file + return True From a34ca45c38c3ae1cedb3aa8415688b02211b606c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 31 Jan 2018 17:08:49 +0100 Subject: [PATCH 481/551] Remove outdated UCP writer The real file extension became .ufp. The plug-in was rewritten. Contributes to issue CURA-4872. --- plugins/UCPWriter/UCPWriter.py | 68 ---------------------------------- plugins/UCPWriter/__init__.py | 25 ------------- plugins/UCPWriter/plugin.json | 8 ---- 3 files changed, 101 deletions(-) delete mode 100644 plugins/UCPWriter/UCPWriter.py delete mode 100644 plugins/UCPWriter/__init__.py delete mode 100644 plugins/UCPWriter/plugin.json diff --git a/plugins/UCPWriter/UCPWriter.py b/plugins/UCPWriter/UCPWriter.py deleted file mode 100644 index cd858b912a..0000000000 --- a/plugins/UCPWriter/UCPWriter.py +++ /dev/null @@ -1,68 +0,0 @@ -import zipfile - -from io import StringIO - -from UM.Resources import Resources -from UM.Mesh.MeshWriter import MeshWriter -from UM.Logger import Logger -from UM.PluginRegistry import PluginRegistry - -MYPY = False -try: - if not MYPY: - import xml.etree.cElementTree as ET -except ImportError: - Logger.log("w", "Unable to load cElementTree, switching to slower version") - import xml.etree.ElementTree as ET - - -class UCPWriter(MeshWriter): - def __init__(self): - super().__init__() - self._namespaces = { - "content-types": "http://schemas.openxmlformats.org/package/2006/content-types", - "relationships": "http://schemas.openxmlformats.org/package/2006/relationships", - } - - def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode): - self._archive = None # Reset archive - archive = zipfile.ZipFile(stream, "w", compression=zipfile.ZIP_DEFLATED) - - gcode_file = zipfile.ZipInfo("3D/model.gcode") - gcode_file.compress_type = zipfile.ZIP_DEFLATED - - # Create content types file - content_types_file = zipfile.ZipInfo("[Content_Types].xml") - content_types_file.compress_type = zipfile.ZIP_DEFLATED - content_types = ET.Element("Types", xmlns=self._namespaces["content-types"]) - - rels_type = ET.SubElement(content_types, "Default", Extension="rels", - ContentType="application/vnd.openxmlformats-package.relationships+xml") - gcode_type = ET.SubElement(content_types, "Default", Extension="gcode", - ContentType="text/x-gcode") - image_type = ET.SubElement(content_types, "Default", Extension="png", - ContentType="image/png") - - # Create _rels/.rels file - relations_file = zipfile.ZipInfo("_rels/.rels") - relations_file.compress_type = zipfile.ZIP_DEFLATED - relations_element = ET.Element("Relationships", xmlns=self._namespaces["relationships"]) - - thumbnail_relation_element = ET.SubElement(relations_element, "Relationship", Target="/Metadata/thumbnail.png", Id="rel0", - Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail") - - model_relation_element = ET.SubElement(relations_element, "Relationship", Target="/3D/model.gcode", - Id="rel1", - Type="http://schemas.ultimaker.org/package/2018/relationships/gcode") - - gcode_string = StringIO() - - PluginRegistry.getInstance().getPluginObject("GCodeWriter").write(gcode_string, None) - - archive.write(Resources.getPath(Resources.Images, "cura-icon.png"), "Metadata/thumbnail.png") - - archive.writestr(gcode_file, gcode_string.getvalue()) - archive.writestr(content_types_file, b' \n' + ET.tostring(content_types)) - archive.writestr(relations_file, b' \n' + ET.tostring(relations_element)) - - archive.close() diff --git a/plugins/UCPWriter/__init__.py b/plugins/UCPWriter/__init__.py deleted file mode 100644 index 24a4856c34..0000000000 --- a/plugins/UCPWriter/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Uranium is released under the terms of the LGPLv3 or higher. - -from . import UCPWriter - -from UM.i18n import i18nCatalog - -i18n_catalog = i18nCatalog("cura") - -def getMetaData(): - return { - "mesh_writer": { - "output": [ - { - "mime_type": "application/x-ucp", - "mode": UCPWriter.UCPWriter.OutputMode.BinaryMode, - "extension": "UCP", - "description": i18n_catalog.i18nc("@item:inlistbox", "UCP File (WIP)") - } - ] - } - } - -def register(app): - return { "mesh_writer": UCPWriter.UCPWriter() } diff --git a/plugins/UCPWriter/plugin.json b/plugins/UCPWriter/plugin.json deleted file mode 100644 index d1e3ce3d1c..0000000000 --- a/plugins/UCPWriter/plugin.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "UCP Writer", - "author": "Ultimaker B.V.", - "version": "1.0.0", - "description": "Provides support for writing UCP files.", - "api": 4, - "i18n-catalog": "cura" -} From 08c64d28cfb383f8d6bd76b11aa0ddc3797b32dd Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Thu, 1 Feb 2018 09:37:06 +0100 Subject: [PATCH 482/551] Typo in XmlValidator CURA-4851 --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 4 ++-- plugins/XmlMaterialProfile/XmlMaterialValidator.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index cdbbd1839e..52ee45af62 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -17,7 +17,7 @@ import UM.Dictionary from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry -from .XmlMaterialValidator import XmlMaterialValidater +from .XmlMaterialValidator import XmlMaterialValidator ## Handles serializing and deserializing material containers from an XML file class XmlMaterialProfile(InstanceContainer): @@ -482,7 +482,7 @@ class XmlMaterialProfile(InstanceContainer): if "adhesion_info" not in meta_data: meta_data["adhesion_info"] = "" - validation_message = XmlMaterialValidater.validateMaterialMetaDate(meta_data) + validation_message = XmlMaterialValidator.validateMaterialMetaDate(meta_data) if validation_message is not None: raise Exception("Not valid material profile: %s" % (validation_message)) diff --git a/plugins/XmlMaterialProfile/XmlMaterialValidator.py b/plugins/XmlMaterialProfile/XmlMaterialValidator.py index 42fd505e2d..0d5db4b096 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialValidator.py +++ b/plugins/XmlMaterialProfile/XmlMaterialValidator.py @@ -3,7 +3,7 @@ -class XmlMaterialValidater(): +class XmlMaterialValidator(): @classmethod def validateMaterialMetaDate(cls, validation_metadata): From 37733f51ad3ad15de205fa49c4a8379543fec2df Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Thu, 1 Feb 2018 09:44:00 +0100 Subject: [PATCH 483/551] Correct name CURA-4851 --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 +- plugins/XmlMaterialProfile/XmlMaterialValidator.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 52ee45af62..39cbe5669c 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -482,7 +482,7 @@ class XmlMaterialProfile(InstanceContainer): if "adhesion_info" not in meta_data: meta_data["adhesion_info"] = "" - validation_message = XmlMaterialValidator.validateMaterialMetaDate(meta_data) + validation_message = XmlMaterialValidator.validateMaterialMetaData(meta_data) if validation_message is not None: raise Exception("Not valid material profile: %s" % (validation_message)) diff --git a/plugins/XmlMaterialProfile/XmlMaterialValidator.py b/plugins/XmlMaterialProfile/XmlMaterialValidator.py index 0d5db4b096..3590dbb218 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialValidator.py +++ b/plugins/XmlMaterialProfile/XmlMaterialValidator.py @@ -6,7 +6,7 @@ class XmlMaterialValidator(): @classmethod - def validateMaterialMetaDate(cls, validation_metadata): + def validateMaterialMetaData(cls, validation_metadata): if validation_metadata.get("GUID") is None: return "Missing GUID" From cfb5d71c2796d1e5dae96f8e03c37f728482f9e2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 1 Feb 2018 10:34:38 +0100 Subject: [PATCH 484/551] Fix imports Needs to be a capital letter now. Also remove the unused one (the kitty is no longer there). Contributes to issue CURA-4872. --- plugins/UFPWriter/UFPWriter.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 4e7463735c..0f49a30403 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -1,10 +1,9 @@ #Copyright (c) 2018 Ultimaker B.V. #Cura is released under the terms of the LGPLv3 or higher. -from charon.VirtualFile import VirtualFile #To open UFP files. -from charon.OpenMode import OpenMode #To indicate that we want to write to UFP files. -from io import BytesIO, StringIO #For converting g-code to bytes. -import os.path #To get the placeholder kitty icon. +from Charon.VirtualFile import VirtualFile #To open UFP files. +from Charon.OpenMode import OpenMode #To indicate that we want to write to UFP files. +from io import StringIO #For converting g-code to bytes. from UM.Application import Application from UM.Logger import Logger From b4eb2e173c6636f436dda16052e863faad0379ff Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 1 Feb 2018 10:49:02 +0100 Subject: [PATCH 485/551] CURA-4425 fix multiple objects in snapshot; the AxisAlignedBox is supposed to be read-only --- cura/Snapshot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Snapshot.py b/cura/Snapshot.py index 83881dbdee..dc60f4ffda 100644 --- a/cura/Snapshot.py +++ b/cura/Snapshot.py @@ -30,7 +30,7 @@ class Snapshot: if bbox is None: bbox = node.getBoundingBox() else: - bbox += node.getBoundingBox() + bbox = bbox + node.getBoundingBox() if bbox is None: bbox = AxisAlignedBox() look_at = bbox.center From 76703ce23cc1ec3193ae4043dba5018293e7190a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 1 Feb 2018 10:53:42 +0100 Subject: [PATCH 486/551] Add a validation script for preset settings files CURA-3710 --- tools/check_preset_settings.py | 126 +++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 tools/check_preset_settings.py diff --git a/tools/check_preset_settings.py b/tools/check_preset_settings.py new file mode 100644 index 0000000000..5ba6d9724b --- /dev/null +++ b/tools/check_preset_settings.py @@ -0,0 +1,126 @@ +import configparser +import json +import os +import sys + + +class PresetSettingsValidator: + + def __init__(self, cura_dir: str): + self._cura_dir = os.path.abspath(cura_dir) + self._resource_dir = os.path.join(self._cura_dir, "resources") + self._definitions_dir = os.path.join(self._resource_dir, "definitions") + self._preset_settings_dir = os.path.join(self._resource_dir, "visibility_presets") + + self._fdmprinter_def_path = os.path.join(self._definitions_dir, "fdmprinter.def.json") + + def validate(self) -> bool: + """ + Validates the preset settings files and returns True or False indicating whether there are invalid files. + """ + if not os.path.isfile(self._fdmprinter_def_path): + raise FileNotFoundError("[%s] is not a file or doesn't exist, please make sure you have specified the correct cura directory [%s]." % (self._fdmprinter_def_path, self._cura_dir)) + + if not os.path.isdir(self._preset_settings_dir): + raise FileNotFoundError("[%s] is not a directory or doesn't exist, please make sure you have specified the correct cura directory [%s]." % (self._preset_settings_dir, self._cura_dir)) + + # parse the definition file + setting_tree_dict = self._parse_definition_file(self._fdmprinter_def_path) + + has_invalid_files = False + + # go through all the preset settings files + for root_dir, _, filenames in os.walk(self._preset_settings_dir): + for filename in filenames: + file_path = os.path.join(root_dir, filename) + print("Validating [%s] ..." % file_path) + + incorrect_sections = [] + incorrect_settings = {} + + parser = configparser.ConfigParser(allow_no_value = True) + with open(file_path, "r", encoding = "utf-8") as f: + parser.read_file(f) + + for key in parser: + # skip general + if key in ("general", configparser.DEFAULTSECT): + continue + + if key not in setting_tree_dict: + incorrect_sections.append(key) + continue + + for setting_key in parser[key]: + if setting_key not in setting_tree_dict[key]: + if setting_key not in incorrect_settings: + incorrect_settings[setting_key] = {"seen_in": [], + "should_be_in": self._should_setting_be_in(setting_tree_dict, setting_key)} + + incorrect_settings[setting_key]["seen_in"].append(key) + + # show results + print("==========================================") + if incorrect_settings or incorrect_settings: + has_invalid_files = True + print("[INVALID] [%s] is invalid, details below" % file_path) + + # show details + for section_name in incorrect_sections: + print(" -- section name [%s] is incorrect, please check fdmprinter.def.json." % section_name) + for setting_name, details_dict in incorrect_settings.items(): + msg = " -- setting [%s] is found in sections [%s], " % (setting_name, ", ".join(details_dict["seen_in"])) + if details_dict["should_be_in"] is not None: + msg += "but should be in section [%s] only." % details_dict["should_be_in"] + else: + msg += "but it cannot be found in fdmprinter.def.json" + print(msg) + + else: + print("[%s] is valid" % file_path) + print("==========================================") + + return not has_invalid_files + + def _parse_definition_file(self, file_path: str): + with open(file_path, "r", encoding = "utf-8") as f: + def_dict = json.load(f, encoding = "utf-8") + + tree_dict = {} + for key, item in def_dict.get("settings", {}).items(): + setting_list = [] + self._generate_tree(setting_list, item.get("children", {})) + tree_dict[key] = setting_list + + return tree_dict + + def _generate_tree(self, setting_list: list, setting_dict: dict): + for key, item in setting_dict.items(): + setting_list.append(key) + if "children" in item: + self._generate_tree(setting_list, item["children"]) + + def _should_setting_be_in(self, setting_dict: dict, setting_name: str) -> str: + """ + Check which section the given setting belongs to. Returns None if the setting cannot be found. + """ + section_name = None + for key, setting_list in setting_dict.items(): + if setting_name in setting_list: + section_name = key + break + return section_name + + +if __name__ == "__main__": + script_dir = os.path.dirname(os.path.realpath(__file__)) + cura_dir = os.path.abspath(os.path.join(script_dir, "..")) + + validator = PresetSettingsValidator(cura_dir) + is_everything_validate = validator.validate() + + if not is_everything_validate: + print("Please") + + ret_code = 0 if is_everything_validate else 1 + sys.exit(ret_code) From c5cafff8aa5cbfb44bf1a1817e2a81ab6195e6be Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 1 Feb 2018 10:56:10 +0100 Subject: [PATCH 487/551] Add Sha Bang for tool python scripts CURA-3710 --- tools/check_preset_settings.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/check_preset_settings.py b/tools/check_preset_settings.py index 5ba6d9724b..9ee3615d67 100644 --- a/tools/check_preset_settings.py +++ b/tools/check_preset_settings.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python import configparser import json import os From cf68d57148ec5c7189285aea64b62dcb8e68099b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 1 Feb 2018 10:57:49 +0100 Subject: [PATCH 488/551] Clean up check_preset_settings.py CURA-3710 --- tools/check_preset_settings.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tools/check_preset_settings.py b/tools/check_preset_settings.py index 9ee3615d67..675075ee07 100644 --- a/tools/check_preset_settings.py +++ b/tools/check_preset_settings.py @@ -120,8 +120,5 @@ if __name__ == "__main__": validator = PresetSettingsValidator(cura_dir) is_everything_validate = validator.validate() - if not is_everything_validate: - print("Please") - ret_code = 0 if is_everything_validate else 1 sys.exit(ret_code) From 3a6905c0e6a48f85d5bbedc817f9bbacfe33ae66 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Thu, 1 Feb 2018 11:05:17 +0100 Subject: [PATCH 489/551] Removed debug messages & unused code --- plugins/SupportEraser/SupportEraser.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/SupportEraser/SupportEraser.py b/plugins/SupportEraser/SupportEraser.py index b91c5e10b6..9e2d41014d 100644 --- a/plugins/SupportEraser/SupportEraser.py +++ b/plugins/SupportEraser/SupportEraser.py @@ -34,8 +34,6 @@ class SupportEraser(Tool): self.getController().setActiveTool(None) def _createEraserMesh(self): - # Selection.clear() - node = CuraSceneNode() node.setName("Eraser") @@ -55,7 +53,6 @@ class SupportEraser(Tool): node.addDecorator(SettingOverrideDecorator()) stack = node.callDecoration("getStack") - print(stack) settings = stack.getTop() if not (settings.getInstance("anti_overhang_mesh") and settings.getProperty("anti_overhang_mesh", "value")): From 0fbc56a025276bc3ec3b7bb81e6029ccd034b482 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 1 Feb 2018 11:17:16 +0100 Subject: [PATCH 490/551] Show validation results in sorted order CURA-3710 --- tools/check_preset_settings.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/check_preset_settings.py b/tools/check_preset_settings.py index 675075ee07..dfcea4849f 100644 --- a/tools/check_preset_settings.py +++ b/tools/check_preset_settings.py @@ -67,9 +67,11 @@ class PresetSettingsValidator: print("[INVALID] [%s] is invalid, details below" % file_path) # show details - for section_name in incorrect_sections: + for section_name in sorted(incorrect_sections): print(" -- section name [%s] is incorrect, please check fdmprinter.def.json." % section_name) - for setting_name, details_dict in incorrect_settings.items(): + + for setting_name in sorted(incorrect_settings.keys()): + details_dict = incorrect_settings[setting_name] msg = " -- setting [%s] is found in sections [%s], " % (setting_name, ", ".join(details_dict["seen_in"])) if details_dict["should_be_in"] is not None: msg += "but should be in section [%s] only." % details_dict["should_be_in"] From 1801f1f27cff0665487ebb8bc240701ec7c1a918 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 1 Feb 2018 11:17:57 +0100 Subject: [PATCH 491/551] Update advanced and export presets with some settings moved to exp. CURA-3710 Some settings have been moved to experimental. --- resources/visibility_presets/advanced.cfg | 30 +++++++++++------------ resources/visibility_presets/expert.cfg | 30 +++++++++++------------ 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/resources/visibility_presets/advanced.cfg b/resources/visibility_presets/advanced.cfg index ab2d2faa99..3bbe0ce065 100644 --- a/resources/visibility_presets/advanced.cfg +++ b/resources/visibility_presets/advanced.cfg @@ -7,7 +7,6 @@ weight = 2 [resolution] layer_height layer_height_0 -slicing_tolerance line_width [shell] @@ -16,8 +15,6 @@ wall_thickness wall_0_wipe_dist roofing_extruder_nr roofing_layer_count -roofing_pattern -roofing_angles top_bottom_extruder_nr top_bottom_thickness top_bottom_pattern @@ -70,16 +67,13 @@ min_infill_area skin_preshrink expand_skins_expand_distance max_skin_angle_for_expansion -infill_enable_travel_optimization [material] -material_flow_dependent_temperature default_material_print_temperature material_print_temperature material_print_temperature_layer_0 material_initial_print_temperature material_final_print_temperature -material_flow_temp_graph material_extrusion_cool_down_speed default_material_bed_temperature material_bed_temperature @@ -145,7 +139,6 @@ cool_lift_head [support] support_enable -support_tree_enable support_extruder_nr support_type support_angle @@ -161,12 +154,6 @@ support_bottom_stair_step_width support_join_distance support_offset support_infill_sparse_thickness -support_tree_angle -support_tree_branch_distance -support_tree_branch_diameter -support_tree_branch_diameter_angle -support_tree_collision_resolution -support_tree_wall_thickness gradual_support_infill_steps gradual_support_infill_step_height support_interface_enable @@ -229,7 +216,6 @@ meshfix_union_all meshfix_union_all_remove_holes meshfix_extensive_stitching meshfix_keep_open_polygons -meshfix_maximum_resolution multiple_mesh_overlap carve_multiple_volumes alternate_carve_order @@ -251,4 +237,18 @@ magic_spiralize smooth_spiralized_contours relative_extrusion -[experimental] \ No newline at end of file +[experimental] +infill_enable_travel_optimization +material_flow_dependent_temperature +material_flow_temp_graph +meshfix_maximum_resolution +roofing_angles +roofing_pattern +slicing_tolerance +support_tree_angle +support_tree_branch_diameter +support_tree_branch_diameter_angle +support_tree_branch_distance +support_tree_collision_resolution +support_tree_enable +support_tree_wall_thickness diff --git a/resources/visibility_presets/expert.cfg b/resources/visibility_presets/expert.cfg index 38e756e6b8..1be5ca7804 100644 --- a/resources/visibility_presets/expert.cfg +++ b/resources/visibility_presets/expert.cfg @@ -7,7 +7,6 @@ weight = 3 [resolution] layer_height layer_height_0 -slicing_tolerance line_width [shell] @@ -16,8 +15,6 @@ wall_thickness wall_0_wipe_dist roofing_extruder_nr roofing_layer_count -roofing_pattern -roofing_angles top_bottom_extruder_nr top_bottom_thickness top_bottom_pattern @@ -70,16 +67,13 @@ min_infill_area skin_preshrink expand_skins_expand_distance max_skin_angle_for_expansion -infill_enable_travel_optimization [material] -material_flow_dependent_temperature default_material_print_temperature material_print_temperature material_print_temperature_layer_0 material_initial_print_temperature material_final_print_temperature -material_flow_temp_graph material_extrusion_cool_down_speed default_material_bed_temperature material_bed_temperature @@ -145,7 +139,6 @@ cool_lift_head [support] support_enable -support_tree_enable support_extruder_nr support_type support_angle @@ -161,12 +154,6 @@ support_bottom_stair_step_width support_join_distance support_offset support_infill_sparse_thickness -support_tree_angle -support_tree_branch_distance -support_tree_branch_diameter -support_tree_branch_diameter_angle -support_tree_collision_resolution -support_tree_wall_thickness gradual_support_infill_steps gradual_support_infill_step_height support_interface_enable @@ -229,7 +216,6 @@ meshfix_union_all meshfix_union_all_remove_holes meshfix_extensive_stitching meshfix_keep_open_polygons -meshfix_maximum_resolution multiple_mesh_overlap carve_multiple_volumes alternate_carve_order @@ -282,4 +268,18 @@ magic_fuzzy_skin_enabled magic_fuzzy_skin_thickness magic_fuzzy_skin_point_density flow_rate_max_extrusion_offset -flow_rate_extrusion_offset_factor \ No newline at end of file +flow_rate_extrusion_offset_factor +infill_enable_travel_optimization +material_flow_dependent_temperature +material_flow_temp_graph +meshfix_maximum_resolution +roofing_angles +roofing_pattern +slicing_tolerance +support_tree_angle +support_tree_branch_diameter +support_tree_branch_diameter_angle +support_tree_branch_distance +support_tree_collision_resolution +support_tree_enable +support_tree_wall_thickness From d3b224161694d2d5af5832ef30d56a9a10231d25 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Thu, 1 Feb 2018 11:37:23 +0100 Subject: [PATCH 492/551] Fixed "Quit" button & others - Quit button in the dialog post-install now quits the application instead of simply closing the window - Improved styling: - All colors now pulled from `UM.Theme.getColor()` - Dialog has white background - Buttons look like Cura buttons - Removed inaccurate comments regarding the structure that were created while working on it --- plugins/PluginBrowser/PluginBrowser.py | 34 ------------ plugins/PluginBrowser/PluginBrowser.qml | 74 +++++++++++++++++++++---- 2 files changed, 62 insertions(+), 46 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 23c1bafe61..19721559ab 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -26,40 +26,6 @@ from cura.CuraApplication import CuraApplication i18n_catalog = i18nCatalog("cura") -# Architecture thoughts: -# ------------------------------------------------------------------------------ -# The plugin manager has 2 parts: the browser and the installer. -# -# UNINSTALLING: -# ------------------------------------------------------------------------------ -# Uninstalling is done via the PluginRegistry's uninstallPlugin() method, -# supplied with a plugin_id. Uninstalling is currently done instantly so there's -# no need to use an list of "newly uninstalled plugins" but this will be needed -# in the future with more complex plugins, as well as when merging the built-in -# plugins into the plugin browser. -# -# STATUS: -# ------------------------------------------------------------------------------ -# 'status' is used to keep track of installations and uninstallations. It is -# intended to replace "newly installed" and "newly uninstalled" lists. These -# lists introduce a lot of complexity if a plugin finds itself on both lists. -# -# 'status' can have several values: -# - "uninstalled" -# - "will_install" -# - "installed" -# - "will_uninstall" -# -# This is more civilized than checking if a plugin's metadata exists. It also -# means uninstalling doesn't require erasing the metadata. -# -# ACTIVE: -# ------------------------------------------------------------------------------ -# Although 'active' could have been lumped with 'status', it is essentially a -# sub-status within 'installed' and 'will_uninstall'. Rather than create more -# statuses such as 'active_installed' and 'active_will_uninstall', the 'active' -# property is just a boolean used in conjunction with 'status'. - class PluginBrowser(QObject, Extension): def __init__(self, parent=None): super().__init__(parent) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 229d5c1755..ec4c2a9135 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -19,7 +19,7 @@ Window { height: 640 * screenScaleFactor minimumWidth: 350 * screenScaleFactor minimumHeight: 350 * screenScaleFactor - color: "white" + color: UM.Theme.getColor("sidebar") Item { id: view @@ -157,7 +157,7 @@ Window { } label: Text { verticalAlignment: Text.AlignVCenter - color: "white" + color: UM.Theme.getColor("button_text") font { pixelSize: 13 bold: true @@ -191,7 +191,7 @@ Window { } label: Text { verticalAlignment: Text.AlignVCenter - color: "grey" + color: UM.Theme.getColor("text") text: control.text horizontalAlignment: Text.AlignHCenter } @@ -284,33 +284,83 @@ Window { } } - UM.Dialog { + Window { id: restartDialog // title: catalog.i18nc("@title:tab", "Plugins"); width: 360 * screenScaleFactor - height: 180 * screenScaleFactor + height: 120 * screenScaleFactor minimumWidth: 360 * screenScaleFactor - minimumHeight: 180 * screenScaleFactor + minimumHeight: 120 * screenScaleFactor + color: UM.Theme.getColor("sidebar") property var message; Text { id: message + anchors { + left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width + top: parent.top + topMargin: UM.Theme.getSize("default_margin").height + } text: restartDialog.message != null ? restartDialog.message : "" } Button { id: laterButton text: "Later" onClicked: restartDialog.close(); - anchors.left: parent.left - anchors.bottom: parent.bottom + anchors { + left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width + bottom: parent.bottom + bottomMargin: UM.Theme.getSize("default_margin").height + } + style: ButtonStyle { + background: Rectangle { + color: "transparent" + implicitWidth: 96 + implicitHeight: 30 + border { + width: 1 + color: UM.Theme.getColor("lining") + } + } + label: Text { + verticalAlignment: Text.AlignVCenter + color: UM.Theme.getColor("text") + text: control.text + horizontalAlignment: Text.AlignHCenter + } + } } + Button { id: restartButton - text: "Restart now" - onClicked: restartDialog.close(); - anchors.right: parent.right - anchors.bottom: parent.bottom + text: "Quit Cura" + anchors { + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width + bottom: parent.bottom + bottomMargin: UM.Theme.getSize("default_margin").height + } + onClicked: manager.restart() + style: ButtonStyle { + background: Rectangle { + implicitWidth: 96 + implicitHeight: 30 + color: UM.Theme.getColor("primary") + } + label: Text { + verticalAlignment: Text.AlignVCenter + color: UM.Theme.getColor("button_text") + font { + pixelSize: 13 + bold: true + } + text: control.text + horizontalAlignment: Text.AlignHCenter + } + } } } From 367e50669d18c48d4c0d45a9c46313ba6f9ccd05 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 1 Feb 2018 13:56:49 +0100 Subject: [PATCH 493/551] Refactor code CURA-3710 --- cura/CuraApplication.py | 34 +++++++++---------- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 +- .../advanced.cfg | 0 .../basic.cfg | 0 .../expert.cfg | 0 .../qml/Preferences/SettingVisibilityPage.qml | 4 +-- tools/check_preset_settings.py | 2 +- 7 files changed, 21 insertions(+), 21 deletions(-) rename resources/{visibility_presets => preset_setting_visibility_groups}/advanced.cfg (100%) rename resources/{visibility_presets => preset_setting_visibility_groups}/basic.cfg (100%) rename resources/{visibility_presets => preset_setting_visibility_groups}/expert.cfg (100%) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 087530a99e..086cc8bd72 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -354,16 +354,16 @@ class CuraApplication(QtApplication): setting_visibily_preset_names = self.getVisibilitySettingPresetTypes() preferences.setDefault("general/visible_settings_preset", setting_visibily_preset_names) - visible_settings_preset_choice = Preferences.getInstance().getValue("general/visible_settings_preset_choice") + preset_setting_visibility_choice = Preferences.getInstance().getValue("general/preset_setting_visibility_choice") - default_visibility_preset = "Basic" - if visible_settings_preset_choice == "" or visible_settings_preset_choice is None: - if not visible_settings_preset_choice in setting_visibily_preset_names: - visible_settings_preset_choice = default_visibility_preset + default_preset_visibility_group_name = "Basic" + if preset_setting_visibility_choice == "" or preset_setting_visibility_choice is None: + if preset_setting_visibility_choice not in setting_visibily_preset_names: + preset_setting_visibility_choice = default_preset_visibility_group_name - visible_settings = self.getVisibilitySettingPreset(settings_preset_name = visible_settings_preset_choice) + visible_settings = self.getVisibilitySettingPreset(settings_preset_name = preset_setting_visibility_choice) preferences.setDefault("general/visible_settings", visible_settings) - preferences.setDefault("general/visible_settings_preset_choice", visible_settings_preset_choice) + preferences.setDefault("general/preset_setting_visibility_choice", preset_setting_visibility_choice) self.applicationShuttingDown.connect(self.saveSettings) self.engineCreatedSignal.connect(self._onEngineCreated) @@ -377,14 +377,14 @@ class CuraApplication(QtApplication): @pyqtSlot(str, result = str) def getVisibilitySettingPreset(self, settings_preset_name) -> str: - result = self._load_visibilyty_setting_preset(settings_preset_name) - formatted_preset_settings = self.format_visibility_setting_preset(result) + result = self._loadPresetSettingVisibilityGroup(settings_preset_name) + formatted_preset_settings = self._serializePresetSettingVisibilityData(result) return formatted_preset_settings - ## Format visibitlity settings into string which is concatenated by ";" + ## Serialise the given preset setting visibitlity group dictionary into a string which is concatenated by ";" # - def format_visibility_setting_preset(self, settings_data) -> str: + def _serializePresetSettingVisibilityData(self, settings_data: dict) -> str: result_string = "" for key in settings_data: @@ -394,10 +394,10 @@ class CuraApplication(QtApplication): return result_string - ## Load visibility settings according to selected preset name + ## Load the preset setting visibility group with the given name # - def _load_visibilyty_setting_preset(self, visibility_preset_name) -> Dict[str, str]: - preset_dir = Resources.getPath(Resources.VisibilitySettingPresets) + def _loadPresetSettingVisibilityGroup(self, visibility_preset_name) -> Dict[str, str]: + preset_dir = Resources.getPath(Resources.PresetSettingVisibilityGroups) result = {} right_preset_found = False @@ -407,7 +407,7 @@ class CuraApplication(QtApplication): if not os.path.isfile(file_path): continue - parser = ConfigParser(allow_no_value=True) # accept options without any value, + parser = ConfigParser(allow_no_value = True) # accept options without any value, try: parser.read([file_path]) @@ -422,7 +422,7 @@ class CuraApplication(QtApplication): continue else: section_settings = [] - for option in parser[section]._options(): + for option in parser[section].keys(): section_settings.append(option) result[section] = section_settings @@ -438,7 +438,7 @@ class CuraApplication(QtApplication): ## Check visibility setting preset folder and returns available types # def getVisibilitySettingPresetTypes(self): - preset_dir = Resources.getPath(Resources.VisibilitySettingPresets) + preset_dir = Resources.getPath(Resources.PresetSettingVisibilityGroups) result = {} for item in os.listdir(preset_dir): diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index c67815b306..b28490ce4e 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -453,7 +453,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): Logger.log("w", "Workspace did not contain visible settings. Leaving visibility unchanged") else: global_preferences.setValue("general/visible_settings", visible_settings) - global_preferences.setValue("general/visible_settings_preset_choice", "Custom") + global_preferences.setValue("general/preset_setting_visibility_choice", "Custom") categories_expanded = temp_preferences.getValue("cura/categories_expanded") if categories_expanded is None: diff --git a/resources/visibility_presets/advanced.cfg b/resources/preset_setting_visibility_groups/advanced.cfg similarity index 100% rename from resources/visibility_presets/advanced.cfg rename to resources/preset_setting_visibility_groups/advanced.cfg diff --git a/resources/visibility_presets/basic.cfg b/resources/preset_setting_visibility_groups/basic.cfg similarity index 100% rename from resources/visibility_presets/basic.cfg rename to resources/preset_setting_visibility_groups/basic.cfg diff --git a/resources/visibility_presets/expert.cfg b/resources/preset_setting_visibility_groups/expert.cfg similarity index 100% rename from resources/visibility_presets/expert.cfg rename to resources/preset_setting_visibility_groups/expert.cfg diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index 967c0d05bf..561c1f8f9d 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -154,7 +154,7 @@ UM.PreferencesPage currentIndex: { // Load previously selected preset. - var text = UM.Preferences.getValue("general/visible_settings_preset_choice"); + var text = UM.Preferences.getValue("general/preset_setting_visibility_choice"); @@ -178,7 +178,7 @@ UM.PreferencesPage var newVisibleSettings = CuraApplication.getVisibilitySettingPreset(model.get(index).text) UM.Preferences.setValue("general/visible_settings", newVisibleSettings) - UM.Preferences.setValue("general/visible_settings_preset_choice", model.get(index).text) + UM.Preferences.setValue("general/preset_setting_visibility_choice", model.get(index).text) } } diff --git a/tools/check_preset_settings.py b/tools/check_preset_settings.py index dfcea4849f..8afad38344 100644 --- a/tools/check_preset_settings.py +++ b/tools/check_preset_settings.py @@ -11,7 +11,7 @@ class PresetSettingsValidator: self._cura_dir = os.path.abspath(cura_dir) self._resource_dir = os.path.join(self._cura_dir, "resources") self._definitions_dir = os.path.join(self._resource_dir, "definitions") - self._preset_settings_dir = os.path.join(self._resource_dir, "visibility_presets") + self._preset_settings_dir = os.path.join(self._resource_dir, "preset_setting_visibility_groups") self._fdmprinter_def_path = os.path.join(self._definitions_dir, "fdmprinter.def.json") From caeb6c65eaee13924d2309b96b7bf9254d1e85d1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 1 Feb 2018 13:57:24 +0100 Subject: [PATCH 494/551] Change check_preset_settings.py to UNIX EOLs CURA-3710 --- tools/check_preset_settings.py | 252 ++++++++++++++++----------------- 1 file changed, 126 insertions(+), 126 deletions(-) diff --git a/tools/check_preset_settings.py b/tools/check_preset_settings.py index 8afad38344..e634d9decd 100644 --- a/tools/check_preset_settings.py +++ b/tools/check_preset_settings.py @@ -1,126 +1,126 @@ -#!/usr/bin/env python -import configparser -import json -import os -import sys - - -class PresetSettingsValidator: - - def __init__(self, cura_dir: str): - self._cura_dir = os.path.abspath(cura_dir) - self._resource_dir = os.path.join(self._cura_dir, "resources") - self._definitions_dir = os.path.join(self._resource_dir, "definitions") - self._preset_settings_dir = os.path.join(self._resource_dir, "preset_setting_visibility_groups") - - self._fdmprinter_def_path = os.path.join(self._definitions_dir, "fdmprinter.def.json") - - def validate(self) -> bool: - """ - Validates the preset settings files and returns True or False indicating whether there are invalid files. - """ - if not os.path.isfile(self._fdmprinter_def_path): - raise FileNotFoundError("[%s] is not a file or doesn't exist, please make sure you have specified the correct cura directory [%s]." % (self._fdmprinter_def_path, self._cura_dir)) - - if not os.path.isdir(self._preset_settings_dir): - raise FileNotFoundError("[%s] is not a directory or doesn't exist, please make sure you have specified the correct cura directory [%s]." % (self._preset_settings_dir, self._cura_dir)) - - # parse the definition file - setting_tree_dict = self._parse_definition_file(self._fdmprinter_def_path) - - has_invalid_files = False - - # go through all the preset settings files - for root_dir, _, filenames in os.walk(self._preset_settings_dir): - for filename in filenames: - file_path = os.path.join(root_dir, filename) - print("Validating [%s] ..." % file_path) - - incorrect_sections = [] - incorrect_settings = {} - - parser = configparser.ConfigParser(allow_no_value = True) - with open(file_path, "r", encoding = "utf-8") as f: - parser.read_file(f) - - for key in parser: - # skip general - if key in ("general", configparser.DEFAULTSECT): - continue - - if key not in setting_tree_dict: - incorrect_sections.append(key) - continue - - for setting_key in parser[key]: - if setting_key not in setting_tree_dict[key]: - if setting_key not in incorrect_settings: - incorrect_settings[setting_key] = {"seen_in": [], - "should_be_in": self._should_setting_be_in(setting_tree_dict, setting_key)} - - incorrect_settings[setting_key]["seen_in"].append(key) - - # show results - print("==========================================") - if incorrect_settings or incorrect_settings: - has_invalid_files = True - print("[INVALID] [%s] is invalid, details below" % file_path) - - # show details - for section_name in sorted(incorrect_sections): - print(" -- section name [%s] is incorrect, please check fdmprinter.def.json." % section_name) - - for setting_name in sorted(incorrect_settings.keys()): - details_dict = incorrect_settings[setting_name] - msg = " -- setting [%s] is found in sections [%s], " % (setting_name, ", ".join(details_dict["seen_in"])) - if details_dict["should_be_in"] is not None: - msg += "but should be in section [%s] only." % details_dict["should_be_in"] - else: - msg += "but it cannot be found in fdmprinter.def.json" - print(msg) - - else: - print("[%s] is valid" % file_path) - print("==========================================") - - return not has_invalid_files - - def _parse_definition_file(self, file_path: str): - with open(file_path, "r", encoding = "utf-8") as f: - def_dict = json.load(f, encoding = "utf-8") - - tree_dict = {} - for key, item in def_dict.get("settings", {}).items(): - setting_list = [] - self._generate_tree(setting_list, item.get("children", {})) - tree_dict[key] = setting_list - - return tree_dict - - def _generate_tree(self, setting_list: list, setting_dict: dict): - for key, item in setting_dict.items(): - setting_list.append(key) - if "children" in item: - self._generate_tree(setting_list, item["children"]) - - def _should_setting_be_in(self, setting_dict: dict, setting_name: str) -> str: - """ - Check which section the given setting belongs to. Returns None if the setting cannot be found. - """ - section_name = None - for key, setting_list in setting_dict.items(): - if setting_name in setting_list: - section_name = key - break - return section_name - - -if __name__ == "__main__": - script_dir = os.path.dirname(os.path.realpath(__file__)) - cura_dir = os.path.abspath(os.path.join(script_dir, "..")) - - validator = PresetSettingsValidator(cura_dir) - is_everything_validate = validator.validate() - - ret_code = 0 if is_everything_validate else 1 - sys.exit(ret_code) +#!/usr/bin/env python +import configparser +import json +import os +import sys + + +class PresetSettingsValidator: + + def __init__(self, cura_dir: str): + self._cura_dir = os.path.abspath(cura_dir) + self._resource_dir = os.path.join(self._cura_dir, "resources") + self._definitions_dir = os.path.join(self._resource_dir, "definitions") + self._preset_settings_dir = os.path.join(self._resource_dir, "preset_setting_visibility_groups") + + self._fdmprinter_def_path = os.path.join(self._definitions_dir, "fdmprinter.def.json") + + def validate(self) -> bool: + """ + Validates the preset settings files and returns True or False indicating whether there are invalid files. + """ + if not os.path.isfile(self._fdmprinter_def_path): + raise FileNotFoundError("[%s] is not a file or doesn't exist, please make sure you have specified the correct cura directory [%s]." % (self._fdmprinter_def_path, self._cura_dir)) + + if not os.path.isdir(self._preset_settings_dir): + raise FileNotFoundError("[%s] is not a directory or doesn't exist, please make sure you have specified the correct cura directory [%s]." % (self._preset_settings_dir, self._cura_dir)) + + # parse the definition file + setting_tree_dict = self._parse_definition_file(self._fdmprinter_def_path) + + has_invalid_files = False + + # go through all the preset settings files + for root_dir, _, filenames in os.walk(self._preset_settings_dir): + for filename in filenames: + file_path = os.path.join(root_dir, filename) + print("Validating [%s] ..." % file_path) + + incorrect_sections = [] + incorrect_settings = {} + + parser = configparser.ConfigParser(allow_no_value = True) + with open(file_path, "r", encoding = "utf-8") as f: + parser.read_file(f) + + for key in parser: + # skip general + if key in ("general", configparser.DEFAULTSECT): + continue + + if key not in setting_tree_dict: + incorrect_sections.append(key) + continue + + for setting_key in parser[key]: + if setting_key not in setting_tree_dict[key]: + if setting_key not in incorrect_settings: + incorrect_settings[setting_key] = {"seen_in": [], + "should_be_in": self._should_setting_be_in(setting_tree_dict, setting_key)} + + incorrect_settings[setting_key]["seen_in"].append(key) + + # show results + print("==========================================") + if incorrect_settings or incorrect_settings: + has_invalid_files = True + print("[INVALID] [%s] is invalid, details below" % file_path) + + # show details + for section_name in sorted(incorrect_sections): + print(" -- section name [%s] is incorrect, please check fdmprinter.def.json." % section_name) + + for setting_name in sorted(incorrect_settings.keys()): + details_dict = incorrect_settings[setting_name] + msg = " -- setting [%s] is found in sections [%s], " % (setting_name, ", ".join(details_dict["seen_in"])) + if details_dict["should_be_in"] is not None: + msg += "but should be in section [%s] only." % details_dict["should_be_in"] + else: + msg += "but it cannot be found in fdmprinter.def.json" + print(msg) + + else: + print("[%s] is valid" % file_path) + print("==========================================") + + return not has_invalid_files + + def _parse_definition_file(self, file_path: str): + with open(file_path, "r", encoding = "utf-8") as f: + def_dict = json.load(f, encoding = "utf-8") + + tree_dict = {} + for key, item in def_dict.get("settings", {}).items(): + setting_list = [] + self._generate_tree(setting_list, item.get("children", {})) + tree_dict[key] = setting_list + + return tree_dict + + def _generate_tree(self, setting_list: list, setting_dict: dict): + for key, item in setting_dict.items(): + setting_list.append(key) + if "children" in item: + self._generate_tree(setting_list, item["children"]) + + def _should_setting_be_in(self, setting_dict: dict, setting_name: str) -> str: + """ + Check which section the given setting belongs to. Returns None if the setting cannot be found. + """ + section_name = None + for key, setting_list in setting_dict.items(): + if setting_name in setting_list: + section_name = key + break + return section_name + + +if __name__ == "__main__": + script_dir = os.path.dirname(os.path.realpath(__file__)) + cura_dir = os.path.abspath(os.path.join(script_dir, "..")) + + validator = PresetSettingsValidator(cura_dir) + is_everything_validate = validator.validate() + + ret_code = 0 if is_everything_validate else 1 + sys.exit(ret_code) From 6a053a9f46c56a94cfaf611cb55376b4d0ad09d1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 1 Feb 2018 14:50:03 +0100 Subject: [PATCH 495/551] Fix material profile validator CURA-4871 Description and adhesion info are not mandatory info. --- plugins/XmlMaterialProfile/XmlMaterialValidator.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialValidator.py b/plugins/XmlMaterialProfile/XmlMaterialValidator.py index 3590dbb218..f11c8bea4b 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialValidator.py +++ b/plugins/XmlMaterialProfile/XmlMaterialValidator.py @@ -20,12 +20,6 @@ class XmlMaterialValidator(): if validation_metadata.get("version") is None: return "Missing Version" - if validation_metadata.get("description") is None: - return "Missing Description" - - if validation_metadata.get("adhesion_info") is None: - return "Missing Adhesion Info" - return None From 056ae4fe68615467e0a0b2236e020a41001c8ec9 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 1 Feb 2018 15:22:45 +0100 Subject: [PATCH 496/551] CURA-4425 Small refactor to avoid using repeated code --- cura/Scene/CuraSceneNode.py | 77 ++++++++++++++----------------------- 1 file changed, 28 insertions(+), 49 deletions(-) diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py index 0dbcdd30c3..f370d2b54b 100644 --- a/cura/Scene/CuraSceneNode.py +++ b/cura/Scene/CuraSceneNode.py @@ -26,64 +26,44 @@ class CuraSceneNode(SceneNode): def isSelectable(self) -> bool: return super().isSelectable() and self.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate - def getPrintingExtruderPosition(self) -> int: - # took bits and pieces from extruders model, solid view - + ## Get the extruder used to print this node. If there is no active node, then the extruder in position zero is returned + # TODO The best way to do it is by adding the setActiveExtruder decorator to every node when is loaded + def getPrintingExtruder(self): global_container_stack = Application.getInstance().getGlobalContainerStack() per_mesh_stack = self.callDecoration("getStack") - # It's only set if you explicitly choose an extruder - extruder_id = self.callDecoration("getActiveExtruder") - - machine_extruder_count = global_container_stack.getProperty("machine_extruder_count", "value") - - extruder_index = 0 - - for extruder in Application.getInstance().getExtruderManager().getMachineExtruders(global_container_stack.getId()): - position = extruder.getMetaDataEntry("position", default = "0") # Get the position - try: - position = int(position) - except ValueError: - # Not a proper int. - position = -1 - if position > machine_extruder_count: - continue - - # Find out the extruder index if we know the id. - if extruder_id is not None and extruder_id == extruder.getId(): - extruder_index = position - break + extruders = list(global_container_stack.extruders.values()) # Use the support extruder instead of the active extruder if this is a support_mesh if per_mesh_stack: if per_mesh_stack.getProperty("support_mesh", "value"): - extruder_index = int(global_container_stack.getProperty("support_extruder_nr", "value")) + return extruders[int(global_container_stack.getProperty("support_extruder_nr", "value"))] - return extruder_index + # It's only set if you explicitly choose an extruder + extruder_id = self.callDecoration("getActiveExtruder") + print(extruder_id) + for extruder in extruders: + # Find out the extruder if we know the id. + if extruder_id is not None: + if extruder_id == extruder.getId(): + return extruder + else: # If the id is unknown, then return the extruder in the position 0 + try: + if extruder.getMetaDataEntry("position", default = "0") == "0": # Check if the position is zero + return extruder + except ValueError: + continue + + # This point should never be reached + return None + + ## Return the color of the material used to print this model def getDiffuseColor(self) -> List[float]: - # took bits and pieces from extruders model, solid view + printing_extruder = self.getPrintingExtruder() - global_container_stack = Application.getInstance().getGlobalContainerStack() - machine_extruder_count = global_container_stack.getProperty("machine_extruder_count", "value") - - extruder_index = self.getPrintingExtruderPosition() - - material_color = ExtrudersModel.defaultColors[extruder_index] - - # Collect color from the extruder we want - for extruder in Application.getInstance().getExtruderManager().getMachineExtruders(global_container_stack.getId()): - position = extruder.getMetaDataEntry("position", default = "0") # Get the position - try: - position = int(position) - except ValueError: - # Not a proper int. - position = -1 - if position > machine_extruder_count: - continue - - if extruder.material and position == extruder_index: - material_color = extruder.material.getMetaDataEntry("color_code", default = material_color) - break + material_color = "#808080" # Fallback color + if printing_extruder is not None and printing_extruder.material: + material_color = printing_extruder.material.getMetaDataEntry("color_code", default = material_color) # Colors are passed as rgb hex strings (eg "#ffffff"), and the shader needs # an rgba list of floats (eg [1.0, 1.0, 1.0, 1.0]) @@ -94,7 +74,6 @@ class CuraSceneNode(SceneNode): 1.0 ] - ## Taken from SceneNode, but replaced SceneNode with CuraSceneNode def __deepcopy__(self, memo): copy = CuraSceneNode() From 2770ff584824306958a48df95f350ddc1ad1ecea Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 1 Feb 2018 15:45:17 +0100 Subject: [PATCH 497/551] CURA-4425 Remove debug printout --- cura/Scene/CuraSceneNode.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py index f370d2b54b..56b2962024 100644 --- a/cura/Scene/CuraSceneNode.py +++ b/cura/Scene/CuraSceneNode.py @@ -40,7 +40,6 @@ class CuraSceneNode(SceneNode): # It's only set if you explicitly choose an extruder extruder_id = self.callDecoration("getActiveExtruder") - print(extruder_id) for extruder in extruders: # Find out the extruder if we know the id. From 433176d25ae187c90f8f0660f509112e68708b1a Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 1 Feb 2018 16:18:21 +0100 Subject: [PATCH 498/551] CURA-4425 Cleanup and small refactor --- cura/Snapshot.py | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/cura/Snapshot.py b/cura/Snapshot.py index dc60f4ffda..d646fe8868 100644 --- a/cura/Snapshot.py +++ b/cura/Snapshot.py @@ -16,23 +16,19 @@ class Snapshot: @staticmethod def snapshot(width = 300, height = 300): scene = Application.getInstance().getController().getScene() - cam = scene.getActiveCamera() - render_width, render_height = cam.getWindowSize() - pp = PreviewPass(render_width, render_height) + active_camera = scene.getActiveCamera() + render_width, render_height = active_camera.getWindowSize() + preview_pass = PreviewPass(render_width, render_height) root = scene.getRoot() camera = Camera("snapshot", root) # determine zoom and look at - bbox = None + bbox = AxisAlignedBox() for node in DepthFirstIterator(root): if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible(): - if bbox is None: - bbox = node.getBoundingBox() - else: - bbox = bbox + node.getBoundingBox() - if bbox is None: - bbox = AxisAlignedBox() + bbox = bbox + node.getBoundingBox() + look_at = bbox.center size = max(bbox.width, bbox.height, bbox.depth * 0.5) @@ -52,10 +48,10 @@ class Snapshot: camera.setProjectionMatrix(projection_matrix) - pp.setCamera(camera) - pp.setSize(render_width, render_height) # texture size - pp.render() - pixel_output = pp.getOutput() + preview_pass.setCamera(camera) + preview_pass.setSize(render_width, render_height) # texture size + preview_pass.render() + pixel_output = preview_pass.getOutput() # It's a bit annoying that window size has to be taken into account if pixel_output.width() >= pixel_output.height(): @@ -70,5 +66,3 @@ class Snapshot: cropped_image = image.copy(0, image.height() // 2 - height // 2, width, height) return cropped_image - # if cropped_image.save("/home/jack/preview.png"): - # print("yooo") From c4326469085e38899d7195fa650bb0d1a43bd1aa Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 1 Feb 2018 16:37:16 +0100 Subject: [PATCH 499/551] CURA-4425 Avoid adding the center bounding box. Revert some previous changes. --- cura/Snapshot.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cura/Snapshot.py b/cura/Snapshot.py index d646fe8868..88d030267e 100644 --- a/cura/Snapshot.py +++ b/cura/Snapshot.py @@ -24,10 +24,15 @@ class Snapshot: camera = Camera("snapshot", root) # determine zoom and look at - bbox = AxisAlignedBox() + bbox = None for node in DepthFirstIterator(root): if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible(): - bbox = bbox + node.getBoundingBox() + if bbox is None: + bbox = node.getBoundingBox() + else: + bbox = bbox + node.getBoundingBox() + if bbox is None: + bbox = AxisAlignedBox() look_at = bbox.center size = max(bbox.width, bbox.height, bbox.depth * 0.5) From 7856d61b5a66b96105da261dd5fd37b1bb1dea89 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 1 Feb 2018 17:31:43 +0100 Subject: [PATCH 500/551] CURA-4425 scale image to full size; still has a bug that it is shifted vertically; still need to clean code --- cura/Scene/CuraSceneNode.py | 1 - cura/Snapshot.py | 83 ++++++++++++++++++++++++++++++------- 2 files changed, 67 insertions(+), 17 deletions(-) diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py index 56b2962024..969d491f49 100644 --- a/cura/Scene/CuraSceneNode.py +++ b/cura/Scene/CuraSceneNode.py @@ -1,7 +1,6 @@ from typing import List from UM.Application import Application -from UM.Logger import Logger from UM.Scene.SceneNode import SceneNode from copy import deepcopy from cura.Settings.ExtrudersModel import ExtrudersModel diff --git a/cura/Snapshot.py b/cura/Snapshot.py index 88d030267e..f12ff3e0e1 100644 --- a/cura/Snapshot.py +++ b/cura/Snapshot.py @@ -1,13 +1,17 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import numpy + from PyQt5 import QtCore from cura.PreviewPass import PreviewPass +from cura.Scene import ConvexHullNode from UM.Application import Application from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Math.Matrix import Matrix from UM.Math.Vector import Vector +from UM.Mesh.MeshData import transformVertices from UM.Scene.Camera import Camera from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator @@ -25,18 +29,33 @@ class Snapshot: # determine zoom and look at bbox = None + hulls = None for node in DepthFirstIterator(root): + if type(node) == ConvexHullNode: + print(node) if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible(): if bbox is None: bbox = node.getBoundingBox() else: bbox = bbox + node.getBoundingBox() + convex_hull = node.getMeshData().getConvexHullTransformedVertices(node.getWorldTransformation()) + if hulls is None: + hulls = convex_hull + else: + hulls = numpy.concatenate((hulls, convex_hull), axis = 0) + if bbox is None: bbox = AxisAlignedBox() look_at = bbox.center size = max(bbox.width, bbox.height, bbox.depth * 0.5) + # Somehow the aspect ratio is also influenced in reverse by the screen width/height + # So you have to set it to render_width/render_height to get 1 + projection_matrix = Matrix() + projection_matrix.setPerspective(30, render_width / render_height, 1, 500) + camera.setProjectionMatrix(projection_matrix) + looking_from_offset = Vector(1, 1, 2) if size > 0: # determine the watch distance depending on the size @@ -46,28 +65,60 @@ class Snapshot: camera.setPosition(look_at + looking_from_offset) camera.lookAt(look_at) - # Somehow the aspect ratio is also influenced in reverse by the screen width/height - # So you have to set it to render_width/render_height to get 1 - projection_matrix = Matrix() - projection_matrix.setPerspective(30, render_width / render_height, 1, 500) - - camera.setProjectionMatrix(projection_matrix) + # we need this for the projection calculation + hulls4 = numpy.ones((hulls.shape[0], 4)) + hulls4[:, :-1] = hulls + #position = Vector(10, 10, 10) + # projected_position = camera.project(position) preview_pass.setCamera(camera) preview_pass.setSize(render_width, render_height) # texture size preview_pass.render() pixel_output = preview_pass.getOutput() - # It's a bit annoying that window size has to be taken into account - if pixel_output.width() >= pixel_output.height(): - # Scale it to the correct height - image = pixel_output.scaledToHeight(height, QtCore.Qt.SmoothTransformation) - # Then chop of the width - cropped_image = image.copy(image.width() // 2 - width // 2, 0, width, height) + print("Calculating image coordinates...") + view = camera.getWorldTransformation().getInverse() + min_x, max_x, min_y, max_y = render_width, 0, render_height, 0 + for hull_coords in hulls4: + projected_position = view.getData().dot(hull_coords) + projected_position2 = projection_matrix.getData().dot(projected_position) + #xx, yy = camera.project(Vector(data = hull_coords)) + # xx, yy range from -1 to 1 + xx = projected_position2[0] / projected_position2[2] / 2.0 + yy = projected_position2[1] / projected_position2[2] / 2.0 + # x, y 0..render_width/height + x = int(render_width / 2 + xx * render_width / 2) + y = int(render_height / 2 + yy * render_height / 2) + min_x = min(x, min_x) + max_x = max(x, max_x) + min_y = min(y, min_y) + max_y = max(y, max_y) + print(min_x, max_x, min_y, max_y) + + # print("looping all pixels in python...") + # min_x_, max_x_, min_y_, max_y_ = render_width, 0, render_height, 0 + # for y in range(int(render_height)): + # for x in range(int(render_width)): + # color = pixel_output.pixelColor(x, y) + # if color.alpha() > 0: + # min_x_ = min(x, min_x_) + # max_x_ = max(x, max_x_) + # min_y_ = min(y, min_y_) + # max_y_ = max(y, max_y_) + # print(min_x_, max_x_, min_y_, max_y_) + + # make it a square + if max_x - min_x >= max_y - min_y: + # make y bigger + min_y, max_y = int((max_y + min_y) / 2 - (max_x - min_x) / 2), int((max_y + min_y) / 2 + (max_x - min_x) / 2) else: - # Scale it to the correct width - image = pixel_output.scaledToWidth(width, QtCore.Qt.SmoothTransformation) - # Then chop of the height - cropped_image = image.copy(0, image.height() // 2 - height // 2, width, height) + # make x bigger + min_x, max_x = int((max_x + min_x) / 2 - (max_y - min_y) / 2), int((max_x + min_x) / 2 + (max_y - min_y) / 2) + copy_pixel_output = pixel_output.copy(min_x, min_y, max_x - min_x, max_y - min_y) + + # Scale it to the correct height + image = copy_pixel_output.scaledToHeight(height, QtCore.Qt.SmoothTransformation) + # Then chop of the width + cropped_image = image.copy(image.width() // 2 - width // 2, 0, width, height) return cropped_image From ee75b9bdf5aa845994a734e660f698031f814384 Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 2 Feb 2018 10:28:37 +0100 Subject: [PATCH 501/551] Also accept a comma as input and convert it to a dot CURA-4910 --- plugins/MachineSettingsAction/MachineSettingsAction.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 536c6c30d6..0aad716300 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -591,7 +591,7 @@ Cura.MachineAction const value = propertyProvider.properties.value; return value ? value : ""; } - validator: RegExpValidator { regExp: _allowNegative ? /-?[0-9\.]{0,6}/ : /[0-9\.]{0,6}/ } + validator: RegExpValidator { regExp: _allowNegative ? /-?[0-9\.,]{0,6}/ : /[0-9\.,]{0,6}/ } onEditingFinished: { if (propertyProvider && text != propertyProvider.properties.value) @@ -826,10 +826,10 @@ Cura.MachineAction printHeadPolygon[axis][side] = result; return result; } - validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } + validator: RegExpValidator { regExp: /[0-9\.,]{0,6}/ } onEditingFinished: { - printHeadPolygon[axis][side] = parseFloat(textField.text); + printHeadPolygon[axis][side] = parseFloat(textField.text.replace(',','.')); var polygon = []; polygon.push([-printHeadPolygon["x"]["min"], printHeadPolygon["y"]["max"]]); polygon.push([-printHeadPolygon["x"]["min"],-printHeadPolygon["y"]["min"]]); From a786987d8d4f1410fa9dca3d57ed10b4d2e6d6c8 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 2 Feb 2018 14:02:06 +0100 Subject: [PATCH 502/551] Fix for CURA-4891 Use `active_machine_id` (such as "Ultimaker 3") instead of `global_stack_name` (such as "My Custom Printer Name") --- cura/PrintInformation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index c03cafe667..47f59c4cad 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -362,10 +362,10 @@ class PrintInformation(QObject): if not global_container_stack: self._abbr_machine = "" return + active_machine_id = Preferences.getInstance().getValue("cura/active_machine") - global_stack_name = global_container_stack.getName() abbr_machine = "" - for word in re.findall(r"[\w']+", global_stack_name): + for word in re.findall(r"[\w']+", active_machine_id): if word.lower() == "ultimaker": abbr_machine += "UM" elif word.isdigit(): From f7ef1c7aa86aa29450d7699c9acbce48a2b13430 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 2 Feb 2018 14:02:51 +0100 Subject: [PATCH 503/551] Remove debug output Removed debug `print()` from `PluginBrowser.py` --- plugins/PluginBrowser/PluginBrowser.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 034fb57398..52cba72478 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -297,7 +297,6 @@ class PluginBrowser(QObject, Extension): for plugin in self._plugins_model.items: if self._checkCanUpgrade(plugin["id"], plugin["version"]): plugin["can_upgrade"] = True - print(self._plugins_metadata) for item in self._plugins_metadata: if item["id"] == plugin["id"]: From a3ed385259c03f1a950c85cd5f9f8e6e72fae27f Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 2 Feb 2018 14:47:14 +0100 Subject: [PATCH 504/551] Use global_stack.definition.getId() to determine machine type CURA-4891 --- cura/PrintInformation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 47f59c4cad..cfd1e3fd3b 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -362,10 +362,10 @@ class PrintInformation(QObject): if not global_container_stack: self._abbr_machine = "" return - active_machine_id = Preferences.getInstance().getValue("cura/active_machine") + active_machine_type_id = global_container_stack.definition.getId() abbr_machine = "" - for word in re.findall(r"[\w']+", active_machine_id): + for word in re.findall(r"[\w']+", active_machine_type_id): if word.lower() == "ultimaker": abbr_machine += "UM" elif word.isdigit(): From 25eb1ff342da66bc6c177c472138321629c16abf Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sat, 3 Feb 2018 22:09:40 +0100 Subject: [PATCH 505/551] Fix the detection of multiextruder replacement patterns Since #3068, replacement patterns can take the form of {setting_nr, extruder_nr}. This form was not being recognised when determining if CuraEngine should prepend its own preheat sequence. --- plugins/CuraEngineBackend/StartSliceJob.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 9e3621c782..0ece5e202a 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -5,6 +5,7 @@ import numpy from string import Formatter from enum import IntEnum import time +import re from UM.Job import Job from UM.Application import Application @@ -337,10 +338,12 @@ class StartSliceJob(Job): # Pre-compute material material_bed_temp_prepend and material_print_temp_prepend start_gcode = settings["machine_start_gcode"] - bed_temperature_settings = {"material_bed_temperature", "material_bed_temperature_layer_0"} - settings["material_bed_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in bed_temperature_settings)) - print_temperature_settings = {"material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature"} - settings["material_print_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in print_temperature_settings)) + bed_temperature_settings = ["material_bed_temperature", "material_bed_temperature_layer_0"] + pattern = r"\{(%s)(,\s?\w+)?\}" % "|".join(bed_temperature_settings) # match {setting} as well as {setting, extruder_nr} + settings["material_bed_temp_prepend"] = re.search(pattern, start_gcode) == None + print_temperature_settings = ["material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature"] + pattern = r"\{(%s)(,\s?\w+)?\}" % "|".join(print_temperature_settings) # match {setting} as well as {setting, extruder_nr} + settings["material_print_temp_prepend"] = re.search(pattern, start_gcode) == None # Replace the setting tokens in start and end g-code. # Use values from the first used extruder by default so we get the expected temperatures From e2fb8ab762d7baa7696fd948bd2986ed37be3541 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 5 Feb 2018 09:45:22 +0100 Subject: [PATCH 506/551] Fixed typo --- tools/check_preset_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/check_preset_settings.py b/tools/check_preset_settings.py index e634d9decd..3996d6bcb5 100644 --- a/tools/check_preset_settings.py +++ b/tools/check_preset_settings.py @@ -62,7 +62,7 @@ class PresetSettingsValidator: # show results print("==========================================") - if incorrect_settings or incorrect_settings: + if incorrect_sections or incorrect_settings: has_invalid_files = True print("[INVALID] [%s] is invalid, details below" % file_path) From 1d946085d375d28299297836673c06051daf6372 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 30 Jan 2018 13:40:47 +0100 Subject: [PATCH 507/551] Make crash dialog available before Application starts CURA-4895 --- cura/CrashHandler.py | 14 +++++++------- cura/CuraApplication.py | 11 +++++++---- cura_app.py | 36 ++++++++++++++++++++++++++++++++++-- 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index 0c6740f740..8709461da3 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -1,7 +1,6 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import sys import platform import traceback import faulthandler @@ -14,7 +13,7 @@ import ssl import urllib.request import urllib.error -from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, QCoreApplication +from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTextEdit, QGroupBox from UM.Application import Application @@ -49,10 +48,11 @@ fatal_exception_types = [ class CrashHandler: crash_url = "https://stats.ultimaker.com/api/cura" - def __init__(self, exception_type, value, tb): + def __init__(self, exception_type, value, tb, has_started = True): self.exception_type = exception_type self.value = value self.traceback = tb + self.has_started = has_started self.dialog = None # Don't create a QDialog before there is a QApplication # While we create the GUI, the information will be stored for sending afterwards @@ -67,10 +67,6 @@ class CrashHandler: if not CuraDebugMode and exception_type not in fatal_exception_types: return - application = QCoreApplication.instance() - if not application: - sys.exit(1) - self.dialog = QDialog() self._createDialog() @@ -79,6 +75,7 @@ class CrashHandler: self.dialog.setMinimumWidth(640) self.dialog.setMinimumHeight(640) self.dialog.setWindowTitle(catalog.i18nc("@title:window", "Crash Report")) + self.dialog.finished.connect(self._close) layout = QVBoxLayout(self.dialog) @@ -89,6 +86,9 @@ class CrashHandler: layout.addWidget(self._userDescriptionWidget()) layout.addWidget(self._buttonsWidget()) + def _close(self): + os._exit(1) + def _messageWidget(self): label = QLabel() label.setText(catalog.i18nc("@label crash message", """

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 8df9f01e91..301215005e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1,5 +1,4 @@ # Copyright (c) 2017 Ultimaker B.V. -# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtNetwork import QLocalServer from PyQt5.QtNetwork import QLocalSocket @@ -113,6 +112,8 @@ class CuraApplication(QtApplication): # changes of the settings. SettingVersion = 4 + Created = False + class ResourceTypes: QmlFiles = Resources.UserType + 1 Firmware = Resources.UserType + 2 @@ -256,7 +257,7 @@ class CuraApplication(QtApplication): self._center_after_select = False self._camera_animation = None self._cura_actions = None - self._started = False + self.started = False self._message_box_callback = None self._message_box_callback_arguments = [] @@ -409,6 +410,8 @@ class CuraApplication(QtApplication): self.getCuraSceneController().setActiveBuildPlate(0) # Initialize + CuraApplication.Created = True + def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) @@ -503,7 +506,7 @@ class CuraApplication(QtApplication): # # Note that the AutoSave plugin also calls this method. def saveSettings(self): - if not self._started: # Do not do saving during application start + if not self.started: # Do not do saving during application start return ContainerRegistry.getInstance().saveDirtyContainers() @@ -732,7 +735,7 @@ class CuraApplication(QtApplication): for file_name in self._open_file_queue: #Open all the files that were queued up while plug-ins were loading. self._openFile(file_name) - self._started = True + self.started = True self.exec_() diff --git a/cura_app.py b/cura_app.py index b9afb9bbcc..624228b715 100755 --- a/cura_app.py +++ b/cura_app.py @@ -71,8 +71,40 @@ if "PYTHONPATH" in os.environ.keys(): # If PYTHONPATH is u def exceptHook(hook_type, value, traceback): from cura.CrashHandler import CrashHandler - _crash_handler = CrashHandler(hook_type, value, traceback) - _crash_handler.show() + from cura.CuraApplication import CuraApplication + has_started = False + if CuraApplication.Created: + has_started = CuraApplication.getInstance().started + + # + # When the exception hook is triggered, the QApplication may not have been initialized yet. In this case, we don't + # have an QApplication to handle the event loop, which is required by the Crash Dialog. + # The flag "CuraApplication.Created" is set to True when CuraApplication finishes its constructor call. + # + # Before the "started" flag is set to True, the Qt event loop has not started yet. The event loop is a blocking + # call to the QApplication.exec_(). In this case, we need to: + # 1. Remove all scheduled events so no more unnecessary events will be processed, such as loading the main dialog, + # loading the machine, etc. + # 2. Start the Qt event loop with exec_() and show the Crash Dialog. + # + # If the application has finished its initialization and was running fine, and then something causes a crash, + # we run the old routine to show the Crash Dialog. + # + from PyQt5.Qt import QApplication + if CuraApplication.Created: + _crash_handler = CrashHandler(hook_type, value, traceback, has_started) + if not has_started: + CuraApplication.getInstance().removePostedEvents(None) + _crash_handler.show() + sys.exit(CuraApplication.getInstance().exec_()) + else: + _crash_handler.show() + sys.exit(1) + else: + application = QApplication(sys.argv) + _crash_handler = CrashHandler(hook_type, value, traceback, has_started) + _crash_handler.dialog.show() + sys.exit(application.exec_()) if not known_args["debug"]: sys.excepthook = exceptHook From 6bbc18d51e788dad525934963a8765f9758ff810 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 30 Jan 2018 15:52:20 +0100 Subject: [PATCH 508/551] Make an extra early crash dialog CURA-4895 An early crash dialog showing options to backup the current user data and reset the configuration files. --- cura/CrashHandler.py | 130 ++++++++++++++++++++++++++++++++++++++-- cura/CuraApplication.py | 1 - cura_app.py | 2 +- 3 files changed, 125 insertions(+), 8 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index 8709461da3..58f172e5a9 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -12,9 +12,10 @@ import json import ssl import urllib.request import urllib.error +import shutil from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR -from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTextEdit, QGroupBox +from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTextEdit, QGroupBox, QCheckBox, QPushButton from UM.Application import Application from UM.Logger import Logger @@ -67,15 +68,120 @@ class CrashHandler: if not CuraDebugMode and exception_type not in fatal_exception_types: return + self._send_report_checkbox = None + self.early_crash_dialog = self._createEarlyCrashDialog() self.dialog = QDialog() self._createDialog() + def _createEarlyCrashDialog(self): + dialog = QDialog() + dialog.setMinimumWidth(500) + dialog.setMinimumHeight(170) + dialog.setWindowTitle(catalog.i18nc("@title:window", "Cura Crashed")) + dialog.finished.connect(self._closeEarlyCrashDialog) + + layout = QVBoxLayout(dialog) + + label = QLabel() + label.setText(catalog.i18nc("@label crash message", """

    A fatal error has occurred.

    +

    Unfortunately, Cura encountered an unrecoverable error during start up. It was possibly caused by some incorrect configuration files. We suggest to backup and reset your configuration.

    +

    Please send us this Crash Report to fix the problem.

    + """)) + label.setWordWrap(True) + layout.addWidget(label) + + # "send report" check box and show details + self._send_report_checkbox = QCheckBox(catalog.i18nc("@action:button", "Send crash report to Ultimaker"), dialog) + self._send_report_checkbox.setChecked(True) + + show_details_button = QPushButton(catalog.i18nc("@action:button", "Show detailed crash report"), dialog) + show_details_button.setMaximumWidth(180) + show_details_button.clicked.connect(self._showDetailedReport) + + layout.addWidget(self._send_report_checkbox) + layout.addWidget(show_details_button) + + # "backup and start clean" and "close" buttons + buttons = QDialogButtonBox() + buttons.addButton(QDialogButtonBox.Close) + buttons.addButton(catalog.i18nc("@action:button", "Backup and Reset Configuration"), QDialogButtonBox.AcceptRole) + buttons.rejected.connect(self._closeEarlyCrashDialog) + buttons.accepted.connect(self._backupAndStartClean) + + layout.addWidget(buttons) + + return dialog + + def _closeEarlyCrashDialog(self): + if self._send_report_checkbox.isChecked(): + self._sendCrashReport() + os._exit(1) + + def _backupAndStartClean(self): + # TODO: backup the current cura directories and create clean ones + from cura.CuraVersion import CuraVersion + from UM.Resources import Resources + # The early crash may happen before those information is set in Resources, so we need to set them here to + # make sure that Resources can find the correct place. + Resources.ApplicationIdentifier = "cura" + Resources.ApplicationVersion = CuraVersion + config_path = Resources.getConfigStoragePath() + data_path = Resources.getDataStoragePath() + cache_path = Resources.getCacheStoragePath() + + folders_to_backup = [] + folders_to_remove = [] # only cache folder needs to be removed + + folders_to_backup.append(config_path) + if data_path != config_path: + folders_to_backup.append(data_path) + + # Only remove the cache folder if it's not the same as data or config + if cache_path not in (config_path, data_path): + folders_to_remove.append(cache_path) + + for folder in folders_to_remove: + shutil.rmtree(folder, ignore_errors = True) + for folder in folders_to_backup: + base_name = os.path.basename(folder) + root_dir = os.path.dirname(folder) + + idx = 0 + file_name = base_name + "_" + str(time.time()) + zip_file_path = os.path.join(root_dir, file_name + ".zip") + while os.path.exists(zip_file_path): + idx += 1 + file_name = base_name + "_" + str(time.time()) + "_" + idx + zip_file_path = os.path.join(root_dir, file_name + ".zip") + try: + # remove the .zip extension because make_archive() adds it + zip_file_path = zip_file_path[:-4] + shutil.make_archive(zip_file_path, "zip", root_dir = root_dir, base_dir = base_name) + + # remove the folder only when the backup is successful + shutil.rmtree(folder) + # create an empty folder so Resources will not try to copy the old ones + os.makedirs(folder, 0o0755, exist_ok=True) + + except Exception as e: + Logger.logException("e", "Failed to backup [%s] to file [%s]", folder, zip_file_path) + if not self.has_started: + print("Failed to backup [%s] to file [%s]: %s", folder, zip_file_path, e) + + self.early_crash_dialog.close() + + def _showDetailedReport(self): + self.dialog.exec_() + ## Creates a modal dialog. def _createDialog(self): self.dialog.setMinimumWidth(640) self.dialog.setMinimumHeight(640) self.dialog.setWindowTitle(catalog.i18nc("@title:window", "Crash Report")) - self.dialog.finished.connect(self._close) + # if the application has not fully started, this will be a detailed report dialog which should not + # close the application when it's closed. + if self.has_started: + self.dialog.finished.connect(self._close) layout = QVBoxLayout(self.dialog) @@ -249,9 +355,13 @@ class CrashHandler: def _buttonsWidget(self): buttons = QDialogButtonBox() buttons.addButton(QDialogButtonBox.Close) - buttons.addButton(catalog.i18nc("@action:button", "Send report"), QDialogButtonBox.AcceptRole) + # Like above, this will be served as a separate detailed report dialog if the application has not yet been + # fully loaded. In this case, "send report" will be a check box in the early crash dialog, so there is no + # need for this extra button. + if self.has_started: + buttons.addButton(catalog.i18nc("@action:button", "Send report"), QDialogButtonBox.AcceptRole) + buttons.accepted.connect(self._sendCrashReport) buttons.rejected.connect(self.dialog.close) - buttons.accepted.connect(self._sendCrashReport) return buttons @@ -269,15 +379,23 @@ class CrashHandler: kwoptions["context"] = ssl._create_unverified_context() Logger.log("i", "Sending crash report info to [%s]...", self.crash_url) + if not self.has_started: + print("Sending crash report info to [%s]...\n" % self.crash_url) try: f = urllib.request.urlopen(self.crash_url, **kwoptions) Logger.log("i", "Sent crash report info.") + if not self.has_started: + print("Sent crash report info.\n") f.close() - except urllib.error.HTTPError: + except urllib.error.HTTPError as e: Logger.logException("e", "An HTTP error occurred while trying to send crash report") - except Exception: # We don't want any exception to cause problems + if not self.has_started: + print("An HTTP error occurred while trying to send crash report: %s" % e) + except Exception as e: # We don't want any exception to cause problems Logger.logException("e", "An exception occurred while trying to send crash report") + if not self.has_started: + print("An exception occurred while trying to send crash report: %s" % e) os._exit(1) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 301215005e..81956c04f1 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -134,7 +134,6 @@ class CuraApplication(QtApplication): stacksValidationFinished = pyqtSignal() # Emitted whenever a validation is finished def __init__(self, **kwargs): - # 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"]: Resources.addExpectedDirNameInData(dir_name) diff --git a/cura_app.py b/cura_app.py index 624228b715..a4099881d1 100755 --- a/cura_app.py +++ b/cura_app.py @@ -103,7 +103,7 @@ def exceptHook(hook_type, value, traceback): else: application = QApplication(sys.argv) _crash_handler = CrashHandler(hook_type, value, traceback, has_started) - _crash_handler.dialog.show() + _crash_handler.early_crash_dialog.show() sys.exit(application.exec_()) if not known_args["debug"]: From aefe24222f05a183f88473648eca55f060bd54e3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 30 Jan 2018 16:04:11 +0100 Subject: [PATCH 509/551] Add a CLI flag to test early crash CURA-4895 --- cura/CuraApplication.py | 4 ++++ cura_app.py | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 81956c04f1..c39ce1d079 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -223,6 +223,10 @@ class CuraApplication(QtApplication): tray_icon_name = "cura-icon-32.png", **kwargs) + # FOR TESTING ONLY + if kwargs["parsed_command_line"].get("trigger_early_crash", False): + 1/0 + self.default_theme = "cura-light" self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) diff --git a/cura_app.py b/cura_app.py index a4099881d1..79ef170ac9 100755 --- a/cura_app.py +++ b/cura_app.py @@ -16,6 +16,12 @@ parser.add_argument('--debug', default = False, help = "Turn on the debug mode by setting this option." ) +parser.add_argument('--trigger-early-crash', + dest = 'trigger_early_crash', + action = 'store_true', + default = False, + help = "FOR TESTING ONLY. Trigger an early crash to show the crash dialog." + ) known_args = vars(parser.parse_known_args()[0]) if not known_args["debug"]: From 30b1e74881bcfe85ffe035b24157f42918904861 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 30 Jan 2018 16:41:33 +0100 Subject: [PATCH 510/551] Fixes for early crash dialog CURA-4895 --- cura/CrashHandler.py | 8 +++++++- cura_app.py | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index 58f172e5a9..3ddc878b40 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -13,6 +13,7 @@ import ssl import urllib.request import urllib.error import shutil +import sys from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTextEdit, QGroupBox, QCheckBox, QPushButton @@ -140,6 +141,11 @@ class CrashHandler: if cache_path not in (config_path, data_path): folders_to_remove.append(cache_path) + # need to close the redirected stdout and stderr files, otherwise, on Windows, those opened files will prevent + # the directory removal calls below. + sys.stdout.close() + sys.stderr.close() + for folder in folders_to_remove: shutil.rmtree(folder, ignore_errors = True) for folder in folders_to_backup: @@ -159,7 +165,7 @@ class CrashHandler: shutil.make_archive(zip_file_path, "zip", root_dir = root_dir, base_dir = base_name) # remove the folder only when the backup is successful - shutil.rmtree(folder) + shutil.rmtree(folder, ignore_errors = True) # create an empty folder so Resources will not try to copy the old ones os.makedirs(folder, 0o0755, exist_ok=True) diff --git a/cura_app.py b/cura_app.py index 79ef170ac9..4bab1d5a7b 100755 --- a/cura_app.py +++ b/cura_app.py @@ -101,7 +101,7 @@ def exceptHook(hook_type, value, traceback): _crash_handler = CrashHandler(hook_type, value, traceback, has_started) if not has_started: CuraApplication.getInstance().removePostedEvents(None) - _crash_handler.show() + _crash_handler.early_crash_dialog.show() sys.exit(CuraApplication.getInstance().exec_()) else: _crash_handler.show() From c2aa5fc2a2756404f8ded96218aeeea566d8cdfb Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 1 Feb 2018 13:12:23 +0100 Subject: [PATCH 511/551] Only initialise AutoSave after Application finishes its start up CURA-4895 --- cura/CuraApplication.py | 8 ++++++++ plugins/AutoSave/AutoSave.py | 18 ++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c39ce1d079..e2efaeb517 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -106,6 +106,14 @@ if not MYPY: CuraDebugMode = False +# +# A global signal which is triggered when CuraApplication has finished its start up. +# This is used to initialise some plugins such as AutoSave which should only be started after the application passed +# the start up successfully. +# +applicationStarted = pyqtSignal() + + 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 diff --git a/plugins/AutoSave/AutoSave.py b/plugins/AutoSave/AutoSave.py index 331f328f2d..30c12b5424 100644 --- a/plugins/AutoSave/AutoSave.py +++ b/plugins/AutoSave/AutoSave.py @@ -9,6 +9,7 @@ from UM.Application import Application from UM.Resources import Resources from UM.Logger import Logger + class AutoSave(Extension): def __init__(self): super().__init__() @@ -16,8 +17,6 @@ class AutoSave(Extension): Preferences.getInstance().preferenceChanged.connect(self._triggerTimer) self._global_stack = None - Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) - self._onGlobalStackChanged() Preferences.getInstance().addPreference("cura/autosave_delay", 1000 * 10) @@ -28,6 +27,21 @@ class AutoSave(Extension): self._saving = False + # At this point, the Application instance has not finished its constructor call yet, so directly using something + # like Application.getInstance() is not correct. The initialisation now will only gets triggered after the + # application finishes its start up successfully. + from cura.CuraApplication import applicationStarted + applicationStarted.connect(self.initialize) + + def initialize(self): + from cura.CuraApplication import applicationStarted + applicationStarted.disconnect(self.initialize) + + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) + self._onGlobalStackChanged() + + self._triggerTimer() + def _triggerTimer(self, *args): if not self._saving: self._change_timer.start() From 547baff239524301b134d1378db5bc125f55c67c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 1 Feb 2018 13:17:37 +0100 Subject: [PATCH 512/551] Always show crash dialog CURA-4895 --- cura/CrashHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index 3ddc878b40..f49983143f 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -66,7 +66,7 @@ class CrashHandler: for part in line.rstrip("\n").split("\n"): Logger.log("c", part) - if not CuraDebugMode and exception_type not in fatal_exception_types: + if exception_type not in fatal_exception_types: return self._send_report_checkbox = None From b59eadce1c6b90984999aeae7c437e09607f33be Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 1 Feb 2018 16:39:56 +0100 Subject: [PATCH 513/551] Fix AutoSave crashing the early crash dialog CURA-4895 --- cura/CrashHandler.py | 5 ++++- cura/CuraApplication.py | 8 -------- cura_app.py | 1 + plugins/AutoSave/AutoSave.py | 17 +++++++++++++---- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index f49983143f..e5975b9b2b 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -66,7 +66,10 @@ class CrashHandler: for part in line.rstrip("\n").split("\n"): Logger.log("c", part) - if exception_type not in fatal_exception_types: + # If Cura has fully started, we only show fatal errors. + # If Cura has not fully started yet, we always show the early crash dialog. Otherwise, Cura will just crash + # without any information. + if has_started and exception_type not in fatal_exception_types: return self._send_report_checkbox = None diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e2efaeb517..c39ce1d079 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -106,14 +106,6 @@ if not MYPY: CuraDebugMode = False -# -# A global signal which is triggered when CuraApplication has finished its start up. -# This is used to initialise some plugins such as AutoSave which should only be started after the application passed -# the start up successfully. -# -applicationStarted = pyqtSignal() - - 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 diff --git a/cura_app.py b/cura_app.py index 4bab1d5a7b..d1cf215fc5 100755 --- a/cura_app.py +++ b/cura_app.py @@ -108,6 +108,7 @@ def exceptHook(hook_type, value, traceback): sys.exit(1) else: application = QApplication(sys.argv) + application.removePostedEvents(None) _crash_handler = CrashHandler(hook_type, value, traceback, has_started) _crash_handler.early_crash_dialog.show() sys.exit(application.exec_()) diff --git a/plugins/AutoSave/AutoSave.py b/plugins/AutoSave/AutoSave.py index 30c12b5424..a549e6ff0a 100644 --- a/plugins/AutoSave/AutoSave.py +++ b/plugins/AutoSave/AutoSave.py @@ -30,12 +30,21 @@ class AutoSave(Extension): # At this point, the Application instance has not finished its constructor call yet, so directly using something # like Application.getInstance() is not correct. The initialisation now will only gets triggered after the # application finishes its start up successfully. - from cura.CuraApplication import applicationStarted - applicationStarted.connect(self.initialize) + self._init_timer = QTimer() + self._init_timer.setInterval(1000) + self._init_timer.setSingleShot(True) + self._init_timer.timeout.connect(self.initialize) + self._init_timer.start() def initialize(self): - from cura.CuraApplication import applicationStarted - applicationStarted.disconnect(self.initialize) + # only initialise if the application is created and has started + from cura.CuraApplication import CuraApplication + if not CuraApplication.Created: + self._init_timer.start() + return + if not CuraApplication.getInstance().started: + self._init_timer.start() + return Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() From e1bca1ca5d2c646b057cd2d1f24c2a5d94a43f33 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 5 Feb 2018 10:57:12 +0100 Subject: [PATCH 514/551] CURA-4895 Don't run autosave settings if application has not been created or if not started --- plugins/AutoSave/AutoSave.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins/AutoSave/AutoSave.py b/plugins/AutoSave/AutoSave.py index a549e6ff0a..50b66885d4 100644 --- a/plugins/AutoSave/AutoSave.py +++ b/plugins/AutoSave/AutoSave.py @@ -67,6 +67,15 @@ class AutoSave(Extension): self._global_stack.containersChanged.connect(self._triggerTimer) def _onTimeout(self): + # only initialise if the application is created and has started + from cura.CuraApplication import CuraApplication + if not CuraApplication.Created: + self._change_timer.start() + return + if not CuraApplication.getInstance().started: + self._change_timer.start() + return + self._saving = True # To prevent the save process from triggering another autosave. Logger.log("d", "Autosaving preferences, instances and profiles") From 915bb2e450ad2a710c4cdb6815c663904dbb91f5 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 5 Feb 2018 11:16:30 +0100 Subject: [PATCH 515/551] CURA-4895 Connect timer signal just if CuraApplication has been previously created and started --- plugins/AutoSave/AutoSave.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/plugins/AutoSave/AutoSave.py b/plugins/AutoSave/AutoSave.py index 50b66885d4..5fdac502b5 100644 --- a/plugins/AutoSave/AutoSave.py +++ b/plugins/AutoSave/AutoSave.py @@ -23,7 +23,6 @@ class AutoSave(Extension): self._change_timer = QTimer() self._change_timer.setInterval(Preferences.getInstance().getValue("cura/autosave_delay")) self._change_timer.setSingleShot(True) - self._change_timer.timeout.connect(self._onTimeout) self._saving = False @@ -46,6 +45,7 @@ class AutoSave(Extension): self._init_timer.start() return + self._change_timer.timeout.connect(self._onTimeout) Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() @@ -67,15 +67,6 @@ class AutoSave(Extension): self._global_stack.containersChanged.connect(self._triggerTimer) def _onTimeout(self): - # only initialise if the application is created and has started - from cura.CuraApplication import CuraApplication - if not CuraApplication.Created: - self._change_timer.start() - return - if not CuraApplication.getInstance().started: - self._change_timer.start() - return - self._saving = True # To prevent the save process from triggering another autosave. Logger.log("d", "Autosaving preferences, instances and profiles") From 383319d631c644d29c9b7a1e98ad1ed3b574f48c Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 5 Feb 2018 11:17:17 +0100 Subject: [PATCH 516/551] CURA-4895 Correctly format the date for the backup file --- cura/CrashHandler.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index e5975b9b2b..e90619aee5 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -144,23 +144,20 @@ class CrashHandler: if cache_path not in (config_path, data_path): folders_to_remove.append(cache_path) - # need to close the redirected stdout and stderr files, otherwise, on Windows, those opened files will prevent - # the directory removal calls below. - sys.stdout.close() - sys.stderr.close() - for folder in folders_to_remove: shutil.rmtree(folder, ignore_errors = True) for folder in folders_to_backup: base_name = os.path.basename(folder) root_dir = os.path.dirname(folder) + import datetime + date_now = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") idx = 0 - file_name = base_name + "_" + str(time.time()) + file_name = base_name + "_" + date_now zip_file_path = os.path.join(root_dir, file_name + ".zip") while os.path.exists(zip_file_path): idx += 1 - file_name = base_name + "_" + str(time.time()) + "_" + idx + file_name = base_name + "_" + date_now + "_" + idx zip_file_path = os.path.join(root_dir, file_name + ".zip") try: # remove the .zip extension because make_archive() adds it From 516d7015e499f277ee34497669d48afc87fdc84e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 5 Feb 2018 11:37:36 +0100 Subject: [PATCH 517/551] Fixed some issues caused by the multi buildplate system --- cura/ObjectsModel.py | 8 +++++++- cura/Scene/CuraSceneController.py | 2 ++ plugins/CuraEngineBackend/CuraEngineBackend.py | 6 ++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/cura/ObjectsModel.py b/cura/ObjectsModel.py index 1516b3ee33..f02e8b4db5 100644 --- a/cura/ObjectsModel.py +++ b/cura/ObjectsModel.py @@ -8,6 +8,7 @@ from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") + ## Keep track of all objects in the project class ObjectsModel(ListModel): def __init__(self): @@ -46,10 +47,15 @@ class ObjectsModel(ListModel): name = catalog.i18nc("@label", "Group #{group_nr}").format(group_nr = str(group_nr)) group_nr += 1 + if hasattr(node, "isOutsideBuildArea"): + is_outside_build_area = node.isOutsideBuildArea() + else: + is_outside_build_area = False + nodes.append({ "name": name, "isSelected": Selection.isSelected(node), - "isOutsideBuildArea": node.isOutsideBuildArea(), + "isOutsideBuildArea": is_outside_build_area, "buildPlateNumber": node_build_plate_number, "node": node }) diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index a93a8769d0..1c008d1893 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -59,6 +59,8 @@ class CuraSceneController(QObject): for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): if node.callDecoration("isSliceable"): build_plate_number = node.callDecoration("getBuildPlateNumber") + if build_plate_number is None: + build_plate_number = 0 max_build_plate = max(build_plate_number, max_build_plate) return max_build_plate diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 8d3b223c2c..86744ac21d 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -187,10 +187,8 @@ class CuraEngineBackend(QObject, Backend): ## Manually triggers a reslice @pyqtSlot() def forceSlice(self): - if self._use_timer: - self._change_timer.start() - else: - self.slice() + self.markSliceAll() + self.slice() ## Perform a slice of the scene. def slice(self): From e01c8218fa796d909cc53957c8df005d2b73ae79 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 5 Feb 2018 13:02:30 +0100 Subject: [PATCH 518/551] Removed uneeded checks if a node was a SceneNode The "isSlicable" decorator already took care of this --- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 - plugins/CuraEngineBackend/StartSliceJob.py | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 86744ac21d..95712b291a 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -367,7 +367,6 @@ class CuraEngineBackend(QObject, Backend): self.backendStateChange.emit(BackendState.Error) else: self.backendStateChange.emit(BackendState.NotStarted) - pass self._invokeSlice() return diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index d4a958ae5f..ae8acdaf54 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -137,7 +137,7 @@ class StartSliceJob(Job): # Don't slice if there is a per object setting with an error value. for node in DepthFirstIterator(self._scene.getRoot()): - if type(node) is not CuraSceneNode or not node.isSelectable(): + if node.isSelectable(): continue if self._checkStackForErrors(node.callDecoration("getStack")): @@ -169,7 +169,7 @@ class StartSliceJob(Job): children = node.getAllChildren() children.append(node) for child_node in children: - if type(child_node) is CuraSceneNode and child_node.getMeshData() and child_node.getMeshData().getVertices() is not None: + if child_node.getMeshData() and child_node.getMeshData().getVertices() is not None: temp_list.append(child_node) if temp_list: @@ -181,13 +181,13 @@ class StartSliceJob(Job): temp_list = [] has_printing_mesh = False for node in DepthFirstIterator(self._scene.getRoot()): - if node.callDecoration("isSliceable") and type(node) is CuraSceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: + if node.callDecoration("isSliceable") and node.getMeshData() and node.getMeshData().getVertices() is not None: per_object_stack = node.callDecoration("getStack") is_non_printing_mesh = False if per_object_stack: is_non_printing_mesh = any(per_object_stack.getProperty(key, "value") for key in NON_PRINTING_MESH_SETTINGS) - if (node.callDecoration("getBuildPlateNumber") == self._build_plate_number): + if node.callDecoration("getBuildPlateNumber") == self._build_plate_number: if not getattr(node, "_outside_buildarea", False) or is_non_printing_mesh: temp_list.append(node) if not is_non_printing_mesh: From 2dee2ce5d9084048d8c2cd0736eeb11277f884c2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 5 Feb 2018 13:16:39 +0100 Subject: [PATCH 519/551] Fixed issue where optimized layer data could be empty --- cura/PrintInformation.py | 1 - plugins/CuraEngineBackend/CuraEngineBackend.py | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index cfd1e3fd3b..7b4b43eb14 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -110,7 +110,6 @@ class PrintInformation(QObject): self._print_time_message_values = {} - def _initPrintTimeMessageValues(self, build_plate_number): # Full fill message values using keys from _print_time_message_translations self._print_time_message_values[build_plate_number] = {} diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 95712b291a..1c275d6d5b 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -540,6 +540,8 @@ class CuraEngineBackend(QObject, Backend): # # \param message The protobuf message containing sliced layer data. def _onOptimizedLayerMessage(self, message): + if self._start_slice_job_build_plate not in self._stored_optimized_layer_data: + self._stored_optimized_layer_data[self._start_slice_job_build_plate] = [] self._stored_optimized_layer_data[self._start_slice_job_build_plate].append(message) ## Called when a progress message is received from the engine. From be660cc0bc9364d650ae92e0cd83b6f1cdecba77 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 5 Feb 2018 13:32:00 +0100 Subject: [PATCH 520/551] Update translations from Bothof These are the unchecked translations from Bothof in Cura 3.2. Other translations follow. Contributes to issue CURA-4883. --- resources/i18n/de_DE/cura.po | 256 ++++++++---------- resources/i18n/de_DE/fdmprinter.def.json.po | 86 +++--- resources/i18n/es_ES/cura.po | 256 ++++++++---------- resources/i18n/es_ES/fdmprinter.def.json.po | 86 +++--- resources/i18n/fr_FR/cura.po | 256 ++++++++---------- resources/i18n/fr_FR/fdmprinter.def.json.po | 86 +++--- resources/i18n/it_IT/cura.po | 256 ++++++++---------- resources/i18n/it_IT/fdmprinter.def.json.po | 86 +++--- resources/i18n/ja_JP/cura.po | 239 ++++++++--------- resources/i18n/ja_JP/fdmprinter.def.json.po | 90 +++---- resources/i18n/ko_KR/cura.po | 268 +++++++++---------- resources/i18n/ko_KR/fdmprinter.def.json.po | 74 +++--- resources/i18n/nl_NL/cura.po | 256 ++++++++---------- resources/i18n/nl_NL/fdmprinter.def.json.po | 78 +++--- resources/i18n/pt_PT/cura.po | 258 +++++++++--------- resources/i18n/pt_PT/fdmprinter.def.json.po | 99 +++---- resources/i18n/ru_RU/cura.po | 256 ++++++++---------- resources/i18n/ru_RU/fdmprinter.def.json.po | 86 +++--- resources/i18n/tr_TR/cura.po | 256 ++++++++---------- resources/i18n/tr_TR/fdmprinter.def.json.po | 86 +++--- resources/i18n/zh_CN/cura.po | 276 +++++++++----------- resources/i18n/zh_CN/fdmprinter.def.json.po | 114 ++++---- 22 files changed, 1729 insertions(+), 2075 deletions(-) diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index 6ade867317..4390cce0b6 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -187,7 +187,7 @@ msgstr "Drucker-Firmware" #: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Prepare" -msgstr "" +msgstr "Vorbereiten" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -560,7 +560,7 @@ msgstr "Öffnet die Schaltfläche für Druckaufträge in Ihrem Browser." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 msgctxt "@label Printer name" msgid "Unknown" -msgstr "" +msgstr "Unbekannt" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format @@ -595,7 +595,7 @@ msgstr "Anschluss über Netzwerk" #: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Monitor" -msgstr "" +msgstr "Überwachen" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format @@ -622,7 +622,7 @@ msgstr "Zugriff auf Update-Informationen nicht möglich." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." -msgstr "" +msgstr "SolidWorks hat beim Öffnen Ihrer Datei Fehler gemeldet. Wir empfehlen, diese Probleme direkt in SolidWorks zu lösen." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 msgctxt "@info:status" @@ -630,7 +630,7 @@ msgid "" "Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" "\n" " Thanks!." -msgstr "" +msgstr "Keine Modelle in Ihrer Zeichnung gefunden. Bitte überprüfen Sie den Inhalt erneut und stellen Sie sicher, dass ein Teil oder eine Baugruppe enthalten ist.\n\n Danke!" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 msgctxt "@info:status" @@ -638,7 +638,7 @@ msgid "" "Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" "\n" "Sorry!" -msgstr "" +msgstr "Es wurde mehr als ein Teil oder eine Baugruppe in Ihrer Zeichnung gefunden. Wir unterstützen derzeit nur Zeichnungen mit exakt einem Teil oder einer Baugruppe.\n\nEs tut uns leid!" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" @@ -653,7 +653,7 @@ msgstr "SolidWorks Einbaudatei" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 msgctxt "@item:inlistbox" msgid "SolidWorks drawing file" -msgstr "" +msgstr "SolidWorks Zeichnungsdatei" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 msgctxt "@info:status" @@ -663,7 +663,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Sehr geehrter Kunde,\nwir konnten keine gültige Installation von SolidWorks auf Ihrem System finden. Das bedeutet, dass SolidWorks entweder nicht installiert ist oder sie keine gültige Lizenz besitzen. Stellen Sie bitte sicher, dass SolidWorks problemlos läuft und/oder wenden Sie sich an Ihre ICT-Abteilung.\n\nMit freundlichen Grüßen\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 msgctxt "@info:status" @@ -673,7 +673,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Sehr geehrter Kunde,\nSie verwenden dieses Plugin derzeit auf einem anderen Betriebssystem als Windows. Dieses Plugin funktioniert nur auf Windows mit installiertem SolidWorks und einer gültigen Lizenz. Installieren Sie dieses Plugin bitte auf einem Windows-Rechner mit installiertem SolidWorks.\n\nMit freundlichen Grüßen\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" @@ -681,7 +681,7 @@ msgstr "Konfigurieren" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 msgid "Installation guide for SolidWorks macro" -msgstr "" +msgstr "Installationsanleitung für SolidWorks Makro" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" @@ -705,7 +705,7 @@ msgstr "G-Code ändern" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" msgid "Cura collects anonymized usage statistics." -msgstr "" +msgstr "Cura erfasst anonymisierte Nutzungsstatistiken." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -715,22 +715,22 @@ msgstr "Daten werden erfasst" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Allow" -msgstr "" +msgstr "Zulassen" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." -msgstr "" +msgstr "Damit lassen Sie zu, dass Cura anonymisierte Nutzungsstatistiken sendet, um zukünftige Verbesserungen für Cura zu definieren. Einige Ihrer Präferenzen und Einstellungen, die Cura-Version und ein Hash der Modelle, die Sie slicen, werden gesendet." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 msgctxt "@action:button" msgid "Disable" -msgstr "" +msgstr "Deaktivieren" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:tooltip" msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." -msgstr "" +msgstr "Damit wird Cura die Erlaubnis zum Senden von anonymisierten Nutzungsstatistiken entzogen. Sie können die Erlaubnis in den Einstellungen erneut aktivieren." #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -740,14 +740,14 @@ msgstr "Cura 15.04-Profile" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 msgctxt "@item:inlistbox" msgid "Blender file" -msgstr "" +msgstr "Blender-Datei" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 msgctxt "@info:status" msgid "" "Could not export using \"{}\" quality!\n" "Felt back to \"{}\"." -msgstr "" +msgstr "Exportieren in \"{}\" Qualität nicht möglich!\nZurückgeschaltet auf \"{}\"." #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 @@ -934,12 +934,12 @@ msgstr "Cura-Profil" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 msgctxt "@item:inmenu" msgid "Profile Assistant" -msgstr "" +msgstr "Profilassistent" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 msgctxt "@item:inlistbox" msgid "Profile Assistant" -msgstr "" +msgstr "Profilassistent" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" @@ -1137,13 +1137,13 @@ msgstr "Import des Profils aus Datei {0} fehlgeschlagen: or !" msgid "This profile {0} contains incorrect data, could not import it." -msgstr "" +msgstr "Dieses Profil {0} enthält falsche Daten, Importieren nicht möglich." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." -msgstr "" +msgstr "Die Maschine, die im Profil {0} definiert wurde, entspricht nicht Ihrer derzeitigen Maschine. Importieren nicht möglich." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format @@ -1155,7 +1155,7 @@ msgstr "Profil erfolgreich importiert {0}" #, python-brace-format msgctxt "@info:status" msgid "File {0} does not contain any valid profile." -msgstr "" +msgstr "Datei {0} enthält kein gültiges Profil." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format @@ -1183,7 +1183,7 @@ msgstr "Es konnte keine Qualitätsangabe {0} für die vorliegende Konfiguration #, python-brace-format msgctxt "@label" msgid "Group #{group_nr}" -msgstr "" +msgstr "Gruppe #{group_nr}" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" @@ -1242,7 +1242,7 @@ msgid "" "

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

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

    Ein schwerer Fehler ist aufgetreten. Senden Sie uns diesen Absturzbericht, um das Problem zu beheben

    \n

    Verwenden Sie bitte die Schaltfläche „Bericht senden“, um den Fehlerbericht automatisch an unsere Server zu senden

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" @@ -1257,32 +1257,32 @@ msgstr "Unbekannt" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 msgctxt "@label Cura version number" msgid "Cura version" -msgstr "" +msgstr "Cura-Version" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 msgctxt "@label Type of platform" msgid "Platform" -msgstr "" +msgstr "Plattform" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 msgctxt "@label" msgid "Qt version" -msgstr "" +msgstr "Qt Version" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 msgctxt "@label" msgid "PyQt version" -msgstr "" +msgstr "PyQt Version" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 msgctxt "@label OpenGL version" msgid "OpenGL" -msgstr "" +msgstr "OpenGL" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 msgctxt "@label" msgid "not yet initialised
    " -msgstr "" +msgstr "noch nicht initialisiert
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format @@ -1305,7 +1305,7 @@ msgstr "
  • OpenGL-Renderer: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" msgid "Error traceback" -msgstr "" +msgstr "Fehler-Rückverfolgung" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" @@ -1516,7 +1516,7 @@ msgstr "Düsengröße" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 msgctxt "@label" msgid "Compatible material diameter" -msgstr "" +msgstr "Kompatibler Materialdurchmesser" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 msgctxt "@tooltip" @@ -1618,10 +1618,7 @@ 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 "" -"Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n" -"\n" -"Wählen Sie Ihren Drucker aus der folgenden Liste:" +msgstr "Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n\nWählen Sie Ihren Drucker aus der folgenden Liste:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1661,12 +1658,12 @@ msgstr "Typ" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "" +msgstr "Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "" +msgstr "Ultimaker 3 Extended" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1733,7 +1730,7 @@ msgstr "%1 ist nicht für das Hosten einer Gruppe verbundener Ultimaker 3-Drucke #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 msgctxt "@label link to connect manager" msgid "Add/Remove printers" -msgstr "" +msgstr "Drucker hinzufügen/entfernen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" @@ -1773,7 +1770,7 @@ msgstr "Verbindung zum Drucker wurde unterbrochen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 msgctxt "@label Printer status" msgid "Unknown" -msgstr "" +msgstr "Unbekannt" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" @@ -1869,164 +1866,164 @@ msgstr "Konfiguration aktivieren" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" msgid "SolidWorks: Export wizard" -msgstr "" +msgstr "SolidWorks: Exportassistent" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" msgid "Quality:" -msgstr "" +msgstr "Qualität:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (3D-printing)" -msgstr "" +msgstr "Fein (3D-Druck)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (3D-printing)" -msgstr "" +msgstr "Grob (3D-Druck)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (SolidWorks)" -msgstr "" +msgstr "Fein (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (SolidWorks)" -msgstr "" +msgstr "Grob (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" msgid "Show this dialog again" -msgstr "" +msgstr "Diesen Dialog erneut anzeigen" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 msgctxt "@action:button" msgid "Continue" -msgstr "" +msgstr "Weiter" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 msgctxt "@action:button" msgid "Abort" -msgstr "" +msgstr "Abbrechen" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 msgctxt "@title:window" msgid "How to install Cura SolidWorks macro" -msgstr "" +msgstr "Installieren von Cura SolidWorks Makro" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 msgctxt "@description:label" msgid "Steps:" -msgstr "" +msgstr "Schritte:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 msgctxt "@action:button" msgid "" "Open the directory\n" "with macro and icon" -msgstr "" +msgstr "Verzeichnis\nmit Makro und Symbol öffnen" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 msgctxt "@description:label" msgid "Instructions:" -msgstr "" +msgstr "Anweisungen:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 msgctxt "@action:playpause" msgid "Play" -msgstr "" +msgstr "Wiedergeben" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 msgctxt "@action:playpause" msgid "Pause" -msgstr "" +msgstr "Pausieren" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 msgctxt "@action:button" msgid "Previous Step" -msgstr "" +msgstr "Vorheriger Schritt" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 msgctxt "@action:button" msgid "Done" -msgstr "" +msgstr "Fertig" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 msgctxt "@action:button" msgid "Next Step" -msgstr "" +msgstr "Nächster Schritt" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 msgctxt "@title:window" msgid "SolidWorks plugin: Configuration" -msgstr "" +msgstr "SolidWorks Plugin: Konfiguration" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 msgctxt "@title:tab" msgid "Conversion settings" -msgstr "" +msgstr "Konvertierungseinstellungen" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 msgctxt "@label" msgid "First choice:" -msgstr "" +msgstr "Erste Wahl:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 msgctxt "@text:menu" msgid "Latest installed version (Recommended)" -msgstr "" +msgstr "Aktuelle installierte Version (Empfohlen)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 msgctxt "@text:menu" msgid "Default version" -msgstr "" +msgstr "Standardversion" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 msgctxt "@label" msgid "Show wizard before opening SolidWorks files" -msgstr "" +msgstr "Assistent vor dem Öffnen von SolidWorks-Dateien anzeigen" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 msgctxt "@label" msgid "Automatically rotate opened file into normed orientation" -msgstr "" +msgstr "Geöffnete Datei automatisch in normale Ausrichtung drehen" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 msgctxt "@title:tab" msgid "Installation(s)" -msgstr "" +msgstr "Installation(en)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 msgctxt "@label" msgid "COM service found" -msgstr "" +msgstr "COM-Service gefunden" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 msgctxt "@label" msgid "Executable found" -msgstr "" +msgstr "Ausführbare Datei gefunden" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 msgctxt "@label" msgid "COM starting" -msgstr "" +msgstr "COM wird gestartet" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 msgctxt "@label" msgid "Revision number" -msgstr "" +msgstr "Revisionsnummer" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 msgctxt "@label" msgid "Functions available" -msgstr "" +msgstr "Verfügbare Funktionen" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 @@ -2212,32 +2209,32 @@ msgstr "Glättung" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 msgctxt "@label" msgid "Mesh Type" -msgstr "" +msgstr "Mesh-Typ" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 msgctxt "@label" msgid "Normal model" -msgstr "" +msgstr "Normales Modell" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 msgctxt "@label" msgid "Print as support" -msgstr "" +msgstr "Als Stützstruktur drucken" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 msgctxt "@label" msgid "Don't support overlap with other models" -msgstr "" +msgstr "Keine Überlappung mit anderen Modellen unterstützen" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 msgctxt "@label" msgid "Modify settings for overlap with other models" -msgstr "" +msgstr "Einstellungen für Überlappung mit anderen Modellen bearbeiten" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 msgctxt "@label" msgid "Modify settings for infill of other models" -msgstr "" +msgstr "Einstellungen für Füllung von anderen Modellen bearbeiten" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" @@ -2423,10 +2420,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Dieses Plugin enthält eine Lizenz.\n" -"Sie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\n" -"Stimmen Sie den nachfolgenden Bedingungen zu?" +msgstr "Dieses Plugin enthält eine Lizenz.\nSie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\nStimmen Sie den nachfolgenden Bedingungen zu?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2691,9 +2685,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Sie haben einige Profileinstellungen angepasst.\n" -"Möchten Sie diese Einstellungen übernehmen oder verwerfen?" +msgstr "Sie haben einige Profileinstellungen angepasst.\nMöchten Sie diese Einstellungen übernehmen oder verwerfen?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3097,27 +3089,27 @@ msgstr "(Anonyme) Druckinformationen senden" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 msgctxt "@label" msgid "Experimental" -msgstr "" +msgstr "Experimentell" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 msgctxt "@info:tooltip" msgid "Use multi build plate functionality" -msgstr "" +msgstr "Mehrfach-Druckplattenfunktion verwenden" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 msgctxt "@option:check" msgid "Use multi build plate functionality (restart required)" -msgstr "" +msgstr "Mehrfach-Druckplattenfunktion verwenden (Neustart erforderlich)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 msgctxt "@info:tooltip" msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" -msgstr "" +msgstr "Sollen neu geladene Modelle auf der Druckplatte angeordnet werden? In Verbindung mit Mehrfach-Druckplatte verwenden (EXPERIMENTELL)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 msgctxt "@option:check" msgid "Do not arrange objects on load" -msgstr "" +msgstr "Keine Objekte beim Laden anordnen" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 @@ -3361,9 +3353,7 @@ 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 wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\n" -"Cura verwendet mit Stolz die folgenden Open Source-Projekte:" +msgstr "Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\nCura verwendet mit Stolz die folgenden Open Source-Projekte:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3471,10 +3461,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n" -"\n" -"Klicken Sie, um den Profilmanager zu öffnen." +msgstr "Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n\nKlicken Sie, um den Profilmanager zu öffnen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" @@ -3512,10 +3499,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n" -"\n" -"Klicken Sie, um diese Einstellungen sichtbar zu machen." +msgstr "Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n\nKlicken Sie, um diese Einstellungen sichtbar zu machen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3530,7 +3514,7 @@ msgstr "Wird beeinflusst von" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." -msgstr "" +msgstr "Diese Einstellung wird stets zwischen allen Extrudern geteilt. Eine Änderung ändert den Wert für alle Extruder." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" @@ -3543,10 +3527,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Diese Einstellung hat einen vom Profil abweichenden Wert.\n" -"\n" -"Klicken Sie, um den Wert des Profils wiederherzustellen." +msgstr "Diese Einstellung hat einen vom Profil abweichenden Wert.\n\nKlicken Sie, um den Wert des Profils wiederherzustellen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" @@ -3554,10 +3535,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n" -"\n" -"Klicken Sie, um den berechneten Wert wiederherzustellen." +msgstr "Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n\nKlicken Sie, um den berechneten Wert wiederherzustellen." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" @@ -3569,9 +3547,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Druckeinrichtung deaktiviert\n" -"G-Code-Dateien können nicht geändert werden" +msgstr "Druckeinrichtung deaktiviert\nG-Code-Dateien können nicht geändert werden" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" @@ -3581,7 +3557,7 @@ msgstr "00 Stunden 00 Minuten" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" msgid "Time specification" -msgstr "" +msgstr "Zeitangabe" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" @@ -3638,12 +3614,12 @@ msgstr "&Ansicht" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 msgctxt "@action:inmenu menubar:view" msgid "&Camera position" -msgstr "" +msgstr "&Kameraposition" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "" +msgstr "&Druckplatte" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" @@ -3813,27 +3789,27 @@ msgstr "&Beenden" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" msgid "&3D View" -msgstr "" +msgstr "&3D-Ansicht" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:view" msgid "&Front View" -msgstr "" +msgstr "&Vorderansicht" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 msgctxt "@action:inmenu menubar:view" msgid "&Top View" -msgstr "" +msgstr "&Draufsicht" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 msgctxt "@action:inmenu menubar:view" msgid "&Left Side View" -msgstr "" +msgstr "&Ansicht von links" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:view" msgid "&Right Side View" -msgstr "" +msgstr "&Ansicht von rechts" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" @@ -3959,7 +3935,7 @@ msgstr "Alle Modelle neu &laden" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "" +msgstr "Alle Modelle an allen Druckplatten anordnen" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" @@ -4019,7 +3995,7 @@ msgstr "Installierte plugins..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 msgctxt "@action:inmenu menubar:view" msgid "Expand/Collapse Sidebar" -msgstr "" +msgstr "Seitenleiste vergrößern/verkleinern" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" @@ -4054,12 +4030,12 @@ msgstr "Slicing ist nicht verfügbar" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Slice current printjob" -msgstr "" +msgstr "Aktuellen Druckauftrag slicen" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Cancel slicing process" -msgstr "" +msgstr "Slicing-Vorgang abbrechen" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" @@ -4115,7 +4091,7 @@ msgstr "Speichern &Als" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" msgid "Save &Project..." -msgstr "" +msgstr "&Projekt speichern..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" @@ -4354,7 +4330,7 @@ msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Kompatibilität prüfen" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" @@ -4364,17 +4340,17 @@ msgstr "Klicken Sie, um die Materialkompatibilität auf Ultimaker.com zu prüfen #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 msgctxt "@option:check" msgid "See only current build plate" -msgstr "" +msgstr "Nur aktuelle Druckplatte anzeigen" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 msgctxt "@action:button" msgid "Arrange to all build plates" -msgstr "" +msgstr "An allen Druckplatten ausrichten" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 msgctxt "@action:button" msgid "Arrange current build plate" -msgstr "" +msgstr "An aktueller Druckplatte ausrichten" #: MachineSettingsAction/plugin.json msgctxt "description" @@ -4469,22 +4445,22 @@ msgstr "USB-Drucken" #: PrepareStage/plugin.json msgctxt "description" msgid "Provides a prepare stage in Cura." -msgstr "" +msgstr "Bietet eine Vorbereitungsstufe in Cura." #: PrepareStage/plugin.json msgctxt "name" msgid "Prepare Stage" -msgstr "" +msgstr "Vorbereitungsstufe" #: CuraLiveScriptingPlugin/plugin.json msgctxt "description" msgid "Provides an edit window for direct script editing." -msgstr "" +msgstr "Bietet ein Bearbeitungsfenster für direkte Skriptbearbeitung." #: CuraLiveScriptingPlugin/plugin.json msgctxt "name" msgid "Live scripting tool" -msgstr "" +msgstr "Live-Scripting-Tool" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" @@ -4509,12 +4485,12 @@ msgstr "UM3-Netzwerkverbindung" #: MonitorStage/plugin.json msgctxt "description" msgid "Provides a monitor stage in Cura." -msgstr "" +msgstr "Bietet eine Überwachungsstufe in Cura." #: MonitorStage/plugin.json msgctxt "name" msgid "Monitor Stage" -msgstr "" +msgstr "Überwachungsstufe" #: FirmwareUpdateChecker/plugin.json msgctxt "description" @@ -4529,7 +4505,7 @@ msgstr "Firmware-Update-Prüfer" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." -msgstr "" +msgstr "Bietet Ihnen die Möglichkeit, bestimmte Dateien über SolidWorks selbst zu öffnen. Die Konvertierung erfolgt über dieses Plugin und zusätzliche Optimierungen." #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4599,12 +4575,12 @@ msgstr "Cura-Vorgängerprofil-Reader" #: CuraBlenderPlugin/plugin.json msgctxt "description" msgid "Helps to open Blender files directly in Cura." -msgstr "" +msgstr "Unterstützt das Öffnen der Blender-Dateien direkt in Cura." #: CuraBlenderPlugin/plugin.json msgctxt "name" msgid "Blender Integration (experimental)" -msgstr "" +msgstr "Blender-Integration (experimentell)" #: GCodeProfileReader/plugin.json msgctxt "description" @@ -4769,12 +4745,12 @@ msgstr "Cura-Profil-Writer" #: CuraPrintProfileCreator/plugin.json msgctxt "description" msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." -msgstr "" +msgstr "Ermöglichen Sie Materialherstellern die Erstellung neuer Material- und Qualitätsprofile, indem Sie eine Drop-In-Benutzerschnittstelle verwenden." #: CuraPrintProfileCreator/plugin.json msgctxt "name" msgid "Print Profile Assistant" -msgstr "" +msgstr "Druckprofil-Assistent" #: 3MFWriter/plugin.json msgctxt "description" diff --git a/resources/i18n/de_DE/fdmprinter.def.json.po b/resources/i18n/de_DE/fdmprinter.def.json.po index c70b25d7a8..3f4309f371 100644 --- a/resources/i18n/de_DE/fdmprinter.def.json.po +++ b/resources/i18n/de_DE/fdmprinter.def.json.po @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"Gcode-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n" -"." +msgstr "Gcode-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"Gcode-Befehle, die Am Ende ausgeführt werden sollen – getrennt durch \n" -"." +msgstr "Gcode-Befehle, die Am Ende ausgeführt werden sollen – getrennt durch \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -352,12 +348,12 @@ msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_firmware_retract label" msgid "Firmware Retraction" -msgstr "" +msgstr "Firmware-Einzug" #: fdmprinter.def.json msgctxt "machine_firmware_retract description" msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." -msgstr "" +msgstr "Definiert, ob Firmware-Einzugsbefehle (G10/G11) anstelle der E-Eigenschaft in G1-Befehlen verwendet wird, um das Material einzuziehen." #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" @@ -1052,12 +1048,12 @@ msgstr "Überall" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps label" msgid "Filter Out Tiny Gaps" -msgstr "" +msgstr "Kleine Lücken ausfiltern" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps description" msgid "Filter out tiny gaps to reduce blobs on outside of model." -msgstr "" +msgstr "Kleine Lücken ausfiltern, um Tropfen an der Außenseite des Modells zu reduzieren." #: fdmprinter.def.json msgctxt "fill_outline_gaps label" @@ -1442,7 +1438,7 @@ msgstr "X-Versatz Füllung" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is moved this distance along the X axis." -msgstr "" +msgstr "Das Füllmuster wird um diese Distanz entlang der X-Achse verschoben." #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1452,7 +1448,7 @@ msgstr "Y-Versatz Füllung" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is moved this distance along the Y axis." -msgstr "" +msgstr "Das Füllmuster wird um diese Distanz entlang der Y-Achse verschoben." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1472,7 +1468,7 @@ msgstr "Prozentsatz Füllung überlappen" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "Das Ausmaß des Überlappens zwischen der Füllung und den Wänden als Prozentwert der Füllungslinienbreite. Ein leichtes Überlappen ermöglicht es den Wänden, eine solide Verbindung mit der Füllung herzustellen." #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1492,7 +1488,7 @@ msgstr "Prozentsatz Außenhaut überlappen" #: fdmprinter.def.json msgctxt "skin_overlap description" msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." -msgstr "" +msgstr "Das Ausmaß des Überlappens zwischen der Außenhaut und den Wänden als Prozentwert der Außenhaut-Linienbreite. Ein leichtes Überlappen ermöglicht es den Wänden, eine solide Verbindung mit der Außenhaut herzustellen. Dies ist ein Prozentwert der durchschnittlichen Linienbreiten der Außenhautlinien und der innersten Wand." #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1722,7 +1718,7 @@ msgstr "Temperatur Druckplatte" #: fdmprinter.def.json msgctxt "material_bed_temperature description" msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." -msgstr "" +msgstr "Die Temperatur, die für die erhitzte Druckplatte verwendet wird. Wenn dieser Wert 0 beträgt, wird die Betttemperatur nicht angepasst." #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3504,9 +3500,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 "" -"Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\n" -"Es handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden mehrere Skirt-Linien in äußerer Richtung angebracht." +msgstr "Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\nEs handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden mehrere Skirt-Linien in äußerer Richtung angebracht." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4266,82 +4260,82 @@ msgstr "experimentell!" #: fdmprinter.def.json msgctxt "support_tree_enable label" msgid "Tree Support" -msgstr "" +msgstr "Baumstruktur" #: fdmprinter.def.json msgctxt "support_tree_enable description" msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." -msgstr "" +msgstr "Erstellen Sie eine baumähnliche Stützstruktur mit Ästen, die Ihren Druck stützen. Das reduziert möglicherweise den Materialverbrauch und die Druckdauer, erhöht jedoch die Slicing-Dauer erheblich." #: fdmprinter.def.json msgctxt "support_tree_angle label" msgid "Tree Support Branch Angle" -msgstr "" +msgstr "Astwinkel der Baumstützstruktur" #: fdmprinter.def.json msgctxt "support_tree_angle description" msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." -msgstr "" +msgstr "Dies bezeichnet den Winkel der Äste. Verwenden Sie einen geringeren Winkel, um sie vertikaler und stabiler zu gestalten. Verwenden Sie einen stärkeren Winkel, um mehr Reichweite zu erhalten." #: fdmprinter.def.json msgctxt "support_tree_branch_distance label" msgid "Tree Support Branch Distance" -msgstr "" +msgstr "Astabstand der Baumstützstruktur" #: fdmprinter.def.json msgctxt "support_tree_branch_distance description" msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." -msgstr "" +msgstr "Dies beschreibt, wie weit die Äste weg sein müssen, wenn sie das Modell berühren. Eine geringe Entfernung lässt die Baumstützstruktur das Modell an mehreren Punkten berühren, und führt zu einem besseren Überhang, allerdings lässt sich die Stützstruktur auch schwieriger entfernen." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter label" msgid "Tree Support Branch Diameter" -msgstr "" +msgstr "Astdurchmesser der Baumstützstruktur" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter description" msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." -msgstr "" +msgstr "Dies beschreibt den Durchmesser der dünnsten Äste der Baumstützstruktur. Dickere Äste sind stabiler. Äste zur Basis hin werden dicker als diese sein." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle label" msgid "Tree Support Branch Diameter Angle" -msgstr "" +msgstr "Winkel Astdurchmesser der Baumstützstruktur" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle description" msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." -msgstr "" +msgstr "Dies beschreibt den Winkel der Astdurchmesser, da sie stufenweise zum Boden hin dicker werden. Ein Winkel von 0 lässt die Äste über die gesamte Länge hinweg eine gleiche Dicke haben. Ein geringer Winkel kann die Stabilität der Baumstützstruktur erhöhen." #: fdmprinter.def.json msgctxt "support_tree_collision_resolution label" msgid "Tree Support Collision Resolution" -msgstr "" +msgstr "Kollisionsauflösung der Baumstützstruktur" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution description" msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." -msgstr "" +msgstr "Dies ist die Auflösung für die Berechnung von Kollisionen, um ein Anschlagen des Modells zu verhindern. Eine niedrigere Einstellung sorgt für akkuratere Bäume, die weniger häufig fehlschlagen, erhöht jedoch die Slicing-Zeit erheblich." #: fdmprinter.def.json msgctxt "support_tree_wall_thickness label" msgid "Tree Support Wall Thickness" -msgstr "" +msgstr "Wanddicke der Baumstützstruktur" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness description" msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "Das ist die Dicke der Astwände der Baumstützstruktur. Dickere Wände benötigen eine längere Druckdauer, fallen jedoch nicht so leicht um." #: fdmprinter.def.json msgctxt "support_tree_wall_count label" msgid "Tree Support Wall Line Count" -msgstr "" +msgstr "Anzahl der Wandlinien der Baumstützstruktur" #: fdmprinter.def.json msgctxt "support_tree_wall_count description" msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "Das ist die Anzahl der Astwände der Baumstützstruktur. Dickere Wände benötigen eine längere Druckdauer, fallen jedoch nicht so leicht um." #: fdmprinter.def.json msgctxt "slicing_tolerance label" @@ -4416,12 +4410,12 @@ msgstr "Eine Liste von Ganzzahl-Linienrichtungen für den Fall, wenn die oberen #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization label" msgid "Infill Travel Optimization" -msgstr "" +msgstr "Bewegungsoptimierung Füllung" #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization description" msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." -msgstr "" +msgstr "Bei Aktivierung wird die Reihenfolge, in der die Fülllinien gedruckt werden, optimiert, um die gefahrene Distanz zu reduzieren. Diese erzielte Reduzierung der Bewegung ist sehr stark von dem zu slicenden Modell, dem Füllmuster, der Dichte usw. abhängig. Beachten Sie, dass die Dauer für das Slicen bei einigen Modellen mit vielen kleinen Füllbereichen erheblich länger ausfallen kann." #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" @@ -4943,9 +4937,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 "" -"Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\n" -"Dies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur." +msgstr "Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\nDies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5055,42 +5047,42 @@ msgstr "Der Abstand zwischen der Düse und den horizontalen Abwärtslinien. Bei #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled label" msgid "Use adaptive layers" -msgstr "" +msgstr "Anpassschichten verwenden" #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled description" msgid "Adaptive layers computes the layer heights depending on the shape of the model." -msgstr "" +msgstr "Die Funktion Anpassschichten berechnet die Schichthöhe je nach Form des Modells." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation label" msgid "Adaptive layers maximum variation" -msgstr "" +msgstr "Maximale Abweichung für Anpassschichten" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height in mm." -msgstr "" +msgstr "Das ist die maximal zulässige Höhendifferenz von der Basisschichthöhe in mm." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" msgid "Adaptive layers variation step size" -msgstr "" +msgstr "Abweichung Schrittgröße für Anpassschichten" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step description" msgid "The difference in height of the next layer height compared to the previous one." -msgstr "" +msgstr "Der Höhenunterscheid der nächsten Schichthöhe im Vergleich zur vorherigen." #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold label" msgid "Adaptive layers threshold" -msgstr "" +msgstr "Schwellenwert Anpassschichten" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold description" msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." -msgstr "" +msgstr "Das ist der Schwellenwert, der definiert, ob eine kleinere Schicht verwendet wird oder nicht. Dieser Wert wird mit dem der stärksten Neigung in einer Schicht verglichen." #: fdmprinter.def.json msgctxt "command_line_settings label" diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index debb9dbfca..3e007739be 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -187,7 +187,7 @@ msgstr "Firmware de la impresora" #: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Prepare" -msgstr "" +msgstr "Preparar" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -560,7 +560,7 @@ msgstr "Abre la interfaz de trabajos de impresión en el navegador." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 msgctxt "@label Printer name" msgid "Unknown" -msgstr "" +msgstr "Desconocido" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format @@ -595,7 +595,7 @@ msgstr "Conectar a través de la red" #: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Monitor" -msgstr "" +msgstr "Supervisar" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format @@ -622,7 +622,7 @@ msgstr "No se pudo acceder a la información actualizada." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." -msgstr "" +msgstr "SolidWorks ha informado de errores al abrir el archivo. Le recomendamos que solucione estos problemas dentro del propio SolidWorks." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 msgctxt "@info:status" @@ -630,7 +630,7 @@ msgid "" "Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" "\n" " Thanks!." -msgstr "" +msgstr "No se han encontrado modelos en el dibujo. ¿Puede comprobar el contenido de nuevo y asegurarse de que hay una parte o un ensamblado dentro?\n\n Gracias." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 msgctxt "@info:status" @@ -638,7 +638,7 @@ msgid "" "Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" "\n" "Sorry!" -msgstr "" +msgstr "Se ha encontrado más de una parte o ensamblado en el dibujo. Actualmente únicamente son compatibles dibujos con una sola parte o ensamblado.\n\n Disculpe." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" @@ -653,7 +653,7 @@ msgstr "Archivo de ensamblado de SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 msgctxt "@item:inlistbox" msgid "SolidWorks drawing file" -msgstr "" +msgstr "Archivo de dibujo de SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 msgctxt "@info:status" @@ -663,7 +663,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Estimado cliente:\nNo hemos encontrado una instalación válida de SolidWorks en el sistema. Esto significa que SolidWorks no está instalado o que no dispone de una licencia válida. Asegúrese de que la ejecución del propio SolidWorks funciona sin problemas o póngase en contacto con su CDTI.\n\nAtentamente\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 msgctxt "@info:status" @@ -673,7 +673,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Estimado cliente:\nActualmente está ejecutando este complemento en un sistema operativo diferente a Windows. Este complemento solo funcionará en Windows con SolidWorks instalado, siempre que se disponga de una licencia válida. Instale este complemento en un equipo Windows con SolidWorks instalado.\n\nAtentamente\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" @@ -681,7 +681,7 @@ msgstr "Configurar" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 msgid "Installation guide for SolidWorks macro" -msgstr "" +msgstr "Guía de instalación para la macro de SolidWorks" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" @@ -705,7 +705,7 @@ msgstr "Modificar GCode" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" msgid "Cura collects anonymized usage statistics." -msgstr "" +msgstr "Cura recopila estadísticas de uso de forma anónima." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -715,22 +715,22 @@ msgstr "Recopilando datos" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Allow" -msgstr "" +msgstr "Permitir" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." -msgstr "" +msgstr "Permitir a Cura enviar estadísticas de uso de forma anónima para ayudar a priorizar mejoras futuras para Cura. Se envían algunas de sus preferencias y ajustes, la versión de Cura y un resumen de los modelos que está fragmentando." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 msgctxt "@action:button" msgid "Disable" -msgstr "" +msgstr "Deshabilitar" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:tooltip" msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." -msgstr "" +msgstr "No permitir a Cura enviar estadísticas de uso de forma anónima. Puede habilitarlo de nuevo en las preferencias." #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -740,14 +740,14 @@ msgstr "Perfiles de Cura 15.04" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 msgctxt "@item:inlistbox" msgid "Blender file" -msgstr "" +msgstr "Archivo Blender" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 msgctxt "@info:status" msgid "" "Could not export using \"{}\" quality!\n" "Felt back to \"{}\"." -msgstr "" +msgstr "No ha podido exportarse con la calidad \"{}\"\nRetroceder a \"{}»." #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 @@ -934,12 +934,12 @@ msgstr "Perfil de cura" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 msgctxt "@item:inmenu" msgid "Profile Assistant" -msgstr "" +msgstr "Asistente del perfil" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 msgctxt "@item:inlistbox" msgid "Profile Assistant" -msgstr "" +msgstr "Asistente del perfil" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" @@ -1137,13 +1137,13 @@ msgstr "Error al importar el perfil de {0}: {1}
    or !" msgid "This profile {0} contains incorrect data, could not import it." -msgstr "" +msgstr "Este perfil {0} contiene datos incorrectos, no se han podido importar." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." -msgstr "" +msgstr "El equipo definido en el perfil {0} no coincide con su equipo actual, no se ha podido importar." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format @@ -1155,7 +1155,7 @@ msgstr "Perfil {0} importado correctamente" #, python-brace-format msgctxt "@info:status" msgid "File {0} does not contain any valid profile." -msgstr "" +msgstr "El archivo {0} no contiene ningún perfil válido." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format @@ -1183,7 +1183,7 @@ msgstr "No se ha podido encontrar un tipo de calidad {0} para la configuración #, python-brace-format msgctxt "@label" msgid "Group #{group_nr}" -msgstr "" +msgstr "N.º de grupo {group_nr}" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" @@ -1242,7 +1242,7 @@ msgid "" "

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

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

    Se ha producido un error grave. Envíenos este informe de incidencias para que podamos solucionar el problema.

    \n

    Utilice el botón «Enviar informe» para publicar automáticamente un informe de errores en nuestros servidores.

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" @@ -1257,32 +1257,32 @@ msgstr "Desconocido" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 msgctxt "@label Cura version number" msgid "Cura version" -msgstr "" +msgstr "Versión de Cura" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 msgctxt "@label Type of platform" msgid "Platform" -msgstr "" +msgstr "Plataforma" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 msgctxt "@label" msgid "Qt version" -msgstr "" +msgstr "Versión Qt" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 msgctxt "@label" msgid "PyQt version" -msgstr "" +msgstr "Versión PyQt" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 msgctxt "@label OpenGL version" msgid "OpenGL" -msgstr "" +msgstr "OpenGL" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 msgctxt "@label" msgid "not yet initialised
    " -msgstr "" +msgstr "aún no se ha inicializado
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format @@ -1305,7 +1305,7 @@ msgstr "
  • Representador de OpenGL: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" msgid "Error traceback" -msgstr "" +msgstr "Rastreabilidad de errores" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" @@ -1516,7 +1516,7 @@ msgstr "Tamaño de la tobera" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 msgctxt "@label" msgid "Compatible material diameter" -msgstr "" +msgstr "Diámetro del material compatible" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 msgctxt "@tooltip" @@ -1618,10 +1618,7 @@ 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 "" -"Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n" -"\n" -"Seleccione la impresora de la siguiente lista:" +msgstr "Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n\nSeleccione la impresora de la siguiente lista:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1661,12 +1658,12 @@ msgstr "Tipo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "" +msgstr "Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "" +msgstr "Ultimaker 3 Extended" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1733,7 +1730,7 @@ msgstr "%1 no está configurada para alojar un grupo de impresoras conectadas de #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 msgctxt "@label link to connect manager" msgid "Add/Remove printers" -msgstr "" +msgstr "Agregar/eliminar impresoras" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" @@ -1773,7 +1770,7 @@ msgstr "Se ha perdido la conexión con la impresora." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 msgctxt "@label Printer status" msgid "Unknown" -msgstr "" +msgstr "Desconocido" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" @@ -1869,164 +1866,164 @@ msgstr "Activar configuración" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" msgid "SolidWorks: Export wizard" -msgstr "" +msgstr "SolidWorks: exportar asistente" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" msgid "Quality:" -msgstr "" +msgstr "Calidad:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (3D-printing)" -msgstr "" +msgstr "Fina (impresión en 3D)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (3D-printing)" -msgstr "" +msgstr "Gruesa (impresión en 3D)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (SolidWorks)" -msgstr "" +msgstr "Fina (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (SolidWorks)" -msgstr "" +msgstr "Gruesa (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" msgid "Show this dialog again" -msgstr "" +msgstr "Mostrar este cuadro de diálogo de nuevo" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 msgctxt "@action:button" msgid "Continue" -msgstr "" +msgstr "Continuar" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 msgctxt "@action:button" msgid "Abort" -msgstr "" +msgstr "Cancelar" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 msgctxt "@title:window" msgid "How to install Cura SolidWorks macro" -msgstr "" +msgstr "Cómo instalar la macro SolidWorks de Cura" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 msgctxt "@description:label" msgid "Steps:" -msgstr "" +msgstr "Pasos:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 msgctxt "@action:button" msgid "" "Open the directory\n" "with macro and icon" -msgstr "" +msgstr "Abra el directorio\ncon la macro y el icono" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 msgctxt "@description:label" msgid "Instructions:" -msgstr "" +msgstr "Instrucciones:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 msgctxt "@action:playpause" msgid "Play" -msgstr "" +msgstr "Reproducir" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 msgctxt "@action:playpause" msgid "Pause" -msgstr "" +msgstr "Pausar" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 msgctxt "@action:button" msgid "Previous Step" -msgstr "" +msgstr "Paso anterior" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 msgctxt "@action:button" msgid "Done" -msgstr "" +msgstr "Realizado" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 msgctxt "@action:button" msgid "Next Step" -msgstr "" +msgstr "Paso siguiente" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 msgctxt "@title:window" msgid "SolidWorks plugin: Configuration" -msgstr "" +msgstr "Complementos de SolidWorks: configuración" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 msgctxt "@title:tab" msgid "Conversion settings" -msgstr "" +msgstr "Ajustes de la conversión" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 msgctxt "@label" msgid "First choice:" -msgstr "" +msgstr "Primera opción:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 msgctxt "@text:menu" msgid "Latest installed version (Recommended)" -msgstr "" +msgstr "Última versión instalada (recomendada)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 msgctxt "@text:menu" msgid "Default version" -msgstr "" +msgstr "Versión predeterminada" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 msgctxt "@label" msgid "Show wizard before opening SolidWorks files" -msgstr "" +msgstr "Mostrar asistente antes de abrir los archivos de SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 msgctxt "@label" msgid "Automatically rotate opened file into normed orientation" -msgstr "" +msgstr "Girar automáticamente el archivo abierto a la orientación normal" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 msgctxt "@title:tab" msgid "Installation(s)" -msgstr "" +msgstr "Instalación(es)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 msgctxt "@label" msgid "COM service found" -msgstr "" +msgstr "Servicio COM encontrado" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 msgctxt "@label" msgid "Executable found" -msgstr "" +msgstr "Ejecutable encontrado" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 msgctxt "@label" msgid "COM starting" -msgstr "" +msgstr "Iniciando COM" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 msgctxt "@label" msgid "Revision number" -msgstr "" +msgstr "Número de revisión" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 msgctxt "@label" msgid "Functions available" -msgstr "" +msgstr "Funciones disponibles" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 @@ -2212,32 +2209,32 @@ msgstr "Suavizado" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 msgctxt "@label" msgid "Mesh Type" -msgstr "" +msgstr "Tipo de malla" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 msgctxt "@label" msgid "Normal model" -msgstr "" +msgstr "Modelo normal" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 msgctxt "@label" msgid "Print as support" -msgstr "" +msgstr "Imprimir según compatibilidad" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 msgctxt "@label" msgid "Don't support overlap with other models" -msgstr "" +msgstr "No es compatible la superposición con otros modelos" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 msgctxt "@label" msgid "Modify settings for overlap with other models" -msgstr "" +msgstr "Modificar ajustes para superponer con otros modelos" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 msgctxt "@label" msgid "Modify settings for infill of other models" -msgstr "" +msgstr "Modificar ajustes para rellenar con otros modelos" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" @@ -2423,10 +2420,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Este complemento incluye una licencia.\n" -"Debe aceptar dicha licencia para instalar el complemento.\n" -"¿Acepta las condiciones que aparecen a continuación?" +msgstr "Este complemento incluye una licencia.\nDebe aceptar dicha licencia para instalar el complemento.\n¿Acepta las condiciones que aparecen a continuación?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2691,9 +2685,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Ha personalizado parte de los ajustes del perfil.\n" -"¿Desea descartar los cambios o guardarlos?" +msgstr "Ha personalizado parte de los ajustes del perfil.\n¿Desea descartar los cambios o guardarlos?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3097,27 +3089,27 @@ msgstr "Enviar información (anónima) de impresión" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 msgctxt "@label" msgid "Experimental" -msgstr "" +msgstr "Experimental" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 msgctxt "@info:tooltip" msgid "Use multi build plate functionality" -msgstr "" +msgstr "Utilizar funcionalidad de placa de impresión múltiple" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 msgctxt "@option:check" msgid "Use multi build plate functionality (restart required)" -msgstr "" +msgstr "Utilizar funcionalidad de placa de impresión múltiple (reinicio requerido)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 msgctxt "@info:tooltip" msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" -msgstr "" +msgstr "¿Los modelos recién cargados se deben organizar en la placa de impresión? Se han usado junto con la placa de impresión múltiple (EXPERIMENTAL)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 msgctxt "@option:check" msgid "Do not arrange objects on load" -msgstr "" +msgstr "No organizar objetos al cargar" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 @@ -3361,9 +3353,7 @@ 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 "" -"Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\n" -"Cura se enorgullece de utilizar los siguientes proyectos de código abierto:" +msgstr "Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\nCura se enorgullece de utilizar los siguientes proyectos de código abierto:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3471,10 +3461,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n" -"\n" -"Haga clic para abrir el administrador de perfiles." +msgstr "Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n\nHaga clic para abrir el administrador de perfiles." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" @@ -3512,10 +3499,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n" -"\n" -"Haga clic para mostrar estos ajustes." +msgstr "Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n\nHaga clic para mostrar estos ajustes." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3530,7 +3514,7 @@ msgstr "Afectado por" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." -msgstr "" +msgstr "Este ajuste siempre se comparte entre extrusores. Si lo modifica, modificará el valor de todos los extrusores." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" @@ -3543,10 +3527,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Este ajuste tiene un valor distinto del perfil.\n" -"\n" -"Haga clic para restaurar el valor del perfil." +msgstr "Este ajuste tiene un valor distinto del perfil.\n\nHaga clic para restaurar el valor del perfil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" @@ -3554,10 +3535,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n" -"\n" -"Haga clic para restaurar el valor calculado." +msgstr "Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n\nHaga clic para restaurar el valor calculado." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" @@ -3569,9 +3547,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Ajustes de impresión deshabilitados\n" -"No se pueden modificar los archivos GCode" +msgstr "Ajustes de impresión deshabilitados\nNo se pueden modificar los archivos GCode" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" @@ -3581,7 +3557,7 @@ msgstr "00 h 00 min" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" msgid "Time specification" -msgstr "" +msgstr "Especificación de tiempos" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" @@ -3638,12 +3614,12 @@ msgstr "&Ver" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 msgctxt "@action:inmenu menubar:view" msgid "&Camera position" -msgstr "" +msgstr "&Posición de la cámara" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "" +msgstr "&Placa de impresión" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" @@ -3813,27 +3789,27 @@ msgstr "&Salir" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" msgid "&3D View" -msgstr "" +msgstr "&Vista en 3D" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:view" msgid "&Front View" -msgstr "" +msgstr "&Vista frontal" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 msgctxt "@action:inmenu menubar:view" msgid "&Top View" -msgstr "" +msgstr "&Vista superior" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 msgctxt "@action:inmenu menubar:view" msgid "&Left Side View" -msgstr "" +msgstr "&Vista del lado izquierdo" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:view" msgid "&Right Side View" -msgstr "" +msgstr "&Vista del lado derecho" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" @@ -3959,7 +3935,7 @@ msgstr "&Recargar todos los modelos" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "" +msgstr "Organizar todos los modelos en todas las placas de impresión" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" @@ -4019,7 +3995,7 @@ msgstr "Complementos instalados..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 msgctxt "@action:inmenu menubar:view" msgid "Expand/Collapse Sidebar" -msgstr "" +msgstr "Expandir/contraer barra lateral" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" @@ -4054,12 +4030,12 @@ msgstr "No se puede segmentar" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Slice current printjob" -msgstr "" +msgstr "Fragmentar trabajo de impresión actual" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Cancel slicing process" -msgstr "" +msgstr "Cancelar proceso de fragmentación" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" @@ -4115,7 +4091,7 @@ msgstr "Guardar &como..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" msgid "Save &Project..." -msgstr "" +msgstr "Guardar &proyecto..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" @@ -4354,7 +4330,7 @@ msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Comprobar compatibilidad" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" @@ -4364,17 +4340,17 @@ msgstr "Haga clic para comprobar la compatibilidad de los materiales en Utimaker #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 msgctxt "@option:check" msgid "See only current build plate" -msgstr "" +msgstr "Ver solo placa de impresión actual" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 msgctxt "@action:button" msgid "Arrange to all build plates" -msgstr "" +msgstr "Organizar todas las placas de impresión" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 msgctxt "@action:button" msgid "Arrange current build plate" -msgstr "" +msgstr "Organizar placa de impresión actual" #: MachineSettingsAction/plugin.json msgctxt "description" @@ -4469,22 +4445,22 @@ msgstr "Impresión USB" #: PrepareStage/plugin.json msgctxt "description" msgid "Provides a prepare stage in Cura." -msgstr "" +msgstr "Proporciona una fase de preparación en Cura." #: PrepareStage/plugin.json msgctxt "name" msgid "Prepare Stage" -msgstr "" +msgstr "Fase de preparación" #: CuraLiveScriptingPlugin/plugin.json msgctxt "description" msgid "Provides an edit window for direct script editing." -msgstr "" +msgstr "Proporciona una ventana de edición para la edición directa de secuencias de comandos." #: CuraLiveScriptingPlugin/plugin.json msgctxt "name" msgid "Live scripting tool" -msgstr "" +msgstr "Herramienta de secuencia de comandos en directo" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" @@ -4509,12 +4485,12 @@ msgstr "Conexión de red UM3" #: MonitorStage/plugin.json msgctxt "description" msgid "Provides a monitor stage in Cura." -msgstr "" +msgstr "Proporciona una fase de supervisión en Cura." #: MonitorStage/plugin.json msgctxt "name" msgid "Monitor Stage" -msgstr "" +msgstr "Fase de supervisión" #: FirmwareUpdateChecker/plugin.json msgctxt "description" @@ -4529,7 +4505,7 @@ msgstr "Buscador de actualizaciones de firmware" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." -msgstr "" +msgstr "Permite abrir determinados archivos con el propio SolidWorks. La conversión se lleva a cabo mediante este complemento y optimizaciones adicionales." #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4599,12 +4575,12 @@ msgstr "Lector de perfiles antiguos de Cura" #: CuraBlenderPlugin/plugin.json msgctxt "description" msgid "Helps to open Blender files directly in Cura." -msgstr "" +msgstr "Ayuda a abrir archivos de Blender directamente en Cura." #: CuraBlenderPlugin/plugin.json msgctxt "name" msgid "Blender Integration (experimental)" -msgstr "" +msgstr "Integración de Blender (experimental)" #: GCodeProfileReader/plugin.json msgctxt "description" @@ -4769,12 +4745,12 @@ msgstr "Escritor de perfiles de Cura" #: CuraPrintProfileCreator/plugin.json msgctxt "description" msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." -msgstr "" +msgstr "Permite a los fabricantes de material crear nuevos perfiles de material y calidad mediante una IU integrada." #: CuraPrintProfileCreator/plugin.json msgctxt "name" msgid "Print Profile Assistant" -msgstr "" +msgstr "Imprimir asistente del perfil" #: 3MFWriter/plugin.json msgctxt "description" diff --git a/resources/i18n/es_ES/fdmprinter.def.json.po b/resources/i18n/es_ES/fdmprinter.def.json.po index 82b913b3e8..e8e2a289e8 100644 --- a/resources/i18n/es_ES/fdmprinter.def.json.po +++ b/resources/i18n/es_ES/fdmprinter.def.json.po @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"Los comandos de Gcode que se ejecutarán justo al inicio - separados por \n" -"." +msgstr "Los comandos de Gcode que se ejecutarán justo al inicio - separados por \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"Los comandos de Gcode que se ejecutarán justo al final - separados por \n" -"." +msgstr "Los comandos de Gcode que se ejecutarán justo al final - separados por \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -352,12 +348,12 @@ msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_firmware_retract label" msgid "Firmware Retraction" -msgstr "" +msgstr "Retracción de firmware" #: fdmprinter.def.json msgctxt "machine_firmware_retract description" msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." -msgstr "" +msgstr "Utilizar o no los comandos de retracción de firmware (G10/G11) en lugar de utilizar la propiedad E en comandos G1 para retraer el material." #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" @@ -1052,12 +1048,12 @@ msgstr "En todas partes" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps label" msgid "Filter Out Tiny Gaps" -msgstr "" +msgstr "Filtrar pequeños huecos" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps description" msgid "Filter out tiny gaps to reduce blobs on outside of model." -msgstr "" +msgstr "Filtrar pequeños huecos para reducir las gotas en la parte externa del modelo." #: fdmprinter.def.json msgctxt "fill_outline_gaps label" @@ -1442,7 +1438,7 @@ msgstr "Desplazamiento del relleno sobre el eje X" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is moved this distance along the X axis." -msgstr "" +msgstr "El patrón de relleno se mueve esta distancia a lo largo del eje X." #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1452,7 +1448,7 @@ msgstr "Desplazamiento del relleno sobre el eje X" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is moved this distance along the Y axis." -msgstr "" +msgstr "El patrón de relleno se mueve esta distancia a lo largo del eje Y." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1472,7 +1468,7 @@ msgstr "Porcentaje de superposición del relleno" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "La cantidad de superposición entre el relleno y las paredes son un porcentaje del ancho de la línea de relleno. Una ligera superposición permite que las paredes estén firmemente unidas al relleno." #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1492,7 +1488,7 @@ msgstr "Porcentaje de superposición del forro" #: fdmprinter.def.json msgctxt "skin_overlap description" msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." -msgstr "" +msgstr "La cantidad de superposición entre el forro y las paredes son un porcentaje del ancho de la línea de forro. Una ligera superposición permite que las paredes estén firmemente unidas al forro. Este es el porcentaje de la media de los anchos de las líneas del forro y la pared más profunda." #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1722,7 +1718,7 @@ msgstr "Temperatura de la placa de impresión" #: fdmprinter.def.json msgctxt "material_bed_temperature description" msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." -msgstr "" +msgstr "La temperatura utilizada para la placa de impresión caliente. Si el valor es 0, la temperatura de la plataforma no se ajustará." #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3504,9 +3500,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 "" -"La distancia horizontal entre la falda y la primera capa de la impresión.\n" -"Se trata de la distancia mínima. Múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia." +msgstr "La distancia horizontal entre la falda y la primera capa de la impresión.\nSe trata de la distancia mínima. Múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4266,82 +4260,82 @@ msgstr "Experimental" #: fdmprinter.def.json msgctxt "support_tree_enable label" msgid "Tree Support" -msgstr "" +msgstr "Soporte en árbol" #: fdmprinter.def.json msgctxt "support_tree_enable description" msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." -msgstr "" +msgstr "Generar un soporte en forma de árbol con ramas que apoyan la impresión. Esto puede reducir el uso de material y el tiempo de impresión, pero aumenta considerablemente el tiempo de fragmentación." #: fdmprinter.def.json msgctxt "support_tree_angle label" msgid "Tree Support Branch Angle" -msgstr "" +msgstr "Ángulo de las ramas del soporte en árbol" #: fdmprinter.def.json msgctxt "support_tree_angle description" msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." -msgstr "" +msgstr "El ángulo de las ramas. Utilice un ángulo inferior para que sean más verticales y estables. Utilice un ángulo superior para poder tener más alcance." #: fdmprinter.def.json msgctxt "support_tree_branch_distance label" msgid "Tree Support Branch Distance" -msgstr "" +msgstr "Distancia de las ramas del soporte en árbol" #: fdmprinter.def.json msgctxt "support_tree_branch_distance description" msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." -msgstr "" +msgstr "Qué separación deben tener las ramas cuando tocan el modelo. Reducir esta distancia ocasionará que el soporte en árbol toque el modelo en más puntos, produciendo mejor cobertura pero dificultando la tarea de retirar el soporte." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter label" msgid "Tree Support Branch Diameter" -msgstr "" +msgstr "Diámetro de las ramas del soporte en árbol" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter description" msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." -msgstr "" +msgstr "El diámetro de las ramas más finas del soporte en árbol. Cuanto más gruesas sean las ramas, más robustas serán. Las ramas que estén cerca de la base serán más gruesas que esto." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle label" msgid "Tree Support Branch Diameter Angle" -msgstr "" +msgstr "Ángulo de diámetro de las ramas del soporte en árbol" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle description" msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." -msgstr "" +msgstr "El ángulo del diámetro de las ramas es gradualmente más alto según se acercan a la base. Un ángulo de 0 ocasionará que las ramas tengan un grosor uniforme en toda su longitud. Un poco de ángulo puede aumentar la estabilidad del soporte en árbol." #: fdmprinter.def.json msgctxt "support_tree_collision_resolution label" msgid "Tree Support Collision Resolution" -msgstr "" +msgstr "Resolución de colisión del soporte en árbol" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution description" msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." -msgstr "" +msgstr "Resolución para computar colisiones para evitar golpear el modelo. Establecer un ajuste bajo producirá árboles más precisos que producen fallos con menor frecuencia, pero aumenta significativamente el tiempo de fragmentación." #: fdmprinter.def.json msgctxt "support_tree_wall_thickness label" msgid "Tree Support Wall Thickness" -msgstr "" +msgstr "Grosor de las paredes del soporte en árbol" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness description" msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "El grosor de las paredes de las ramas del soporte en árbol. Imprimir paredes más gruesas llevará más tiempo pero no se caerán tan fácilmente." #: fdmprinter.def.json msgctxt "support_tree_wall_count label" msgid "Tree Support Wall Line Count" -msgstr "" +msgstr "Recuento de líneas de pared del soporte en árbol" #: fdmprinter.def.json msgctxt "support_tree_wall_count description" msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "El número de las paredes de las ramas del soporte en árbol. Imprimir paredes más gruesas llevará más tiempo pero no se caerán tan fácilmente." #: fdmprinter.def.json msgctxt "slicing_tolerance label" @@ -4416,12 +4410,12 @@ msgstr "Una lista de los valores enteros de las direcciones de línea si las cap #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization label" msgid "Infill Travel Optimization" -msgstr "" +msgstr "Optimización del desplazamiento del relleno" #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization description" msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." -msgstr "" +msgstr "Cuando está habilitado, se optimiza el orden en el que se imprimen las líneas de relleno para reducir la distancia de desplazamiento. La reducción del tiempo de desplazamiento obtenido depende en gran parte del modelo que se está fragmentando, el patrón de relleno, la densidad, etc. Tenga en cuenta que, para algunos modelos que tienen pequeñas áreas de relleno, el tiempo para fragmentar el modelo se puede aumentar en gran medida." #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" @@ -4943,9 +4937,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 "" -"Distancia de un movimiento ascendente que se extrude a media velocidad.\n" -"Esto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre." +msgstr "Distancia de un movimiento ascendente que se extrude a media velocidad.\nEsto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5055,42 +5047,42 @@ msgstr "Distancia entre la tobera y líneas descendentes en horizontal. Cuanto m #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled label" msgid "Use adaptive layers" -msgstr "" +msgstr "Utilizar capas de adaptación" #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled description" msgid "Adaptive layers computes the layer heights depending on the shape of the model." -msgstr "" +msgstr "Las capas de adaptación calculan las alturas de las capas dependiendo de la forma del modelo." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation label" msgid "Adaptive layers maximum variation" -msgstr "" +msgstr "Variación máxima de las capas de adaptación" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height in mm." -msgstr "" +msgstr "La diferencia de altura máxima permitida en comparación con la altura de la capa base en mm." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" msgid "Adaptive layers variation step size" -msgstr "" +msgstr "Tamaño de pasos de variación de las capas de adaptación" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step description" msgid "The difference in height of the next layer height compared to the previous one." -msgstr "" +msgstr "La diferencia de altura de la siguiente altura de capa en comparación con la anterior." #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold label" msgid "Adaptive layers threshold" -msgstr "" +msgstr "Umbral de las capas de adaptación" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold description" msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." -msgstr "" +msgstr "Umbral para usar o no una capa más pequeña. Este número se compara con el curtido de la pendiente más empinada de una capa." #: fdmprinter.def.json msgctxt "command_line_settings label" diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index 0504b1e50c..a748297c46 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -187,7 +187,7 @@ msgstr "Firmware de l'imprimante" #: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Prepare" -msgstr "" +msgstr "Préparer" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -560,7 +560,7 @@ msgstr "Ouvre l'interface d'impression des tâches dans votre navigateur." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 msgctxt "@label Printer name" msgid "Unknown" -msgstr "" +msgstr "Inconnu" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format @@ -595,7 +595,7 @@ msgstr "Connecter via le réseau" #: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Monitor" -msgstr "" +msgstr "Surveiller" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format @@ -622,7 +622,7 @@ msgstr "Impossible d'accéder aux informations de mise à jour." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." -msgstr "" +msgstr "SolidWorks a signalé des erreurs lors de l'ouverture de votre fichier. Nous vous recommandons de résoudre ces problèmes dans SolidWorks lui-même." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 msgctxt "@info:status" @@ -630,7 +630,7 @@ msgid "" "Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" "\n" " Thanks!." -msgstr "" +msgstr "Aucun modèle n'a été trouvé à l'intérieur de votre dessin. Pouvez-vous vérifier son contenu de nouveau et vous assurer qu'une pièce ou un assemblage est présent ?\n\n Merci !" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 msgctxt "@info:status" @@ -638,7 +638,7 @@ msgid "" "Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" "\n" "Sorry!" -msgstr "" +msgstr "Plus d'une pièce ou d'un assemblage ont été trouvés dans votre dessin. Nous ne prenons actuellement en charge que les dessins comptant exactement une pièce ou un assemblage.\n\nDésolé !" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" @@ -653,7 +653,7 @@ msgstr "Fichier d'assemblage SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 msgctxt "@item:inlistbox" msgid "SolidWorks drawing file" -msgstr "" +msgstr "Fichier de dessin SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 msgctxt "@info:status" @@ -663,7 +663,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Cher client,\nNous n'avons pas pu trouver une installation valide de SolidWorks sur votre système. Cela signifie soit que SolidWorks n'est pas installé, soit que vous ne possédez pas de licence valide. Veuillez vous assurer que l'exécution de SolidWorks lui-même fonctionne sans problèmes et / ou contactez votre service IT.\n\nCordialement,\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 msgctxt "@info:status" @@ -673,7 +673,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Cher client,\nVous exécutez actuellement ce plug-in sur un système d'exploitation autre que Windows. Ce plug-in fonctionne uniquement sous Windows et lorsque SolidWorks est installé avec une licence valide. Veuillez installer ce plug-in sur un poste Windows où SolidWorks est installé.\n\nCordialement,\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" @@ -681,7 +681,7 @@ msgstr "Configurer" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 msgid "Installation guide for SolidWorks macro" -msgstr "" +msgstr "Guide d'installation SolidWorks macro" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" @@ -705,7 +705,7 @@ msgstr "Modifier le G-Code" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" msgid "Cura collects anonymized usage statistics." -msgstr "" +msgstr "Cura recueille des statistiques d'utilisation anonymes." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -715,22 +715,22 @@ msgstr "Collecte des données..." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Allow" -msgstr "" +msgstr "Autoriser" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." -msgstr "" +msgstr "Autoriser Cura à envoyer des statistiques d'utilisation anonymes pour mieux prioriser les améliorations futures apportées à Cura. Certaines de vos préférences et paramètres sont envoyés, ainsi que la version du logiciel Cura et un hachage des modèles que vous découpez." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 msgctxt "@action:button" msgid "Disable" -msgstr "" +msgstr "Désactiver" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:tooltip" msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." -msgstr "" +msgstr "Ne pas autoriser Cura à envoyer des statistiques d'utilisation anonymes. Vous pouvez modifier ce paramètre dans les préférences." #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -740,14 +740,14 @@ msgstr "Profils Cura 15.04" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 msgctxt "@item:inlistbox" msgid "Blender file" -msgstr "" +msgstr "Fichier Blender" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 msgctxt "@info:status" msgid "" "Could not export using \"{}\" quality!\n" "Felt back to \"{}\"." -msgstr "" +msgstr "Impossible d'exporter avec la qualité \"{}\" !\nQualité redéfinie sur \"{}\"." #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 @@ -934,12 +934,12 @@ msgstr "Profil Cura" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 msgctxt "@item:inmenu" msgid "Profile Assistant" -msgstr "" +msgstr "Assistant de profil" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 msgctxt "@item:inlistbox" msgid "Profile Assistant" -msgstr "" +msgstr "Assistant de profil" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" @@ -1137,13 +1137,13 @@ msgstr "Échec de l'importation du profil depuis le fichier {0} or !" msgid "This profile {0} contains incorrect data, could not import it." -msgstr "" +msgstr "Le profil {0} contient des données incorrectes ; échec de l'importation." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." -msgstr "" +msgstr "La machine définie dans le profil {0} ne correspond pas à votre machine actuelle ; échec de l'importation." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format @@ -1155,7 +1155,7 @@ msgstr "Importation du profil {0} réussie" #, python-brace-format msgctxt "@info:status" msgid "File {0} does not contain any valid profile." -msgstr "" +msgstr "Le fichier {0} ne contient pas de profil valide." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format @@ -1183,7 +1183,7 @@ msgstr "Impossible de trouver un type de qualité {0} pour la configuration actu #, python-brace-format msgctxt "@label" msgid "Group #{group_nr}" -msgstr "" +msgstr "Groupe nº {group_nr}" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" @@ -1242,7 +1242,7 @@ msgid "" "

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

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

    Une erreur fatale s'est produite. Veuillez nous envoyer ce Rapport d'incident pour résoudre le problème

    \n

    Veuillez utiliser le bouton « Envoyer rapport » pour publier automatiquement un rapport d'erreur sur nos serveurs

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" @@ -1257,32 +1257,32 @@ msgstr "Inconnu" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 msgctxt "@label Cura version number" msgid "Cura version" -msgstr "" +msgstr "Version Cura" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 msgctxt "@label Type of platform" msgid "Platform" -msgstr "" +msgstr "Plate-forme" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 msgctxt "@label" msgid "Qt version" -msgstr "" +msgstr "Version Qt" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 msgctxt "@label" msgid "PyQt version" -msgstr "" +msgstr "Version PyQt" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 msgctxt "@label OpenGL version" msgid "OpenGL" -msgstr "" +msgstr "OpenGL" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 msgctxt "@label" msgid "not yet initialised
    " -msgstr "" +msgstr "pas encore initialisé
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format @@ -1305,7 +1305,7 @@ msgstr "
  • Moteur de rendu OpenGL : {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" msgid "Error traceback" -msgstr "" +msgstr "Retraçage de l'erreur" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" @@ -1516,7 +1516,7 @@ msgstr "Taille de la buse" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 msgctxt "@label" msgid "Compatible material diameter" -msgstr "" +msgstr "Diamètre du matériau compatible" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 msgctxt "@tooltip" @@ -1618,10 +1618,7 @@ 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 "" -"Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n" -"\n" -"Sélectionnez votre imprimante dans la liste ci-dessous :" +msgstr "Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n\nSélectionnez votre imprimante dans la liste ci-dessous :" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1661,12 +1658,12 @@ msgstr "Type" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "" +msgstr "Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "" +msgstr "Ultimaker 3 Extended" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1733,7 +1730,7 @@ msgstr "%1 n'est pas configurée pour héberger un groupe d'imprimantes connect #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 msgctxt "@label link to connect manager" msgid "Add/Remove printers" -msgstr "" +msgstr "Ajouter / supprimer une imprimante" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" @@ -1773,7 +1770,7 @@ msgstr "Connexion avec l'imprimante perdue" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 msgctxt "@label Printer status" msgid "Unknown" -msgstr "" +msgstr "Inconnu" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" @@ -1869,164 +1866,164 @@ msgstr "Activer la configuration" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" msgid "SolidWorks: Export wizard" -msgstr "" +msgstr "SolidWorks : assistant d'exportation" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" msgid "Quality:" -msgstr "" +msgstr "Qualité :" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (3D-printing)" -msgstr "" +msgstr "Fine (impression 3D)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (3D-printing)" -msgstr "" +msgstr "Grossière (impression 3D)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (SolidWorks)" -msgstr "" +msgstr "Fine (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (SolidWorks)" -msgstr "" +msgstr "Grossière (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" msgid "Show this dialog again" -msgstr "" +msgstr "Afficher de nouveau cette boîte de dialogue" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 msgctxt "@action:button" msgid "Continue" -msgstr "" +msgstr "Continuer" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 msgctxt "@action:button" msgid "Abort" -msgstr "" +msgstr "Abandonner" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 msgctxt "@title:window" msgid "How to install Cura SolidWorks macro" -msgstr "" +msgstr "Modalités d’installation de Cura SolidWorks macro" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 msgctxt "@description:label" msgid "Steps:" -msgstr "" +msgstr "Procédure :" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 msgctxt "@action:button" msgid "" "Open the directory\n" "with macro and icon" -msgstr "" +msgstr "Ouvrez le répertoire\ncontenant la macro et l'icône" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 msgctxt "@description:label" msgid "Instructions:" -msgstr "" +msgstr "Instructions :" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 msgctxt "@action:playpause" msgid "Play" -msgstr "" +msgstr "Jouer" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 msgctxt "@action:playpause" msgid "Pause" -msgstr "" +msgstr "Pause" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 msgctxt "@action:button" msgid "Previous Step" -msgstr "" +msgstr "Étape précédente" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 msgctxt "@action:button" msgid "Done" -msgstr "" +msgstr "Terminé" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 msgctxt "@action:button" msgid "Next Step" -msgstr "" +msgstr "Étape suivante" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 msgctxt "@title:window" msgid "SolidWorks plugin: Configuration" -msgstr "" +msgstr "Plug-in SolidWorks : configuration" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 msgctxt "@title:tab" msgid "Conversion settings" -msgstr "" +msgstr "Paramètres de conversion" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 msgctxt "@label" msgid "First choice:" -msgstr "" +msgstr "Premier choix :" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 msgctxt "@text:menu" msgid "Latest installed version (Recommended)" -msgstr "" +msgstr "Dernière version installée (recommandé)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 msgctxt "@text:menu" msgid "Default version" -msgstr "" +msgstr "Version par défaut" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 msgctxt "@label" msgid "Show wizard before opening SolidWorks files" -msgstr "" +msgstr "Afficher l'Assistant avant d'ouvrir les fichiers SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 msgctxt "@label" msgid "Automatically rotate opened file into normed orientation" -msgstr "" +msgstr "Rotation automatique du fichier ouvert en orientation normalisée" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 msgctxt "@title:tab" msgid "Installation(s)" -msgstr "" +msgstr "Installation(s)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 msgctxt "@label" msgid "COM service found" -msgstr "" +msgstr "Service COM trouvé" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 msgctxt "@label" msgid "Executable found" -msgstr "" +msgstr "Fichier exécutable trouvé" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 msgctxt "@label" msgid "COM starting" -msgstr "" +msgstr "Lancement de COM" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 msgctxt "@label" msgid "Revision number" -msgstr "" +msgstr "Numéro de révision" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 msgctxt "@label" msgid "Functions available" -msgstr "" +msgstr "Fonctions disponibles" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 @@ -2212,32 +2209,32 @@ msgstr "Lissage" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 msgctxt "@label" msgid "Mesh Type" -msgstr "" +msgstr "Type de maille" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 msgctxt "@label" msgid "Normal model" -msgstr "" +msgstr "Modèle normal" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 msgctxt "@label" msgid "Print as support" -msgstr "" +msgstr "Imprimer comme support" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 msgctxt "@label" msgid "Don't support overlap with other models" -msgstr "" +msgstr "Ne pas prendre en charge le chevauchement avec d'autres modèles" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 msgctxt "@label" msgid "Modify settings for overlap with other models" -msgstr "" +msgstr "Modifier les paramètres de chevauchement avec d'autres modèles" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 msgctxt "@label" msgid "Modify settings for infill of other models" -msgstr "" +msgstr "Modifier les paramètres de remplissage d'autres modèles" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" @@ -2423,10 +2420,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Ce plug-in contient une licence.\n" -"Vous devez approuver cette licence pour installer ce plug-in.\n" -"Acceptez-vous les clauses ci-dessous ?" +msgstr "Ce plug-in contient une licence.\nVous devez approuver cette licence pour installer ce plug-in.\nAcceptez-vous les clauses ci-dessous ?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2691,9 +2685,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Vous avez personnalisé certains paramètres du profil.\n" -"Souhaitez-vous conserver ces changements, ou les annuler ?" +msgstr "Vous avez personnalisé certains paramètres du profil.\nSouhaitez-vous conserver ces changements, ou les annuler ?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3097,27 +3089,27 @@ msgstr "Envoyer des informations (anonymes) sur l'impression" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 msgctxt "@label" msgid "Experimental" -msgstr "" +msgstr "Expérimental" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 msgctxt "@info:tooltip" msgid "Use multi build plate functionality" -msgstr "" +msgstr "Utiliser la fonctionnalité multi-plateau" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 msgctxt "@option:check" msgid "Use multi build plate functionality (restart required)" -msgstr "" +msgstr "Utiliser la fonctionnalité multi-plateau (redémarrage requis)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 msgctxt "@info:tooltip" msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" -msgstr "" +msgstr "Les modèles nouvellement chargés doivent-ils être disposés sur le plateau ? Utilisé en conjonction avec le multi-plateau (EXPÉRIMENTAL)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 msgctxt "@option:check" msgid "Do not arrange objects on load" -msgstr "" +msgstr "Ne pas réorganiser les objets lors du chargement" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 @@ -3361,9 +3353,7 @@ 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 a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\n" -"Cura est fier d'utiliser les projets open source suivants :" +msgstr "Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\nCura est fier d'utiliser les projets open source suivants :" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3471,10 +3461,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n" -"\n" -"Cliquez pour ouvrir le gestionnaire de profils." +msgstr "Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n\nCliquez pour ouvrir le gestionnaire de profils." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" @@ -3512,10 +3499,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n" -"\n" -"Cliquez pour rendre ces paramètres visibles." +msgstr "Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n\nCliquez pour rendre ces paramètres visibles." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3530,7 +3514,7 @@ msgstr "Touché par" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." -msgstr "" +msgstr "Ce paramètre est toujours partagé par toutes les extrudeuses. Le modifier ici entraînera la modification de la valeur pour toutes les extrudeuses." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" @@ -3543,10 +3527,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Ce paramètre possède une valeur qui est différente du profil.\n" -"\n" -"Cliquez pour restaurer la valeur du profil." +msgstr "Ce paramètre possède une valeur qui est différente du profil.\n\nCliquez pour restaurer la valeur du profil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" @@ -3554,10 +3535,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n" -"\n" -"Cliquez pour restaurer la valeur calculée." +msgstr "Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n\nCliquez pour restaurer la valeur calculée." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" @@ -3569,9 +3547,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Configuration de l'impression désactivée\n" -"Les fichiers G-Code ne peuvent pas être modifiés" +msgstr "Configuration de l'impression désactivée\nLes fichiers G-Code ne peuvent pas être modifiés" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" @@ -3581,7 +3557,7 @@ msgstr "00h 00min" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" msgid "Time specification" -msgstr "" +msgstr "Spécification de temps" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" @@ -3638,12 +3614,12 @@ msgstr "&Visualisation" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 msgctxt "@action:inmenu menubar:view" msgid "&Camera position" -msgstr "" +msgstr "Position de la &caméra" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "" +msgstr "&Plateau" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" @@ -3813,27 +3789,27 @@ msgstr "&Quitter" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" msgid "&3D View" -msgstr "" +msgstr "Vue &3D" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:view" msgid "&Front View" -msgstr "" +msgstr "Vue de &face" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 msgctxt "@action:inmenu menubar:view" msgid "&Top View" -msgstr "" +msgstr "Vue du dess&us" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 msgctxt "@action:inmenu menubar:view" msgid "&Left Side View" -msgstr "" +msgstr "Vue latérale &gauche" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:view" msgid "&Right Side View" -msgstr "" +msgstr "Vue latérale &droite" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" @@ -3959,7 +3935,7 @@ msgstr "Rechar&ger tous les modèles" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "" +msgstr "Réorganiser tous les modèles sur tous les plateaux" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" @@ -4019,7 +3995,7 @@ msgstr "Plug-ins installés..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 msgctxt "@action:inmenu menubar:view" msgid "Expand/Collapse Sidebar" -msgstr "" +msgstr "Déplier / replier la barre latérale" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" @@ -4054,12 +4030,12 @@ msgstr "Découpe indisponible" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Slice current printjob" -msgstr "" +msgstr "Découper la tâche d'impression en cours" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Cancel slicing process" -msgstr "" +msgstr "Annuler le processus de découpe" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" @@ -4115,7 +4091,7 @@ msgstr "Enregistrer &sous..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" msgid "Save &Project..." -msgstr "" +msgstr "Enregistrer le &projet..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" @@ -4354,7 +4330,7 @@ msgstr "Matériau" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Vérifier la compatibilité" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" @@ -4364,17 +4340,17 @@ msgstr "Cliquez ici pour vérifier la compatibilité des matériaux sur Ultimake #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 msgctxt "@option:check" msgid "See only current build plate" -msgstr "" +msgstr "Afficher uniquement le plateau actuel" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 msgctxt "@action:button" msgid "Arrange to all build plates" -msgstr "" +msgstr "Réorganiser sur tous les plateaux" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 msgctxt "@action:button" msgid "Arrange current build plate" -msgstr "" +msgstr "Réorganiser le plateau actuel" #: MachineSettingsAction/plugin.json msgctxt "description" @@ -4469,22 +4445,22 @@ msgstr "Impression par USB" #: PrepareStage/plugin.json msgctxt "description" msgid "Provides a prepare stage in Cura." -msgstr "" +msgstr "Fournit une étape de préparation dans Cura." #: PrepareStage/plugin.json msgctxt "name" msgid "Prepare Stage" -msgstr "" +msgstr "Étape de préparation" #: CuraLiveScriptingPlugin/plugin.json msgctxt "description" msgid "Provides an edit window for direct script editing." -msgstr "" +msgstr "Fournit une fenêtre d'édition pour l'édition directe de script." #: CuraLiveScriptingPlugin/plugin.json msgctxt "name" msgid "Live scripting tool" -msgstr "" +msgstr "Outil de scripting en direct" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" @@ -4509,12 +4485,12 @@ msgstr "Connexion au réseau UM3" #: MonitorStage/plugin.json msgctxt "description" msgid "Provides a monitor stage in Cura." -msgstr "" +msgstr "Fournit une étape de surveillance dans Cura." #: MonitorStage/plugin.json msgctxt "name" msgid "Monitor Stage" -msgstr "" +msgstr "Étape de surveillance" #: FirmwareUpdateChecker/plugin.json msgctxt "description" @@ -4529,7 +4505,7 @@ msgstr "Vérificateur des mises à jour du firmware" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." -msgstr "" +msgstr "Donne la possibilité d'ouvrir certains fichiers via SolidWorks. La conversion est ensuite effectuée par ce plug-in et des optimisations supplémentaires." #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4599,12 +4575,12 @@ msgstr "Lecteur de profil Cura antérieur" #: CuraBlenderPlugin/plugin.json msgctxt "description" msgid "Helps to open Blender files directly in Cura." -msgstr "" +msgstr "Aide à ouvrir les fichiers Blender directement dans Cura." #: CuraBlenderPlugin/plugin.json msgctxt "name" msgid "Blender Integration (experimental)" -msgstr "" +msgstr "Intégration Blender (expérimental)" #: GCodeProfileReader/plugin.json msgctxt "description" @@ -4769,12 +4745,12 @@ msgstr "Générateur de profil Cura" #: CuraPrintProfileCreator/plugin.json msgctxt "description" msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." -msgstr "" +msgstr "Permet aux fabricants de matériaux de créer de nouveaux matériaux et profils de qualité à l'aide d'une interface utilisateur ad hoc." #: CuraPrintProfileCreator/plugin.json msgctxt "name" msgid "Print Profile Assistant" -msgstr "" +msgstr "Assistant de profil d'impression" #: 3MFWriter/plugin.json msgctxt "description" diff --git a/resources/i18n/fr_FR/fdmprinter.def.json.po b/resources/i18n/fr_FR/fdmprinter.def.json.po index e5aa684c90..ac292df766 100644 --- a/resources/i18n/fr_FR/fdmprinter.def.json.po +++ b/resources/i18n/fr_FR/fdmprinter.def.json.po @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"Commandes Gcode à exécuter au tout début, séparées par \n" -"." +msgstr "Commandes Gcode à exécuter au tout début, séparées par \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"Commandes Gcode à exécuter à la toute fin, séparées par \n" -"." +msgstr "Commandes Gcode à exécuter à la toute fin, séparées par \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -352,12 +348,12 @@ msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_firmware_retract label" msgid "Firmware Retraction" -msgstr "" +msgstr "Rétraction du firmware" #: fdmprinter.def.json msgctxt "machine_firmware_retract description" msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." -msgstr "" +msgstr "S'il faut utiliser les commandes de rétraction du firmware (G10 / G11) au lieu d'utiliser la propriété E dans les commandes G1 pour rétracter le matériau." #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" @@ -1052,12 +1048,12 @@ msgstr "Partout" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps label" msgid "Filter Out Tiny Gaps" -msgstr "" +msgstr "Filtrer les très petits trous" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps description" msgid "Filter out tiny gaps to reduce blobs on outside of model." -msgstr "" +msgstr "Filtrer les très petits trous pour réduire la présence de gouttes à l'extérieur du modèle." #: fdmprinter.def.json msgctxt "fill_outline_gaps label" @@ -1442,7 +1438,7 @@ msgstr "Remplissage Décalage X" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is moved this distance along the X axis." -msgstr "" +msgstr "Le motif de remplissage est décalé de cette distance sur l'axe X." #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1452,7 +1448,7 @@ msgstr "Remplissage Décalage Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is moved this distance along the Y axis." -msgstr "" +msgstr "Le motif de remplissage est décalé de cette distance sur l'axe Y." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1472,7 +1468,7 @@ msgstr "Pourcentage de chevauchement du remplissage" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "Le degré de chevauchement entre le remplissage et les parois exprimé en pourcentage de la largeur de ligne de remplissage. Un chevauchement faible permet aux parois de se connecter fermement au remplissage." #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1492,7 +1488,7 @@ msgstr "Pourcentage de chevauchement de la couche extérieure" #: fdmprinter.def.json msgctxt "skin_overlap description" msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." -msgstr "" +msgstr "Le montant de chevauchement entre la couche extérieure et les parois en pourcentage de la largeur de ligne de couche extérieure. Un chevauchement faible permet aux parois de se connecter fermement à la couche extérieure. Ce montant est un pourcentage des largeurs moyennes des lignes de la couche extérieure et de la paroi la plus intérieure." #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1722,7 +1718,7 @@ msgstr "Température du plateau" #: fdmprinter.def.json msgctxt "material_bed_temperature description" msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." -msgstr "" +msgstr "Température utilisée pour le plateau chauffant. Si elle est définie sur 0, la température du plateau ne sera pas ajustée." #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3504,9 +3500,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 "" -"La distance horizontale entre la jupe et la première couche de l’impression.\n" -"Il s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur." +msgstr "La distance horizontale entre la jupe et la première couche de l’impression.\nIl s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4266,82 +4260,82 @@ msgstr "expérimental !" #: fdmprinter.def.json msgctxt "support_tree_enable label" msgid "Tree Support" -msgstr "" +msgstr "Support arborescent" #: fdmprinter.def.json msgctxt "support_tree_enable description" msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." -msgstr "" +msgstr "Générer un support arborescent avec des branches qui soutiennent votre impression. Cela peut réduire l'utilisation de matériau et le temps d'impression, mais augmente considérablement le temps de découpage." #: fdmprinter.def.json msgctxt "support_tree_angle label" msgid "Tree Support Branch Angle" -msgstr "" +msgstr "Angle des branches de support arborescent" #: fdmprinter.def.json msgctxt "support_tree_angle description" msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." -msgstr "" +msgstr "Angle des branches. Utilisez un angle plus faible pour les rendre plus verticales et plus stables ; utilisez un angle plus élevé pour avoir plus de portée." #: fdmprinter.def.json msgctxt "support_tree_branch_distance label" msgid "Tree Support Branch Distance" -msgstr "" +msgstr "Distance des branches de support arborescent" #: fdmprinter.def.json msgctxt "support_tree_branch_distance description" msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." -msgstr "" +msgstr "Distance à laquelle doivent se trouver les branches lorsqu'elles touchent le modèle. Si vous réduisez cette distance, le support arborescent touchera le modèle à plus d'endroits, ce qui causera un meilleur porte-à-faux mais rendra le support plus difficile à enlever." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter label" msgid "Tree Support Branch Diameter" -msgstr "" +msgstr "Diamètre des branches de support arborescent" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter description" msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." -msgstr "" +msgstr "Diamètre des branches les plus minces du support arborescent. Plus les branches sont épaisses, plus elles sont robustes ; les branches proches de la base seront plus épaisses que cette valeur." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle label" msgid "Tree Support Branch Diameter Angle" -msgstr "" +msgstr "Angle de diamètre des branches de support arborescent" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle description" msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." -msgstr "" +msgstr "Angle du diamètre des branches au fur et à mesure qu'elles s'épaississent lorsqu'elles sont proches du fond. Avec un angle de 0°, les branches auront une épaisseur uniforme sur toute leur longueur. Donner un peu d'angle permet d'augmenter la stabilité du support arborescent." #: fdmprinter.def.json msgctxt "support_tree_collision_resolution label" msgid "Tree Support Collision Resolution" -msgstr "" +msgstr "Résolution de collision du support arborescent" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution description" msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." -msgstr "" +msgstr "Résolution servant à calculer les collisions afin d'éviter de heurter le modèle. Plus ce paramètre est faible, plus les arborescences seront précises et stables, mais cela augmente considérablement le temps de découpage." #: fdmprinter.def.json msgctxt "support_tree_wall_thickness label" msgid "Tree Support Wall Thickness" -msgstr "" +msgstr "Épaisseur de la paroi du support arborescent" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness description" msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "Épaisseur des parois des branches du support arborescent. Les parois plus épaisses prennent plus de temps à imprimer, mais ne tombent pas aussi facilement." #: fdmprinter.def.json msgctxt "support_tree_wall_count label" msgid "Tree Support Wall Line Count" -msgstr "" +msgstr "Nombre de lignes de la paroi du support arborescent" #: fdmprinter.def.json msgctxt "support_tree_wall_count description" msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "Nombre de parois des branches du support arborescent. Les parois plus épaisses prennent plus de temps à imprimer, mais ne tombent pas aussi facilement." #: fdmprinter.def.json msgctxt "slicing_tolerance label" @@ -4416,12 +4410,12 @@ msgstr "Une liste de sens de ligne (exprimés en nombres entiers) à utiliser lo #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization label" msgid "Infill Travel Optimization" -msgstr "" +msgstr "Optimisation du déplacement de remplissage" #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization description" msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." -msgstr "" +msgstr "Lorsque cette option est activée, l'ordre dans lequel les lignes de remplissage sont imprimées est optimisé pour réduire la distance parcourue. La réduction du temps de parcours dépend en grande partie du modèle à découper, du type de remplissage, de la densité, etc. Remarque : pour certains modèles possédant beaucoup de petites zones de remplissage, le temps de découpe du modèle peut en être considérablement augmenté." #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" @@ -4943,9 +4937,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 "" -"Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\n" -"Cela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire." +msgstr "Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\nCela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5055,42 +5047,42 @@ msgstr "Distance entre la buse et les lignes descendantes horizontalement. Un es #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled label" msgid "Use adaptive layers" -msgstr "" +msgstr "Utiliser des couches adaptatives" #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled description" msgid "Adaptive layers computes the layer heights depending on the shape of the model." -msgstr "" +msgstr "Cette option calcule la hauteur des couches en fonction de la forme du modèle." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation label" msgid "Adaptive layers maximum variation" -msgstr "" +msgstr "Variation maximale des couches adaptatives" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height in mm." -msgstr "" +msgstr "Hauteur maximale autorisée par rapport à la couche de base, en mm." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" msgid "Adaptive layers variation step size" -msgstr "" +msgstr "Taille des étapes de variation des couches adaptatives" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step description" msgid "The difference in height of the next layer height compared to the previous one." -msgstr "" +msgstr "Différence de hauteur de la couche suivante par rapport à la précédente." #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold label" msgid "Adaptive layers threshold" -msgstr "" +msgstr "Limite des couches adaptatives" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold description" msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." -msgstr "" +msgstr "Limite indiquant d'utiliser ou non une couche plus petite. Ce nombre est comparé à la tangente de la pente la plus raide d'une couche." #: fdmprinter.def.json msgctxt "command_line_settings label" diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po index f4820d1aa7..2b9f4ba177 100644 --- a/resources/i18n/it_IT/cura.po +++ b/resources/i18n/it_IT/cura.po @@ -187,7 +187,7 @@ msgstr "Firmware stampante" #: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Prepare" -msgstr "" +msgstr "Prepara" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -560,7 +560,7 @@ msgstr "Apre l'interfaccia processi di stampa sul browser." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 msgctxt "@label Printer name" msgid "Unknown" -msgstr "" +msgstr "Sconosciuto" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format @@ -595,7 +595,7 @@ msgstr "Collega tramite rete" #: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Monitor" -msgstr "" +msgstr "Controlla" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format @@ -622,7 +622,7 @@ msgstr "Non è possibile accedere alle informazioni di aggiornamento." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." -msgstr "" +msgstr "SolidWorks ha segnalato errori all’apertura del file. Si consiglia di risolvere queste problematiche all’interno di SolidWorks stesso." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 msgctxt "@info:status" @@ -630,7 +630,7 @@ msgid "" "Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" "\n" " Thanks!." -msgstr "" +msgstr "Nessun modello trovato nel disegno. Si prega di controllare nuovamente il contenuto e accertarsi che all’interno vi sia un componente o gruppo.\n\n Grazie." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 msgctxt "@info:status" @@ -638,7 +638,7 @@ msgid "" "Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" "\n" "Sorry!" -msgstr "" +msgstr "Trovato più di un componente o gruppo all’interno del disegno. Attualmente sono supportati solo i disegni con esattamente un componente o gruppo all’interno.\n\n Spiacenti." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" @@ -653,7 +653,7 @@ msgstr "File gruppo SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 msgctxt "@item:inlistbox" msgid "SolidWorks drawing file" -msgstr "" +msgstr "File disegno SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 msgctxt "@info:status" @@ -663,7 +663,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Gentile cliente,\nnon abbiamo trovato un’installazione valida di SolidWorks nel suo sistema. Questo significa che SolidWorks non è installato o che non possiede una licenza valida. La invitiamo a verificare che l’esecuzione di SolidWorks avvenga senza problemi e/o a contattare il suo ICT.\n\nCordiali saluti\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 msgctxt "@info:status" @@ -673,7 +673,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Gentile cliente,\nattualmente ha in esecuzione questo plugin su un sistema operativo diverso da Windows. Questo plugin funziona solo su Windows con SolidWorks installato, con inclusa una licenza valida. Si prega di installare questo plugin su una macchina Windows con SolidWorks installato.\n\nCordiali saluti\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" @@ -681,7 +681,7 @@ msgstr "Configura" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 msgid "Installation guide for SolidWorks macro" -msgstr "" +msgstr "Guida per l’installazione di macro SolidWorks" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" @@ -705,7 +705,7 @@ msgstr "Modifica G-code" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" msgid "Cura collects anonymized usage statistics." -msgstr "" +msgstr "Cura raccoglie statistiche di utilizzo in forma anonima." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -715,22 +715,22 @@ msgstr "Acquisizione dati" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Allow" -msgstr "" +msgstr "Consenti" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." -msgstr "" +msgstr "Consente a Cura di inviare in forma anonima statistiche d’uso, riguardanti alcune delle preferenze e impostazioni, la versione cura e una serie di modelli in sezionamento, per aiutare a dare priorità a miglioramenti futuri in Cura." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 msgctxt "@action:button" msgid "Disable" -msgstr "" +msgstr "Disabilita" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:tooltip" msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." -msgstr "" +msgstr "Non consente a Cura di inviare statistiche di utilizzo in forma anonima. È possibile riabilitare nelle preferenze." #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -740,14 +740,14 @@ msgstr "Profili Cura 15.04" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 msgctxt "@item:inlistbox" msgid "Blender file" -msgstr "" +msgstr "File Blender" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 msgctxt "@info:status" msgid "" "Could not export using \"{}\" quality!\n" "Felt back to \"{}\"." -msgstr "" +msgstr "Impossibile esportare utilizzando qualità \"{}\" quality!\nTornato a \"{}\"." #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 @@ -934,12 +934,12 @@ msgstr "Profilo Cura" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 msgctxt "@item:inmenu" msgid "Profile Assistant" -msgstr "" +msgstr "Assistente profilo" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 msgctxt "@item:inlistbox" msgid "Profile Assistant" -msgstr "" +msgstr "Assistente profilo" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" @@ -1137,13 +1137,13 @@ msgstr "Impossibile importare il profilo da {0}: { #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "This profile {0} contains incorrect data, could not import it." -msgstr "" +msgstr "Questo profilo {0} contiene dati errati, impossibile importarlo." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." -msgstr "" +msgstr "La macchina definita nel profilo {0} non corrisponde alla macchina corrente, impossibile importarlo." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format @@ -1155,7 +1155,7 @@ msgstr "Profilo importato correttamente {0}" #, python-brace-format msgctxt "@info:status" msgid "File {0} does not contain any valid profile." -msgstr "" +msgstr "Il file {0} non contiene nessun profilo valido." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format @@ -1183,7 +1183,7 @@ msgstr "Impossibile trovare un tipo qualità {0} per la configurazione corrente. #, python-brace-format msgctxt "@label" msgid "Group #{group_nr}" -msgstr "" +msgstr "Gruppo #{group_nr}" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" @@ -1242,7 +1242,7 @@ msgid "" "

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

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

    Si è verificato un errore fatale. Si prega di inviare questo Report su crash per correggere il problema

    \n

    Usare il pulsante “Invia report\" per inviare automaticamente una segnalazione errore ai nostri server

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" @@ -1257,32 +1257,32 @@ msgstr "Sconosciuto" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 msgctxt "@label Cura version number" msgid "Cura version" -msgstr "" +msgstr "Versione Cura" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 msgctxt "@label Type of platform" msgid "Platform" -msgstr "" +msgstr "Piattaforma" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 msgctxt "@label" msgid "Qt version" -msgstr "" +msgstr "Versione Qt" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 msgctxt "@label" msgid "PyQt version" -msgstr "" +msgstr "Versione PyQt" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 msgctxt "@label OpenGL version" msgid "OpenGL" -msgstr "" +msgstr "OpenGL" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 msgctxt "@label" msgid "not yet initialised
    " -msgstr "" +msgstr "non ancora inizializzato
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format @@ -1305,7 +1305,7 @@ msgstr "
  • Renderer OpenGL: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" msgid "Error traceback" -msgstr "" +msgstr "Analisi errori" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" @@ -1516,7 +1516,7 @@ msgstr "Dimensione ugello" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 msgctxt "@label" msgid "Compatible material diameter" -msgstr "" +msgstr "Diametro del materiale compatibile" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 msgctxt "@tooltip" @@ -1618,10 +1618,7 @@ 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 "" -"Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n" -"\n" -"Selezionare la stampante dall’elenco seguente:" +msgstr "Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n\nSelezionare la stampante dall’elenco seguente:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1661,12 +1658,12 @@ msgstr "Tipo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "" +msgstr "Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "" +msgstr "Ultimaker 3 Extended" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1733,7 +1730,7 @@ msgstr "%1 non è configurata per supportare la connessione di un gruppo di stam #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 msgctxt "@label link to connect manager" msgid "Add/Remove printers" -msgstr "" +msgstr "Aggiungi/Rimuovi stampanti" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" @@ -1773,7 +1770,7 @@ msgstr "Persa connessione con la stampante" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 msgctxt "@label Printer status" msgid "Unknown" -msgstr "" +msgstr "Sconosciuto" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" @@ -1869,164 +1866,164 @@ msgstr "Attiva la configurazione" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" msgid "SolidWorks: Export wizard" -msgstr "" +msgstr "SolidWorks: procedura guidata per l’esportazione" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" msgid "Quality:" -msgstr "" +msgstr "Qualità:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (3D-printing)" -msgstr "" +msgstr "Fine (stampa 3D)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (3D-printing)" -msgstr "" +msgstr "Grossolana (stampa 3D)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (SolidWorks)" -msgstr "" +msgstr "Fine (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (SolidWorks)" -msgstr "" +msgstr "Grossolana (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" msgid "Show this dialog again" -msgstr "" +msgstr "Mostra nuovamente questa finestra di dialogo" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 msgctxt "@action:button" msgid "Continue" -msgstr "" +msgstr "Continua" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 msgctxt "@action:button" msgid "Abort" -msgstr "" +msgstr "Interrompi" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 msgctxt "@title:window" msgid "How to install Cura SolidWorks macro" -msgstr "" +msgstr "Come installare la macro Cura SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 msgctxt "@description:label" msgid "Steps:" -msgstr "" +msgstr "Fasi:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 msgctxt "@action:button" msgid "" "Open the directory\n" "with macro and icon" -msgstr "" +msgstr "Aprire la directory\ncon macro e icona" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 msgctxt "@description:label" msgid "Instructions:" -msgstr "" +msgstr "Istruzioni:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 msgctxt "@action:playpause" msgid "Play" -msgstr "" +msgstr "Riproduci" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 msgctxt "@action:playpause" msgid "Pause" -msgstr "" +msgstr "Pausa" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 msgctxt "@action:button" msgid "Previous Step" -msgstr "" +msgstr "Fase precedente" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 msgctxt "@action:button" msgid "Done" -msgstr "" +msgstr "Eseguito" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 msgctxt "@action:button" msgid "Next Step" -msgstr "" +msgstr "Fase successiva" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 msgctxt "@title:window" msgid "SolidWorks plugin: Configuration" -msgstr "" +msgstr "Plugin SolidWorks: configurazione" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 msgctxt "@title:tab" msgid "Conversion settings" -msgstr "" +msgstr "Impostazioni di conversione" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 msgctxt "@label" msgid "First choice:" -msgstr "" +msgstr "Prima scelta:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 msgctxt "@text:menu" msgid "Latest installed version (Recommended)" -msgstr "" +msgstr "Ultima versione installata (consigliata)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 msgctxt "@text:menu" msgid "Default version" -msgstr "" +msgstr "Versione predefinita" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 msgctxt "@label" msgid "Show wizard before opening SolidWorks files" -msgstr "" +msgstr "Mostra la procedura guidata prima di aprire i file SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 msgctxt "@label" msgid "Automatically rotate opened file into normed orientation" -msgstr "" +msgstr "Ruota automaticamente il file aperto nell’orientamento corretto" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 msgctxt "@title:tab" msgid "Installation(s)" -msgstr "" +msgstr "Installazione(i)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 msgctxt "@label" msgid "COM service found" -msgstr "" +msgstr "Servizio COM trovato" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 msgctxt "@label" msgid "Executable found" -msgstr "" +msgstr "Eseguibile trovato" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 msgctxt "@label" msgid "COM starting" -msgstr "" +msgstr "COM in avvio" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 msgctxt "@label" msgid "Revision number" -msgstr "" +msgstr "Numero di revisione" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 msgctxt "@label" msgid "Functions available" -msgstr "" +msgstr "Funzioni disponibili" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 @@ -2212,32 +2209,32 @@ msgstr "Smoothing" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 msgctxt "@label" msgid "Mesh Type" -msgstr "" +msgstr "Tipo di maglia" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 msgctxt "@label" msgid "Normal model" -msgstr "" +msgstr "Modello normale" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 msgctxt "@label" msgid "Print as support" -msgstr "" +msgstr "Stampa come supporto" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 msgctxt "@label" msgid "Don't support overlap with other models" -msgstr "" +msgstr "Non supporta sovrapposizione con altri modelli" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 msgctxt "@label" msgid "Modify settings for overlap with other models" -msgstr "" +msgstr "Modifica impostazioni per sovrapposizione con altri modelli" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 msgctxt "@label" msgid "Modify settings for infill of other models" -msgstr "" +msgstr "Modifica impostazioni per riempimento di altri modelli" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" @@ -2423,10 +2420,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Questo plugin contiene una licenza.\n" -"È necessario accettare questa licenza per poter installare il plugin.\n" -"Accetti i termini sotto riportati?" +msgstr "Questo plugin contiene una licenza.\nÈ necessario accettare questa licenza per poter installare il plugin.\nAccetti i termini sotto riportati?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2691,9 +2685,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Sono state personalizzate alcune impostazioni del profilo.\n" -"Mantenere o eliminare tali impostazioni?" +msgstr "Sono state personalizzate alcune impostazioni del profilo.\nMantenere o eliminare tali impostazioni?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3097,27 +3089,27 @@ msgstr "Invia informazioni di stampa (anonime)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 msgctxt "@label" msgid "Experimental" -msgstr "" +msgstr "Sperimentale" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 msgctxt "@info:tooltip" msgid "Use multi build plate functionality" -msgstr "" +msgstr "Utilizzare la funzionalità piano di stampa multiplo" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 msgctxt "@option:check" msgid "Use multi build plate functionality (restart required)" -msgstr "" +msgstr "Utilizzare la funzionalità piano di stampa multiplo (necessario riavvio)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 msgctxt "@info:tooltip" msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" -msgstr "" +msgstr "I modelli appena caricati devono essere sistemati sul piano di stampa? Utilizzato in abbinamento al piano di stampa multiplo (SPERIMENTALE)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 msgctxt "@option:check" msgid "Do not arrange objects on load" -msgstr "" +msgstr "Non posizionare oggetti sul carico" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 @@ -3361,9 +3353,7 @@ 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 è stato sviluppato da Ultimaker B.V. in cooperazione con la comunità.\n" -"Cura è orgogliosa di utilizzare i seguenti progetti open source:" +msgstr "Cura è stato sviluppato da Ultimaker B.V. in cooperazione con la comunità.\nCura è orgogliosa di utilizzare i seguenti progetti open source:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3471,10 +3461,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Alcuni valori di impostazione/esclusione sono diversi dai valori memorizzati nel profilo.\n" -"\n" -"Fare clic per aprire la gestione profili." +msgstr "Alcuni valori di impostazione/esclusione sono diversi dai valori memorizzati nel profilo.\n\nFare clic per aprire la gestione profili." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" @@ -3512,10 +3499,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Alcune impostazioni nascoste utilizzano valori diversi dal proprio valore normale calcolato.\n" -"\n" -"Fare clic per rendere visibili queste impostazioni." +msgstr "Alcune impostazioni nascoste utilizzano valori diversi dal proprio valore normale calcolato.\n\nFare clic per rendere visibili queste impostazioni." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3530,7 +3514,7 @@ msgstr "Influenzato da" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." -msgstr "" +msgstr "Questa impostazione è sempre condivisa tra tutti gli estrusori. La sua modifica varierà il valore per tutti gli estrusori." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" @@ -3543,10 +3527,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Questa impostazione ha un valore diverso dal profilo.\n" -"\n" -"Fare clic per ripristinare il valore del profilo." +msgstr "Questa impostazione ha un valore diverso dal profilo.\n\nFare clic per ripristinare il valore del profilo." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" @@ -3554,10 +3535,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Questa impostazione normalmente viene calcolata, ma attualmente ha impostato un valore assoluto.\n" -"\n" -"Fare clic per ripristinare il valore calcolato." +msgstr "Questa impostazione normalmente viene calcolata, ma attualmente ha impostato un valore assoluto.\n\nFare clic per ripristinare il valore calcolato." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" @@ -3569,9 +3547,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Impostazione di stampa disabilitata\n" -"I file codice G non possono essere modificati" +msgstr "Impostazione di stampa disabilitata\nI file codice G non possono essere modificati" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" @@ -3581,7 +3557,7 @@ msgstr "00h 00min" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" msgid "Time specification" -msgstr "" +msgstr "Indicazioni di tempo" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" @@ -3638,12 +3614,12 @@ msgstr "&Visualizza" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 msgctxt "@action:inmenu menubar:view" msgid "&Camera position" -msgstr "" +msgstr "&Posizione fotocamera" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "" +msgstr "&Piano di stampa" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" @@ -3813,27 +3789,27 @@ msgstr "E&sci" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" msgid "&3D View" -msgstr "" +msgstr "&Visualizzazione 3D" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:view" msgid "&Front View" -msgstr "" +msgstr "&Visualizzazione frontale" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 msgctxt "@action:inmenu menubar:view" msgid "&Top View" -msgstr "" +msgstr "&Visualizzazione superiore" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 msgctxt "@action:inmenu menubar:view" msgid "&Left Side View" -msgstr "" +msgstr "&Visualizzazione lato sinistro" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:view" msgid "&Right Side View" -msgstr "" +msgstr "&Visualizzazione lato destro" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" @@ -3959,7 +3935,7 @@ msgstr "R&icarica tutti i modelli" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "" +msgstr "Sistema tutti i modelli su tutti i piani di stampa" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" @@ -4019,7 +3995,7 @@ msgstr "Plugin installati..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 msgctxt "@action:inmenu menubar:view" msgid "Expand/Collapse Sidebar" -msgstr "" +msgstr "Espandi/Riduci barra laterale" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" @@ -4054,12 +4030,12 @@ msgstr "Sezionamento non disponibile" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Slice current printjob" -msgstr "" +msgstr "Seziona processo di stampa corrente" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Cancel slicing process" -msgstr "" +msgstr "Annulla processo di sezionamento" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" @@ -4115,7 +4091,7 @@ msgstr "Salva &come..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" msgid "Save &Project..." -msgstr "" +msgstr "Salva &progetto..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" @@ -4354,7 +4330,7 @@ msgstr "Materiale" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Controlla compatibilità" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" @@ -4364,17 +4340,17 @@ msgstr "Fai clic per verificare la compatibilità del materiale su Ultimaker.com #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 msgctxt "@option:check" msgid "See only current build plate" -msgstr "" +msgstr "Vedi solo il piano di stampa corrente" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 msgctxt "@action:button" msgid "Arrange to all build plates" -msgstr "" +msgstr "Sistema su tutti i piani di stampa" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 msgctxt "@action:button" msgid "Arrange current build plate" -msgstr "" +msgstr "Sistema il piano di stampa corrente" #: MachineSettingsAction/plugin.json msgctxt "description" @@ -4469,22 +4445,22 @@ msgstr "Stampa USB" #: PrepareStage/plugin.json msgctxt "description" msgid "Provides a prepare stage in Cura." -msgstr "" +msgstr "Fornisce una fase di preparazione in Cura." #: PrepareStage/plugin.json msgctxt "name" msgid "Prepare Stage" -msgstr "" +msgstr "Fase di preparazione" #: CuraLiveScriptingPlugin/plugin.json msgctxt "description" msgid "Provides an edit window for direct script editing." -msgstr "" +msgstr "Fornisce una finestra di modifica per la modifica script diretta." #: CuraLiveScriptingPlugin/plugin.json msgctxt "name" msgid "Live scripting tool" -msgstr "" +msgstr "Strumento di script diretto" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" @@ -4509,12 +4485,12 @@ msgstr "Connessione di rete UM3" #: MonitorStage/plugin.json msgctxt "description" msgid "Provides a monitor stage in Cura." -msgstr "" +msgstr "Fornisce una fase di controllo in Cura." #: MonitorStage/plugin.json msgctxt "name" msgid "Monitor Stage" -msgstr "" +msgstr "Fase di controllo" #: FirmwareUpdateChecker/plugin.json msgctxt "description" @@ -4529,7 +4505,7 @@ msgstr "Controllo aggiornamento firmware" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." -msgstr "" +msgstr "Offre la possibilità di aprire alcuni file utilizzando SolidWorks. La conversione viene effettuata da questo plugin e ottimizzazioni addizionali." #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4599,12 +4575,12 @@ msgstr "Lettore legacy profilo Cura" #: CuraBlenderPlugin/plugin.json msgctxt "description" msgid "Helps to open Blender files directly in Cura." -msgstr "" +msgstr "Aiuta ad aprire i file Blender direttamente in Cura." #: CuraBlenderPlugin/plugin.json msgctxt "name" msgid "Blender Integration (experimental)" -msgstr "" +msgstr "Integrazione Blender (sperimentale)" #: GCodeProfileReader/plugin.json msgctxt "description" @@ -4769,12 +4745,12 @@ msgstr "Writer profilo Cura" #: CuraPrintProfileCreator/plugin.json msgctxt "description" msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." -msgstr "" +msgstr "Consente ai produttori di materiali di creare nuovi profili materiale e di qualità utilizzando una UI drop-in." #: CuraPrintProfileCreator/plugin.json msgctxt "name" msgid "Print Profile Assistant" -msgstr "" +msgstr "Assistente profilo di stampa" #: 3MFWriter/plugin.json msgctxt "description" diff --git a/resources/i18n/it_IT/fdmprinter.def.json.po b/resources/i18n/it_IT/fdmprinter.def.json.po index 204ebdc539..693c88f543 100644 --- a/resources/i18n/it_IT/fdmprinter.def.json.po +++ b/resources/i18n/it_IT/fdmprinter.def.json.po @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"I comandi codice G da eseguire all’avvio, separati da \n" -"." +msgstr "I comandi codice G da eseguire all’avvio, separati da \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"I comandi codice G da eseguire alla fine, separati da \n" -"." +msgstr "I comandi codice G da eseguire alla fine, separati da \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -352,12 +348,12 @@ msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_firmware_retract label" msgid "Firmware Retraction" -msgstr "" +msgstr "Retrazione firmware" #: fdmprinter.def.json msgctxt "machine_firmware_retract description" msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." -msgstr "" +msgstr "Specifica se usare comandi di retrazione firmware (G10/G11) anziché utilizzare la proprietà E nei comandi G1 per retrarre il materiale." #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" @@ -1052,12 +1048,12 @@ msgstr "In tutti i possibili punti" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps label" msgid "Filter Out Tiny Gaps" -msgstr "" +msgstr "Esclusione spazi minimi" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps description" msgid "Filter out tiny gaps to reduce blobs on outside of model." -msgstr "" +msgstr "Esclude gli spazi minimi per ridurre le gocce sull’esterno del modello." #: fdmprinter.def.json msgctxt "fill_outline_gaps label" @@ -1442,7 +1438,7 @@ msgstr "Offset X riempimento" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is moved this distance along the X axis." -msgstr "" +msgstr "Il riempimento si sposta di questa distanza lungo l'asse X." #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1452,7 +1448,7 @@ msgstr "Offset Y riempimento" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is moved this distance along the Y axis." -msgstr "" +msgstr "Il riempimento si sposta di questa distanza lungo l'asse Y." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1472,7 +1468,7 @@ msgstr "Percentuale di sovrapposizione del riempimento" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "Indica la quantità di sovrapposizione tra il riempimento e le pareti come percentuale della larghezza della linea di riempimento. Una leggera sovrapposizione consente il saldo collegamento delle pareti al riempimento." #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1492,7 +1488,7 @@ msgstr "Percentuale di sovrapposizione del rivestimento esterno" #: fdmprinter.def.json msgctxt "skin_overlap description" msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." -msgstr "" +msgstr "Entità della sovrapposizione tra il rivestimento e le pareti espressa in percentuale della larghezza della linea del rivestimento esterno. Una leggera sovrapposizione consente alle pareti di essere saldamente collegate al rivestimento. È una percentuale delle larghezze medie delle linee del rivestimento e della parete più interna." #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1722,7 +1718,7 @@ msgstr "Temperatura piano di stampa" #: fdmprinter.def.json msgctxt "material_bed_temperature description" msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." -msgstr "" +msgstr "Indica la temperatura usata per il piano di stampa riscaldato. Se è 0, la temperatura del piano non si regola." #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3504,9 +3500,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 "" -"Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\n" -"Questa è la distanza minima. Più linee di skirt aumenteranno tale distanza." +msgstr "Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\nQuesta è la distanza minima. Più linee di skirt aumenteranno tale distanza." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4266,82 +4260,82 @@ msgstr "sperimentale!" #: fdmprinter.def.json msgctxt "support_tree_enable label" msgid "Tree Support" -msgstr "" +msgstr "Supporto ad albero" #: fdmprinter.def.json msgctxt "support_tree_enable description" msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." -msgstr "" +msgstr "Genera un supporto tipo albero con rami di sostegno della stampa. Questo può ridurre l’impiego di materiale e il tempo di stampa, ma aumenta notevolmente il tempo di sezionamento." #: fdmprinter.def.json msgctxt "support_tree_angle label" msgid "Tree Support Branch Angle" -msgstr "" +msgstr "Angolo ramo supporto ad albero" #: fdmprinter.def.json msgctxt "support_tree_angle description" msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." -msgstr "" +msgstr "L’angolo dei rami. Utilizzare un angolo minore per renderli più verticali e più stabili. Utilizzare un angolo maggiore per avere una portata maggiore." #: fdmprinter.def.json msgctxt "support_tree_branch_distance label" msgid "Tree Support Branch Distance" -msgstr "" +msgstr "Distanza ramo supporto ad albero" #: fdmprinter.def.json msgctxt "support_tree_branch_distance description" msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." -msgstr "" +msgstr "La distanza tra i rami necessaria quando toccano il modello. Una distanza ridotta causa il contatto del supporto ad albero con il modello in più punti, generando migliore sovrapposizione ma rendendo più difficoltosa la rimozione del supporto." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter label" msgid "Tree Support Branch Diameter" -msgstr "" +msgstr "Diametro ramo supporto ad albero" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter description" msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." -msgstr "" +msgstr "Il diametro dei rami più sottili del supporto. I rami più spessi sono più resistenti. I rami verso la base avranno spessore maggiore." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle label" msgid "Tree Support Branch Diameter Angle" -msgstr "" +msgstr "Angolo diametro ramo supporto ad albero" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle description" msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." -msgstr "" +msgstr "L’angolo del diametro dei rami con il graduale ispessimento verso il fondo. Un angolo pari a 0 genera rami con spessore uniforme sull’intera lunghezza. Un angolo minimo può aumentare la stabilità del supporto ad albero." #: fdmprinter.def.json msgctxt "support_tree_collision_resolution label" msgid "Tree Support Collision Resolution" -msgstr "" +msgstr "Risoluzione collisione supporto ad albero" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution description" msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." -msgstr "" +msgstr "Risoluzione per calcolare le collisioni per evitare di colpire il modello. L’impostazione a un valore basso genera alberi più accurati che si rompono meno sovente, ma aumenta notevolmente il tempo di sezionamento." #: fdmprinter.def.json msgctxt "support_tree_wall_thickness label" msgid "Tree Support Wall Thickness" -msgstr "" +msgstr "Spessore delle pareti supporto ad albero" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness description" msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "Lo spessore delle pareti dei rami del supporto ad albero. Le pareti più spesse hanno un tempo di stampa superiore ma non cadono facilmente." #: fdmprinter.def.json msgctxt "support_tree_wall_count label" msgid "Tree Support Wall Line Count" -msgstr "" +msgstr "Numero delle linee perimetrali supporto ad albero" #: fdmprinter.def.json msgctxt "support_tree_wall_count description" msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "Il numero di pareti dei rami del supporto ad albero. Le pareti più spesse hanno un tempo di stampa superiore ma non cadono facilmente." #: fdmprinter.def.json msgctxt "slicing_tolerance label" @@ -4416,12 +4410,12 @@ msgstr "Un elenco di direzioni linee intere da usare quando gli strati rivestime #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization label" msgid "Infill Travel Optimization" -msgstr "" +msgstr "Ottimizzazione spostamenti riempimento" #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization description" msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." -msgstr "" +msgstr "Quando abilitato, l’ordine di stampa delle linee di riempimento viene ottimizzato per ridurre la distanza percorsa. La riduzione del tempo di spostamento ottenuta dipende in particolare dal modello sezionato, dalla configurazione di riempimento, dalla densità, ecc. Si noti che, per alcuni modelli che hanno piccole aree di riempimento, il tempo di sezionamento del modello può aumentare notevolmente." #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" @@ -4943,9 +4937,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 "" -"Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\n" -"Ciò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing." +msgstr "Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\nCiò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5055,42 +5047,42 @@ msgstr "Indica la distanza tra l'ugello e le linee diagonali verso il basso. Un #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled label" msgid "Use adaptive layers" -msgstr "" +msgstr "Uso di strati adattivi" #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled description" msgid "Adaptive layers computes the layer heights depending on the shape of the model." -msgstr "" +msgstr "Gli strati adattivi calcolano l’altezza degli strati in base alla forma del modello." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation label" msgid "Adaptive layers maximum variation" -msgstr "" +msgstr "Variazione massima strati adattivi" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height in mm." -msgstr "" +msgstr "La differenza di altezza massima rispetto all’altezza dello strato di base in mm." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" msgid "Adaptive layers variation step size" -msgstr "" +msgstr "Dimensione variazione strati adattivi" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step description" msgid "The difference in height of the next layer height compared to the previous one." -msgstr "" +msgstr "La differenza in altezza dello strato successivo rispetto al precedente." #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold label" msgid "Adaptive layers threshold" -msgstr "" +msgstr "Soglia strati adattivi" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold description" msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." -msgstr "" +msgstr "Soglia per l’utilizzo o meno di uno strato di dimensioni minori. Questo numero è confrontato al valore dell’inclinazione più ripida di uno strato." #: fdmprinter.def.json msgctxt "command_line_settings label" diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index b394a3a510..c2a61cf094 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -191,7 +191,7 @@ msgstr "ファームウェア" #: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Prepare" -msgstr "" +msgstr "準備する" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -564,7 +564,7 @@ msgstr "プリントジョブのインターフェイスをブラウザーで開 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 msgctxt "@label Printer name" msgid "Unknown" -msgstr "" +msgstr "不明" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format @@ -599,7 +599,7 @@ msgstr "ネットワーク上にて接続" #: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Monitor" -msgstr "" +msgstr "モニター" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format @@ -626,7 +626,7 @@ msgstr "必要なアップデートの情報にアクセスできません。" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." -msgstr "" +msgstr "ソリッドワークスがファイルを開く際にエラーを報告しました。ソリッドワークス内で問題を解決することをお勧めします。" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 msgctxt "@info:status" @@ -634,7 +634,7 @@ msgid "" "Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" "\n" " Thanks!." -msgstr "" +msgstr "図面の中にモデルが見つかりません。中身を確認し、パートかアセンブリーが中に入っていることを確認してください。\n\n 再確認をお願いします。" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 msgctxt "@info:status" @@ -642,7 +642,7 @@ msgid "" "Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" "\n" "Sorry!" -msgstr "" +msgstr "図面の中にパートかアセンブリーが2個以上見つかりました。今のところ、本製品はパートかアセンブリーが1個の図面のみに対応しています。\n\n申し訳ありません。" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" @@ -657,7 +657,7 @@ msgstr "ソリッドワークスアセンブリーファイル" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 msgctxt "@item:inlistbox" msgid "SolidWorks drawing file" -msgstr "" +msgstr "ソリッドワークス図面ファイル" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 msgctxt "@info:status" @@ -667,7 +667,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "お客様へ\nシステム上に正規のソリッドワークスがインストールされていません。つまり、ソリッドワークスがインストールされていないか、有効なライセンスが存在しません。ソリッドワークスだけを問題なく使用できるようになっているか確認するか、自社のIT部門にご相談ください。\n\nお願いいたします。\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 msgctxt "@info:status" @@ -677,7 +677,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "お客様へ\nこのプラグインは現在Windows以外のOSで実行されています。このプラグインは、ソリッドワークスがインストールされたWindowsでしか動作しません。有効なライセンスも必要です。ソリッドワークスがインストールされたWindowsマシンにこのプラグインをインストールしてください。\n\nお願いいたします。\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" @@ -685,7 +685,7 @@ msgstr "構成" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 msgid "Installation guide for SolidWorks macro" -msgstr "" +msgstr "ソリッドワークス・マクロのインストールガイド" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" @@ -709,7 +709,7 @@ msgstr "G-codeを修正" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" msgid "Cura collects anonymized usage statistics." -msgstr "" +msgstr "Curaは、匿名化した利用統計を収集します。" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -719,22 +719,22 @@ msgstr "データを収集中" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Allow" -msgstr "" +msgstr "許可" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." -msgstr "" +msgstr "Curaが匿名化した利用統計を送信することを許可し、Curaの将来の改善を優先的に行うことに貢献します。プレファレンスと設定の一部、Curaのバージョン、スライスしているモデルのハッシュが送信されます。" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 msgctxt "@action:button" msgid "Disable" -msgstr "" +msgstr "無効化" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:tooltip" msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." -msgstr "" +msgstr "Curaが匿名化した利用統計を送信することを許可しません。プレファレンスで許可に変更することができます。" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -744,14 +744,14 @@ msgstr "Cura 15.04 プロファイル" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 msgctxt "@item:inlistbox" msgid "Blender file" -msgstr "" +msgstr "Blenderファイル" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 msgctxt "@info:status" msgid "" "Could not export using \"{}\" quality!\n" "Felt back to \"{}\"." -msgstr "" +msgstr "\"{}\"品質を使用したエクスポートができませんでした!\n\"{}\"になりました。" #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 @@ -938,12 +938,12 @@ msgstr "Curaプロファイル" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 msgctxt "@item:inmenu" msgid "Profile Assistant" -msgstr "" +msgstr "プロファイルアシスタント" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 msgctxt "@item:inlistbox" msgid "Profile Assistant" -msgstr "" +msgstr "プロファイルアシスタント" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" @@ -1141,13 +1141,13 @@ msgstr "{0}: {1}からプロファイル #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "This profile {0} contains incorrect data, could not import it." -msgstr "" +msgstr "このプロファイル{0}には、正しくないデータが含まれていて、インポートできません。" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." -msgstr "" +msgstr "プロファイル{0}の中で定義されているマシンは、現在お使いのマシンと一致しませんので、インポートできませんでした。" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format @@ -1159,7 +1159,7 @@ msgstr "プロファイル {0}の取り込み完了" #, python-brace-format msgctxt "@info:status" msgid "File {0} does not contain any valid profile." -msgstr "" +msgstr "ファイル{0}には、正しいプロファイルが含まれていません。" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format @@ -1187,7 +1187,7 @@ msgstr "進行中のプリント構成にあったクオリティータイプ{0} #, python-brace-format msgctxt "@label" msgid "Group #{group_nr}" -msgstr "" +msgstr "グループ #{group_nr}" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" @@ -1246,7 +1246,7 @@ msgid "" "

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

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

    致命的なエラーが発生しました。問題解決のためこのクラッシュレポートを送信してください

    \n

    「レポート送信」ボタンを使用してバグレポートが自動的に当社サーバーに送られるようにしてください

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" @@ -1261,32 +1261,32 @@ msgstr "不明" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 msgctxt "@label Cura version number" msgid "Cura version" -msgstr "" +msgstr "Curaバージョン" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 msgctxt "@label Type of platform" msgid "Platform" -msgstr "" +msgstr "プラットフォーム" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 msgctxt "@label" msgid "Qt version" -msgstr "" +msgstr "Qtバージョン" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 msgctxt "@label" msgid "PyQt version" -msgstr "" +msgstr "PyQtバージョン" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 msgctxt "@label OpenGL version" msgid "OpenGL" -msgstr "" +msgstr "OpenGL" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 msgctxt "@label" msgid "not yet initialised
    " -msgstr "" +msgstr "初期化されていません
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format @@ -1309,7 +1309,7 @@ msgstr "
  • OpenGLレンダラー: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" msgid "Error traceback" -msgstr "" +msgstr "エラー・トレースバック" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" @@ -1520,7 +1520,7 @@ msgstr "ノズルサイズ" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 msgctxt "@label" msgid "Compatible material diameter" -msgstr "" +msgstr "適合する材料直径" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 msgctxt "@tooltip" @@ -1662,12 +1662,12 @@ msgstr "タイプ" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "" +msgstr "Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "" +msgstr "Ultimaker 3 Extended" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1734,7 +1734,7 @@ msgstr "%1は、繋がっているUltimaker3プリンターのグループをホ #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 msgctxt "@label link to connect manager" msgid "Add/Remove printers" -msgstr "" +msgstr "プリンターの追加/削除" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" @@ -1774,7 +1774,7 @@ msgstr "プリンターへの接続が切断されました。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 msgctxt "@label Printer status" msgid "Unknown" -msgstr "" +msgstr "不明" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" @@ -1870,164 +1870,164 @@ msgstr "プリント構成をアクティベートする" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" msgid "SolidWorks: Export wizard" -msgstr "" +msgstr "ソリッドワークス: エクスポートウィザード" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" msgid "Quality:" -msgstr "" +msgstr "品質: " #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (3D-printing)" -msgstr "" +msgstr "精細 (3Dプリント)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (3D-printing)" -msgstr "" +msgstr "大まか (3Dプリント)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (SolidWorks)" -msgstr "" +msgstr "精細 (ソリッドワークス)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (SolidWorks)" -msgstr "" +msgstr "大まか (ソリッドワークス)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" msgid "Show this dialog again" -msgstr "" +msgstr "このダイアログを再度表示する" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 msgctxt "@action:button" msgid "Continue" -msgstr "" +msgstr "続行" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 msgctxt "@action:button" msgid "Abort" -msgstr "" +msgstr "中断" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 msgctxt "@title:window" msgid "How to install Cura SolidWorks macro" -msgstr "" +msgstr "Curaソリッドワークス・マクロのインストール方法" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 msgctxt "@description:label" msgid "Steps:" -msgstr "" +msgstr "ステップ: " #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 msgctxt "@action:button" msgid "" "Open the directory\n" "with macro and icon" -msgstr "" +msgstr "ディレクトリーを開きます\n(マクロとアイコンで)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 msgctxt "@description:label" msgid "Instructions:" -msgstr "" +msgstr "指示: " #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 msgctxt "@action:playpause" msgid "Play" -msgstr "" +msgstr "実行" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 msgctxt "@action:playpause" msgid "Pause" -msgstr "" +msgstr "一時停止" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 msgctxt "@action:button" msgid "Previous Step" -msgstr "" +msgstr "前のステップ" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 msgctxt "@action:button" msgid "Done" -msgstr "" +msgstr "完了" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 msgctxt "@action:button" msgid "Next Step" -msgstr "" +msgstr "次のステップ" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 msgctxt "@title:window" msgid "SolidWorks plugin: Configuration" -msgstr "" +msgstr "ソリッドワークスプラグイン: コンフィグレーション" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 msgctxt "@title:tab" msgid "Conversion settings" -msgstr "" +msgstr "変換設定" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 msgctxt "@label" msgid "First choice:" -msgstr "" +msgstr "最初の選択: " #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 msgctxt "@text:menu" msgid "Latest installed version (Recommended)" -msgstr "" +msgstr "インストールされている最新バージョン (推奨)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 msgctxt "@text:menu" msgid "Default version" -msgstr "" +msgstr "デフォルトバージョン" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 msgctxt "@label" msgid "Show wizard before opening SolidWorks files" -msgstr "" +msgstr "ソリッドワークスのファイルを開く前にウィザードを表示" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 msgctxt "@label" msgid "Automatically rotate opened file into normed orientation" -msgstr "" +msgstr "開いたファイルを自動的に正規の向きに回転" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 msgctxt "@title:tab" msgid "Installation(s)" -msgstr "" +msgstr "インストール" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 msgctxt "@label" msgid "COM service found" -msgstr "" +msgstr "COMサービスが存在" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 msgctxt "@label" msgid "Executable found" -msgstr "" +msgstr "実行ファイルが存在" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 msgctxt "@label" msgid "COM starting" -msgstr "" +msgstr "COM開始" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 msgctxt "@label" msgid "Revision number" -msgstr "" +msgstr "改訂番号" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 msgctxt "@label" msgid "Functions available" -msgstr "" +msgstr "利用可能な関数" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 @@ -2213,32 +2213,32 @@ msgstr "スムージング" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 msgctxt "@label" msgid "Mesh Type" -msgstr "" +msgstr "メッシュタイプ" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 msgctxt "@label" msgid "Normal model" -msgstr "" +msgstr "標準モデル" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 msgctxt "@label" msgid "Print as support" -msgstr "" +msgstr "サポートとしてプリント" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 msgctxt "@label" msgid "Don't support overlap with other models" -msgstr "" +msgstr "他のモデルとのオーバーラップは未サポート" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 msgctxt "@label" msgid "Modify settings for overlap with other models" -msgstr "" +msgstr "他のモデルとのオーバーラップの設定を変更" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 msgctxt "@label" msgid "Modify settings for infill of other models" -msgstr "" +msgstr "他のモデルのインフィルの設定を変更" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" @@ -2426,10 +2426,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"このプラグインにはライセンスが含まれています。\n" -"このプラグインをインストールするにはこのライセンスに同意する必要があります。\n" -"下の利用規約に同意しますか?" +msgstr "このプラグインにはライセンスが含まれています。\nこのプラグインをインストールするにはこのライセンスに同意する必要があります。\n下の利用規約に同意しますか?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -3101,27 +3098,27 @@ msgstr " (不特定な) プリントインフォメーションを送信" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 msgctxt "@label" msgid "Experimental" -msgstr "" +msgstr "実験" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 msgctxt "@info:tooltip" msgid "Use multi build plate functionality" -msgstr "" +msgstr "マルチビルドプレート機能を使用" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 msgctxt "@option:check" msgid "Use multi build plate functionality (restart required)" -msgstr "" +msgstr "マルチビルドプレート機能を使用 (再起動が必要)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 msgctxt "@info:tooltip" msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" -msgstr "" +msgstr "新たにロードしたモデルをビルドプレート上に配置すべきですか? マルチビルドプレートと共に使用 (実験的)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 msgctxt "@option:check" msgid "Do not arrange objects on load" -msgstr "" +msgstr "ロード時にオブジェクトを配置しません" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 @@ -3473,9 +3470,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"いくらかの設定プロファイルにある値とことなる場合無効にします。\n" -"プロファイルマネージャーをクリックして開いてください。" +msgstr "いくらかの設定プロファイルにある値とことなる場合無効にします。\nプロファイルマネージャーをクリックして開いてください。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" @@ -3513,9 +3508,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n" -"表示されるようにクリックしてください。" +msgstr "いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n表示されるようにクリックしてください。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3530,7 +3523,7 @@ msgstr "次によって影響を受ける" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." -msgstr "" +msgstr "この設定は常に全てのエクストルーダーに共有されています。ここですべてのエクストルーダーの数値を変更できます。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" @@ -3543,9 +3536,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"この設定にプロファイルと異なった値があります。\n" -"プロファイルの値を戻すためにクリックしてください。" +msgstr "この設定にプロファイルと異なった値があります。\nプロファイルの値を戻すためにクリックしてください。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" @@ -3553,9 +3544,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"このセッティングは通常計算されます、今は絶対値に固定されています。\n" -"計算された値に変更するためにクリックを押してください。" +msgstr "このセッティングは通常計算されます、今は絶対値に固定されています。\n計算された値に変更するためにクリックを押してください。" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" @@ -3567,9 +3556,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"プリントセットアップが無効\n" -"G-codeファイルを修正することができません。" +msgstr "プリントセットアップが無効\nG-codeファイルを修正することができません。" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" @@ -3579,7 +3566,7 @@ msgstr "00時間 00分" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" msgid "Time specification" -msgstr "" +msgstr "時間仕様" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" @@ -3636,12 +3623,12 @@ msgstr "&ビュー" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 msgctxt "@action:inmenu menubar:view" msgid "&Camera position" -msgstr "" +msgstr "カメラ位置 (&C)" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "" +msgstr "ビルドプレート (&B)" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" @@ -3811,27 +3798,27 @@ msgstr "&やめる" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" msgid "&3D View" -msgstr "" +msgstr "3Dビュー (&3)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:view" msgid "&Front View" -msgstr "" +msgstr "フロントビュー (&F)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 msgctxt "@action:inmenu menubar:view" msgid "&Top View" -msgstr "" +msgstr "トップビュー (&T)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 msgctxt "@action:inmenu menubar:view" msgid "&Left Side View" -msgstr "" +msgstr "左サイドビュー (&L)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:view" msgid "&Right Side View" -msgstr "" +msgstr "右サイドビュー (&R)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" @@ -3957,7 +3944,7 @@ msgstr "すべてのモデルを読み込む" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "" +msgstr "すべてのモデルをすべてのビルドプレートに配置" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" @@ -4017,7 +4004,7 @@ msgstr "インストールされたプラグイン" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 msgctxt "@action:inmenu menubar:view" msgid "Expand/Collapse Sidebar" -msgstr "" +msgstr "サイドバーを展開する/たたむ" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" @@ -4052,12 +4039,12 @@ msgstr "スライスが利用不可能" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Slice current printjob" -msgstr "" +msgstr "現在のプリントジョブをスライスします" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Cancel slicing process" -msgstr "" +msgstr "スライスプロセスをキャンセルします" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" @@ -4113,7 +4100,7 @@ msgstr "名前をつけて保存" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" msgid "Save &Project..." -msgstr "" +msgstr "プロジェクトの保存 (&P)..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" @@ -4352,7 +4339,7 @@ msgstr "フィラメント" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "互換性の確認" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" @@ -4362,17 +4349,17 @@ msgstr "Ultimaker.comにてマテリアルのコンパティビリティを調 #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 msgctxt "@option:check" msgid "See only current build plate" -msgstr "" +msgstr "現在のビルドプレートのみを表示" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 msgctxt "@action:button" msgid "Arrange to all build plates" -msgstr "" +msgstr "すべてのビルドプレートに配置" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 msgctxt "@action:button" msgid "Arrange current build plate" -msgstr "" +msgstr "現在のビルドプレートを配置" #: MachineSettingsAction/plugin.json msgctxt "description" @@ -4467,22 +4454,22 @@ msgstr "USBプリンティング" #: PrepareStage/plugin.json msgctxt "description" msgid "Provides a prepare stage in Cura." -msgstr "" +msgstr "Curaで準備ステージを提供します。" #: PrepareStage/plugin.json msgctxt "name" msgid "Prepare Stage" -msgstr "" +msgstr "ステージの準備" #: CuraLiveScriptingPlugin/plugin.json msgctxt "description" msgid "Provides an edit window for direct script editing." -msgstr "" +msgstr "直接スクリプト編集のための編集ウィンドウを提供します。" #: CuraLiveScriptingPlugin/plugin.json msgctxt "name" msgid "Live scripting tool" -msgstr "" +msgstr "ライブスクリプティングツール" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" @@ -4507,12 +4494,12 @@ msgstr "UM3ネットワークコネクション" #: MonitorStage/plugin.json msgctxt "description" msgid "Provides a monitor stage in Cura." -msgstr "" +msgstr "Curaでモニターステージを提供します。" #: MonitorStage/plugin.json msgctxt "name" msgid "Monitor Stage" -msgstr "" +msgstr "モニターステージ" #: FirmwareUpdateChecker/plugin.json msgctxt "description" @@ -4527,7 +4514,7 @@ msgstr "ファームウェアアップデートチェッカー" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." -msgstr "" +msgstr "ソリッドワークス自体を使って特定のファイルを開くことが可能です。変換はこのプラグインによって行われ、追加の最適化も行われます。" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4597,12 +4584,12 @@ msgstr "レガシーCuraプロファイルリーダー" #: CuraBlenderPlugin/plugin.json msgctxt "description" msgid "Helps to open Blender files directly in Cura." -msgstr "" +msgstr "Curaの中で直接Blenderファイルを開くために役立ちます。" #: CuraBlenderPlugin/plugin.json msgctxt "name" msgid "Blender Integration (experimental)" -msgstr "" +msgstr "Blender統合 (実験的)" #: GCodeProfileReader/plugin.json msgctxt "description" @@ -4767,12 +4754,12 @@ msgstr "Curaプロファイルライター" #: CuraPrintProfileCreator/plugin.json msgctxt "description" msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." -msgstr "" +msgstr "材料メーカーがドロップインUIを使用して新しい材料と品質のプロファイルを作成できるようにします。" #: CuraPrintProfileCreator/plugin.json msgctxt "name" msgid "Print Profile Assistant" -msgstr "" +msgstr "プリントプロファイルアシスタント" #: 3MFWriter/plugin.json msgctxt "description" diff --git a/resources/i18n/ja_JP/fdmprinter.def.json.po b/resources/i18n/ja_JP/fdmprinter.def.json.po index d35db7f4fd..ca796d5a56 100644 --- a/resources/i18n/ja_JP/fdmprinter.def.json.po +++ b/resources/i18n/ja_JP/fdmprinter.def.json.po @@ -62,9 +62,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"Gcodeのコマンドは −で始まり\n" -"で区切られます。" +msgstr "Gcodeのコマンドは −で始まり\nで区切られます。" #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -77,9 +75,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"Gcodeのコマンドは −で始まり\n" -"で区切られます。" +msgstr "Gcodeのコマンドは −で始まり\nで区切られます。" #: fdmprinter.def.json msgctxt "material_guid label" @@ -384,12 +380,12 @@ msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_firmware_retract label" msgid "Firmware Retraction" -msgstr "" +msgstr "ファームウェア引き戻し" #: fdmprinter.def.json msgctxt "machine_firmware_retract description" msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." -msgstr "" +msgstr "材料を引き戻すためにG1コマンドのEプロパティーを使用する代わりにファームウェア引き戻しコマンド (G10/G11) を使用するかどうか。" # msgstr "Repetier" #: fdmprinter.def.json @@ -1101,12 +1097,12 @@ msgstr "全対象" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps label" msgid "Filter Out Tiny Gaps" -msgstr "" +msgstr "小さなギャップのフィルターアウト" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps description" msgid "Filter out tiny gaps to reduce blobs on outside of model." -msgstr "" +msgstr "モデル外部の塊を減らすために小さなギャップをフィルターアウトします。" #: fdmprinter.def.json msgctxt "fill_outline_gaps label" @@ -1179,9 +1175,7 @@ msgstr "ZシームX" #: 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 "" -"レイヤー内の各印刷を開始するX座\n" -"標の位置。" +msgstr "レイヤー内の各印刷を開始するX座\n標の位置。" #: fdmprinter.def.json msgctxt "z_seam_y label" @@ -1523,7 +1517,7 @@ msgstr "インフィルXオフセット" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is moved this distance along the X axis." -msgstr "" +msgstr "インフィルパターンはX軸に沿ってこの距離を移動します。" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1533,7 +1527,7 @@ msgstr "インフィルYオフセット" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is moved this distance along the Y axis." -msgstr "" +msgstr "インフィルパターンはY軸に沿ってこの距離を移動します。" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1553,7 +1547,7 @@ msgstr "インフィル公差量" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "インフィルと壁のオーバーラップ量 (インフィルライン幅に対する%)。少しのオーバーラップによって壁がインフィルにしっかりつながります。" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1574,7 +1568,7 @@ msgstr "表面公差量" #: fdmprinter.def.json msgctxt "skin_overlap description" msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." -msgstr "" +msgstr "スキンと壁のオーバーラップ量 (スキンライン幅に対する%)。少しのオーバーラップによって壁がスキンにしっかりつながります。これは、スキンライン幅の平均ライン幅と最内壁の%です。" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1636,9 +1630,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 "" -"壁より前にインフィルをプリントします はじめに壁をプリントするとより精密な壁になりますが、オーバーハングのプリントは悪化します\n" -"はじめにインフィルをプリントすると丈夫な壁になりますが、インフィルの模様が時折表面から透けて表れます" +msgstr "壁より前にインフィルをプリントします はじめに壁をプリントするとより精密な壁になりますが、オーバーハングのプリントは悪化します\nはじめにインフィルをプリントすると丈夫な壁になりますが、インフィルの模様が時折表面から透けて表れます" #: fdmprinter.def.json msgctxt "min_infill_area label" @@ -1813,7 +1805,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 temperature will not be adjusted." -msgstr "" +msgstr "加熱式ビルドプレート温度。これが 0 の場合、ベッド温度は調整されません。" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3644,9 +3636,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 "" -"スカートと印刷の最初の層の間の水平距離。\n" -"これは最小距離です。複数のスカートラインがこの距離から外側に展開されます。" +msgstr "スカートと印刷の最初の層の間の水平距離。\nこれは最小距離です。複数のスカートラインがこの距離から外側に展開されます。" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4414,82 +4404,82 @@ msgstr "実験的" #: fdmprinter.def.json msgctxt "support_tree_enable label" msgid "Tree Support" -msgstr "" +msgstr "ツリーサポート" #: fdmprinter.def.json msgctxt "support_tree_enable description" msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." -msgstr "" +msgstr "プリントを支えるために枝のついた木のようなサポートを生成します。材料とプリント時間が減る可能性がありますが、スライス時間が大きく増加します。" #: fdmprinter.def.json msgctxt "support_tree_angle label" msgid "Tree Support Branch Angle" -msgstr "" +msgstr "ツリーサポート枝角度" #: fdmprinter.def.json msgctxt "support_tree_angle description" msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." -msgstr "" +msgstr "枝の角度。枝を垂直で安定したものにするためには小さい角度を使用します。高さを得るためには大きい角度を使用します。" #: fdmprinter.def.json msgctxt "support_tree_branch_distance label" msgid "Tree Support Branch Distance" -msgstr "" +msgstr "ツリーサポート枝間隔" #: fdmprinter.def.json msgctxt "support_tree_branch_distance description" msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." -msgstr "" +msgstr "枝がモデルに接触するところで確保する枝の間隔。この間隔を小さくするとツリーサポートがモデルに接触する点が増え、支える効果が高まりますが、サポートの取り外しが難しくなります。" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter label" msgid "Tree Support Branch Diameter" -msgstr "" +msgstr "ツリーサポート枝直径" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter description" msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." -msgstr "" +msgstr "ツリーサポートの最も細い枝の直径。枝は太いほど丈夫です。基部に近いところでは、枝はこれよりも太くなります。" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle label" msgid "Tree Support Branch Diameter Angle" -msgstr "" +msgstr "ツリーサポート枝直径角度" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle description" msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." -msgstr "" +msgstr "基部に向かって徐々に太くなる枝の直径の角度。角度が0の場合、枝の太さは全長にわたって同じになります。少し角度を付けると、ツリーサポートの安定性が高まります。" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution label" msgid "Tree Support Collision Resolution" -msgstr "" +msgstr "ツリーサポート衝突精細度" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution description" msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." -msgstr "" +msgstr "モデルに干渉しないようにする衝突計算の精細度。小さい値を設定すると、失敗の少ない正確なツリーが生成されますが、スライス時間は大きく増加します。" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness label" msgid "Tree Support Wall Thickness" -msgstr "" +msgstr "ツリーサポート壁厚" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness description" msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "ツリーサポートの枝の壁の厚さ。壁が厚いほどプリント時間が長くなりますが、崩れにくくなります。" #: fdmprinter.def.json msgctxt "support_tree_wall_count label" msgid "Tree Support Wall Line Count" -msgstr "" +msgstr "ツリーサポートウォールライン数" #: fdmprinter.def.json msgctxt "support_tree_wall_count description" msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "ツリーサポートの枝の壁の数。壁が厚いほどプリント時間が長くなりますが、崩れにくくなります。" #: fdmprinter.def.json msgctxt "slicing_tolerance label" @@ -4570,12 +4560,12 @@ msgstr "トップ表面層に縦かジグザグパターンを利用する時に #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization label" msgid "Infill Travel Optimization" -msgstr "" +msgstr "インフィル移動最適化" #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization description" msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." -msgstr "" +msgstr "有効化すると、移動距離が減少するようにインフィルラインをプリントする順序が最適化されます。移動時間の削減は、スライスするモデル、インフィルパターン、密度などに大きく依存します。特に、インフィルを行う小さなエリアが多数あるモデルの場合、モデルをスライスする時間が大きく増えることがあります。" #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" @@ -5219,42 +5209,42 @@ msgstr "ノズルと水平方向に下向きの線間の距離。大きな隙間 #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled label" msgid "Use adaptive layers" -msgstr "" +msgstr "適応レイヤーの使用" #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled description" msgid "Adaptive layers computes the layer heights depending on the shape of the model." -msgstr "" +msgstr "適応レイヤーは、レイヤーの高さをモデルの形状に合わせて計算します。" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation label" msgid "Adaptive layers maximum variation" -msgstr "" +msgstr "適応レイヤー最大差分" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height in mm." -msgstr "" +msgstr "基準レイヤー高さと比較して許容される最大の高さ (mm)。" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" msgid "Adaptive layers variation step size" -msgstr "" +msgstr "適応レイヤー差分ステップサイズ" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step description" msgid "The difference in height of the next layer height compared to the previous one." -msgstr "" +msgstr "次のレイヤーの高さを前のレイヤーの高さと比べた差。" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold label" msgid "Adaptive layers threshold" -msgstr "" +msgstr "適応レイヤー閾値" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold description" msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." -msgstr "" +msgstr "小さいレイヤーを使用するかどうかの閾値。この値が、レイヤー中の最も急な斜面のタンジェントと比較されます。" #: fdmprinter.def.json msgctxt "command_line_settings label" diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index 851c59526b..906a6c2ba3 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -189,7 +189,7 @@ msgstr "프린터 펌웨어" #: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Prepare" -msgstr "" +msgstr "준비" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -562,7 +562,7 @@ msgstr "브라우저에서 인쇄 작업 인터페이스를 엽니다." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 msgctxt "@label Printer name" msgid "Unknown" -msgstr "" +msgstr "알 수 없음" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, fuzzy, python-brace-format @@ -597,7 +597,7 @@ msgstr "네트워크를 통해 연결" #: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Monitor" -msgstr "" +msgstr "모니터" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format @@ -624,7 +624,7 @@ msgstr "업데이트 정보에 액세스 할 수 없습니다." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." -msgstr "" +msgstr "파일을 여는 도중 SolidWorks가 오류 보고. SolidWorks 자체에서 이 문제를 해결하도록 권장합니다." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 msgctxt "@info:status" @@ -632,7 +632,7 @@ msgid "" "Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" "\n" " Thanks!." -msgstr "" +msgstr "도면에 모델이 없습니다. 내용을 다시 확인하시고 내부에 하나의 부품이나 조립만 있는지 확인하시겠습니까?\n\n 감사합니다!." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 msgctxt "@info:status" @@ -640,7 +640,7 @@ msgid "" "Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" "\n" "Sorry!" -msgstr "" +msgstr "도면에 하나 이상의 부품 또는 조립이 있습니다. 저희는 현재 정확하게 하나의 부품 또는 조립만 있는 도면을 지원합니다.\n\n죄송합니다!" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" @@ -655,7 +655,7 @@ msgstr "SolidWorks 어셈블리 파일" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 msgctxt "@item:inlistbox" msgid "SolidWorks drawing file" -msgstr "" +msgstr "SolidWorks 도면 파일" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 msgctxt "@info:status" @@ -665,7 +665,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "안녕하십니까,\n귀하의 시스템에 유효한 SolidWorks를 찾을 수 없습니다. 이는 곧 SolidWorks가 설치되어 있지 않거나 유효한 라이센스가 없음을 의미합니다. SolidWorks가 문제없이 실행될 수 있도록 해주시고 그리고/또는 귀사의 ICT에 연락해 주십시오.\n\n감사합니다.\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 msgctxt "@info:status" @@ -675,7 +675,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "안녕하십니까,\n귀하는 현재 Windows가 아닌 다른 운영 시스템에서 이 플러그인을 실행 중입니다. 이 플러그인은 유효한 라이센스가 있는 SolidWorks가 설치된 Windows에서만 사용 가능합니다. 이 플러그인을 SolidWorks가 설치된 Windows 컴퓨터에 설치하십시오.\n\n감사합니다\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" @@ -683,7 +683,7 @@ msgstr "구성" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 msgid "Installation guide for SolidWorks macro" -msgstr "" +msgstr "SolidWorks 매크로 설치 가이드" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" @@ -707,7 +707,7 @@ msgstr "G 코드 수정" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" msgid "Cura collects anonymized usage statistics." -msgstr "" +msgstr "Cura는 익명의 사용 통계를 수집합니다." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -717,22 +717,22 @@ msgstr "데이터 수집" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Allow" -msgstr "" +msgstr "허용" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." -msgstr "" +msgstr "Cura가 익명의 사용 통계를 보내 Cura에 대한 향후 개선을 우선화하는 데 도움을 줍니다. Cura 버전과 슬라이싱하는 모델의 해쉬 등 일부 선호사항과 설정이 발송됩니다." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 msgctxt "@action:button" msgid "Disable" -msgstr "" +msgstr "사용 안함" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:tooltip" msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." -msgstr "" +msgstr "Cura가 익명의 사용 통계를 보내지 않게 합니다. 환경 설정에서 다시 사용할 수 있습니다." #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -742,14 +742,14 @@ msgstr "Cura 15.04 프로필" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 msgctxt "@item:inlistbox" msgid "Blender file" -msgstr "" +msgstr "Blender 파일" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 msgctxt "@info:status" msgid "" "Could not export using \"{}\" quality!\n" "Felt back to \"{}\"." -msgstr "" +msgstr "\"{}\" 품질을 사용하여 내보낼 수 없습니다!\n \"{}\"(으)로 돌아갑니다." #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 @@ -936,12 +936,12 @@ msgstr "Cura 프로필" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 msgctxt "@item:inmenu" msgid "Profile Assistant" -msgstr "" +msgstr "프로필 어시스턴트" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 msgctxt "@item:inlistbox" msgid "Profile Assistant" -msgstr "" +msgstr "프로필 어시스턴트" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" @@ -1139,13 +1139,13 @@ msgstr "?에서 프로필을 가져 오지 못했습니다" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "This profile {0} contains incorrect data, could not import it." -msgstr "" +msgstr "이 프로필 {0}에는 정확하지 않은 데이터가 포함되어 있으므로, 불러올 수 없습니다." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." -msgstr "" +msgstr "프로필 {0}에 정의된 기계가 현재 기계와 일치하지 않으므로, 불러올 수 없습니다." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format @@ -1157,7 +1157,7 @@ msgstr "프로필 {0}을 (를) 성공적으로 가져 왔습니다." #, python-brace-format msgctxt "@info:status" msgid "File {0} does not contain any valid profile." -msgstr "" +msgstr "파일 {0}에 유효한 프로필이 포함되어 있지 않습니다." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format @@ -1185,7 +1185,7 @@ msgstr "현재 구성에 대해 품질 유형 {0}을 (를) 찾을 수 없습니 #, python-brace-format msgctxt "@label" msgid "Group #{group_nr}" -msgstr "" +msgstr "그룹 #{group_nr}" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" @@ -1244,7 +1244,7 @@ msgid "" "

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

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

    치명적인 오류가 발생했습니다. 문제를 해결할 수 있도록 이 충돌 보고서를 보내주십시오

    \n

    \"보고서 전송\" 버튼을 사용하면 버그 보고서가 서버에 자동으로 게시됩니다

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" @@ -1259,32 +1259,32 @@ msgstr "알 수 없음" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 msgctxt "@label Cura version number" msgid "Cura version" -msgstr "" +msgstr "Cura 버전" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 msgctxt "@label Type of platform" msgid "Platform" -msgstr "" +msgstr "플랫폼" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 msgctxt "@label" msgid "Qt version" -msgstr "" +msgstr "Qt 버전" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 msgctxt "@label" msgid "PyQt version" -msgstr "" +msgstr "PyQt 버전" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 msgctxt "@label OpenGL version" msgid "OpenGL" -msgstr "" +msgstr "OpenGL" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 msgctxt "@label" msgid "not yet initialised
    " -msgstr "" +msgstr "아직 초기화되지 않음
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format @@ -1307,7 +1307,7 @@ msgstr "
  • OpenGL Renderer: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" msgid "Error traceback" -msgstr "" +msgstr "오류 추적" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" @@ -1518,7 +1518,7 @@ msgstr "노즐 크기" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 msgctxt "@label" msgid "Compatible material diameter" -msgstr "" +msgstr "호환이 되는 재료 직경" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 msgctxt "@tooltip" @@ -1620,10 +1620,7 @@ 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 "" -":네트워크를 통해 프린터로 직접 인쇄하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n" -"\n" -"아래 목록에서 프린터를 선택하십시오" +msgstr ":네트워크를 통해 프린터로 직접 인쇄하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n\n아래 목록에서 프린터를 선택하십시오" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1663,12 +1660,12 @@ msgstr "유형" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "" +msgstr "Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "" +msgstr "Ultimaker 3 Extended" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1735,7 +1732,7 @@ msgstr "?은 연결된 Ultimaker 3에 연결된 프린터 그룹을 호스트하 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 msgctxt "@label link to connect manager" msgid "Add/Remove printers" -msgstr "" +msgstr "프린터 추가/제거" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" @@ -1775,7 +1772,7 @@ msgstr "프린터와의 연결이 끊어졌습니다" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 msgctxt "@label Printer status" msgid "Unknown" -msgstr "" +msgstr "알 수 없음" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" @@ -1871,164 +1868,164 @@ msgstr "구성 활성화" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" msgid "SolidWorks: Export wizard" -msgstr "" +msgstr "SolidWorks: 내보내기 마법사" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" msgid "Quality:" -msgstr "" +msgstr "품질:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (3D-printing)" -msgstr "" +msgstr "고품질 (3D-프린팅)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (3D-printing)" -msgstr "" +msgstr "저품질 (3D-프린팅)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (SolidWorks)" -msgstr "" +msgstr "고품질 (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (SolidWorks)" -msgstr "" +msgstr "저품질 (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" msgid "Show this dialog again" -msgstr "" +msgstr "이 대화창을 다시 표시" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 msgctxt "@action:button" msgid "Continue" -msgstr "" +msgstr "계속" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 msgctxt "@action:button" msgid "Abort" -msgstr "" +msgstr "중단" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 msgctxt "@title:window" msgid "How to install Cura SolidWorks macro" -msgstr "" +msgstr "Cura SolidWorks 매크로 설치 방법" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 msgctxt "@description:label" msgid "Steps:" -msgstr "" +msgstr "단계:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 msgctxt "@action:button" msgid "" "Open the directory\n" "with macro and icon" -msgstr "" +msgstr "매크로와 아이콘으로\n디렉토리 열기" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 msgctxt "@description:label" msgid "Instructions:" -msgstr "" +msgstr "안내:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 msgctxt "@action:playpause" msgid "Play" -msgstr "" +msgstr "재생" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 msgctxt "@action:playpause" msgid "Pause" -msgstr "" +msgstr "중지" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 msgctxt "@action:button" msgid "Previous Step" -msgstr "" +msgstr "이전 단계" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 msgctxt "@action:button" msgid "Done" -msgstr "" +msgstr "완료" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 msgctxt "@action:button" msgid "Next Step" -msgstr "" +msgstr "다음 단계" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 msgctxt "@title:window" msgid "SolidWorks plugin: Configuration" -msgstr "" +msgstr "SolidWorks 플러그인: 구성" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 msgctxt "@title:tab" msgid "Conversion settings" -msgstr "" +msgstr "변환 설정" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 msgctxt "@label" msgid "First choice:" -msgstr "" +msgstr "첫 번째 선택:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 msgctxt "@text:menu" msgid "Latest installed version (Recommended)" -msgstr "" +msgstr "가장 최근 설치 버전(권장)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 msgctxt "@text:menu" msgid "Default version" -msgstr "" +msgstr "기본 버전" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 msgctxt "@label" msgid "Show wizard before opening SolidWorks files" -msgstr "" +msgstr "SolidWorks 파일을 열기 전 마법사 표시" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 msgctxt "@label" msgid "Automatically rotate opened file into normed orientation" -msgstr "" +msgstr "열린 파일을 규정된 방향으로 자동 회전" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 msgctxt "@title:tab" msgid "Installation(s)" -msgstr "" +msgstr "설치" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 msgctxt "@label" msgid "COM service found" -msgstr "" +msgstr "COM 서비스 발견" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 msgctxt "@label" msgid "Executable found" -msgstr "" +msgstr "실행가능 발견" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 msgctxt "@label" msgid "COM starting" -msgstr "" +msgstr "COM 시작" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 msgctxt "@label" msgid "Revision number" -msgstr "" +msgstr "수정 번호" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 msgctxt "@label" msgid "Functions available" -msgstr "" +msgstr "사용 가능한 기능" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 @@ -2214,32 +2211,32 @@ msgstr "부드럽게하기" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 msgctxt "@label" msgid "Mesh Type" -msgstr "" +msgstr "메쉬 유형" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 msgctxt "@label" msgid "Normal model" -msgstr "" +msgstr "일반 모델" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 msgctxt "@label" msgid "Print as support" -msgstr "" +msgstr "서포터로 프린팅" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 msgctxt "@label" msgid "Don't support overlap with other models" -msgstr "" +msgstr "다른 모델과 오버랩되도록 지지하지 않음" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 msgctxt "@label" msgid "Modify settings for overlap with other models" -msgstr "" +msgstr "다른 모델과의 오버랩에 대한 설정 수정" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 msgctxt "@label" msgid "Modify settings for infill of other models" -msgstr "" +msgstr "다른 모델의 충진재에 대한 설정 수정" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" @@ -2425,10 +2422,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"이 플러그인에는 라이선스가 포함되어 있습니다.\n" -"이 플러그인을 설치하려면 이 라이선스를 수락해야 합니다.\n" -"아래의 약관에 동의하시겠습니까?" +msgstr "이 플러그인에는 라이선스가 포함되어 있습니다.\n이 플러그인을 설치하려면 이 라이선스를 수락해야 합니다.\n아래의 약관에 동의하시겠습니까?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2693,9 +2687,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"일부 프로필 설정을 사용자 지정했습니다.\n" -"이러한 설정을 유지하거나 삭제 하시겠습니까?" +msgstr "일부 프로필 설정을 사용자 지정했습니다.\n이러한 설정을 유지하거나 삭제 하시겠습니까?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3099,27 +3091,27 @@ msgstr "인쇄 (익명) 인쇄 정보" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 msgctxt "@label" msgid "Experimental" -msgstr "" +msgstr "실험적" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 msgctxt "@info:tooltip" msgid "Use multi build plate functionality" -msgstr "" +msgstr "다수의 빌드 플레이트를 기능적으로 사용하기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 msgctxt "@option:check" msgid "Use multi build plate functionality (restart required)" -msgstr "" +msgstr "다수의 빌드 플레이트 기능성 사용(다시 시작해야 합니다)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 msgctxt "@info:tooltip" msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" -msgstr "" +msgstr "새롭게 로드한 모델을 빌드 플레이트에 정렬해야 합니까? 다수의 빌드 플레이트와 연계하여 사용(실험 중)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 msgctxt "@option:check" msgid "Do not arrange objects on load" -msgstr "" +msgstr "로드 중인 대상물을 정렬하지 마십시오" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 @@ -3363,9 +3355,7 @@ 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는 커뮤니티와 공동으로 Ultimaker B.V.에 의해 개발되었습니다\n" -"Cura는 다음 오픈 소스 프로젝트를 자랑스럽게 사용합니다" +msgstr "Cura는 커뮤니티와 공동으로 Ultimaker B.V.에 의해 개발되었습니다\nCura는 다음 오픈 소스 프로젝트를 자랑스럽게 사용합니다" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3473,10 +3463,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"일부 설정 / 대체 값은 프로파일에 저장된 값과 다릅니다.\n" -"\n" -"프로파일 매니저를 열려면 클릭하십시오." +msgstr "일부 설정 / 대체 값은 프로파일에 저장된 값과 다릅니다.\n\n프로파일 매니저를 열려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" @@ -3514,10 +3501,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"일부 숨겨진 설정은 정상 계산 값과 다른 값을 사용합니다.\n" -"\n" -"이 설정을 표시하려면 클릭하십시오." +msgstr "일부 숨겨진 설정은 정상 계산 값과 다른 값을 사용합니다.\n\n이 설정을 표시하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3532,7 +3516,7 @@ msgstr "영향을 받다" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." -msgstr "" +msgstr "이 설정은 항상 모든 압출기 사이에 공유됩니다. 여기서 변경하면 모든 압출기에 대한 값이 변경됩니다." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" @@ -3545,10 +3529,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"이 설정에는 프로필과 다른 값이 있습니다.\n" -"\n" -"프로필 값을 복원하려면 클릭하십시오." +msgstr "이 설정에는 프로필과 다른 값이 있습니다.\n\n프로필 값을 복원하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" @@ -3556,10 +3537,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"이 설정은 일반적으로 계산되지만 현재는 절대 값이 설정되어 있습니다.\n" -"\n" -"계산 된 값을 복원하려면 클릭하십시오." +msgstr "이 설정은 일반적으로 계산되지만 현재는 절대 값이 설정되어 있습니다.\n\n계산 된 값을 복원하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" @@ -3571,9 +3549,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"인쇄 설정 사용 안 함\n" -"G 코드 파일은 수정할 수 없습니다" +msgstr "인쇄 설정 사용 안 함\nG 코드 파일은 수정할 수 없습니다" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" @@ -3583,7 +3559,7 @@ msgstr "00h 00min" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" msgid "Time specification" -msgstr "" +msgstr "시간 사양" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" @@ -3620,16 +3596,12 @@ msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." -msgstr "" -"권장 인쇄 설정\n" -"선택한 프린터, 재질 및 품질에 대한 권장 설정으로 인쇄하십시오." +msgstr "권장 인쇄 설정\n선택한 프린터, 재질 및 품질에 대한 권장 설정으로 인쇄하십시오." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." -msgstr "" -"사용자 정의 인쇄 설정\n" -"마지막 스플 라이스 프로세스의 모든 비트를 미세하게 제어하여 인쇄하십시오." +msgstr "사용자 정의 인쇄 설정\n마지막 스플 라이스 프로세스의 모든 비트를 미세하게 제어하여 인쇄하십시오." #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" @@ -3644,12 +3616,12 @@ msgstr "조망" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 msgctxt "@action:inmenu menubar:view" msgid "&Camera position" -msgstr "" +msgstr "카메라 위치(&C)" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "" +msgstr "빌드 플레이트(&B)" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" @@ -3819,27 +3791,27 @@ msgstr "그만두다" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" msgid "&3D View" -msgstr "" +msgstr "3D 보기(&3)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:view" msgid "&Front View" -msgstr "" +msgstr "앞에서 보기(&F)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 msgctxt "@action:inmenu menubar:view" msgid "&Top View" -msgstr "" +msgstr "위에서 보기(&T)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 msgctxt "@action:inmenu menubar:view" msgid "&Left Side View" -msgstr "" +msgstr "왼쪽에서 보기(&L)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:view" msgid "&Right Side View" -msgstr "" +msgstr "오른쪽에서 보기(&R)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" @@ -3965,7 +3937,7 @@ msgstr "모든 모델 새로고치" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "" +msgstr "모든 모델을 모든 빌드 플레이트에 정렬" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" @@ -4025,7 +3997,7 @@ msgstr "설치된 플러그인 ..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 msgctxt "@action:inmenu menubar:view" msgid "Expand/Collapse Sidebar" -msgstr "" +msgstr "사이드바 확장/축소" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" @@ -4060,12 +4032,12 @@ msgstr "슬라이스 사용 불가" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Slice current printjob" -msgstr "" +msgstr "현재 출력물 슬라이스" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Cancel slicing process" -msgstr "" +msgstr "슬라이싱 프로세스 취소" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" @@ -4121,7 +4093,7 @@ msgstr "다른 이름으로 저장..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" msgid "Save &Project..." -msgstr "" +msgstr "프로젝트 저장(&P)..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" @@ -4313,9 +4285,7 @@ msgstr "테두리 또는 raft 인쇄를 사용합니다. 이렇게하면 개체 #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" -msgstr "" -"인쇄물 개선에 도움이 필요하십니까?\n" -"Ultimaker 문제 해결 가이드 읽기" +msgstr "인쇄물 개선에 도움이 필요하십니까?\nUltimaker 문제 해결 가이드 읽기" #: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 msgctxt "@label %1 is filled in with the name of an extruder" @@ -4362,7 +4332,7 @@ msgstr "자재" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "호환성 확인" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" @@ -4372,17 +4342,17 @@ msgstr "Ultimaker.com의 재질 호환성을 확인하려면 클릭하십시오. #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 msgctxt "@option:check" msgid "See only current build plate" -msgstr "" +msgstr "현재의 빌드 플레이트만 보기" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 msgctxt "@action:button" msgid "Arrange to all build plates" -msgstr "" +msgstr "모든 빌드 플레이트 정렬" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 msgctxt "@action:button" msgid "Arrange current build plate" -msgstr "" +msgstr "현재의 빌드 플레이트 정렬" #: MachineSettingsAction/plugin.json msgctxt "description" @@ -4477,22 +4447,22 @@ msgstr "USB 인쇄" #: PrepareStage/plugin.json msgctxt "description" msgid "Provides a prepare stage in Cura." -msgstr "" +msgstr "Cura에서 준비 단계 제공." #: PrepareStage/plugin.json msgctxt "name" msgid "Prepare Stage" -msgstr "" +msgstr "준비 단계" #: CuraLiveScriptingPlugin/plugin.json msgctxt "description" msgid "Provides an edit window for direct script editing." -msgstr "" +msgstr "직접 스크립트 편집을 위한 편집창 제공." #: CuraLiveScriptingPlugin/plugin.json msgctxt "name" msgid "Live scripting tool" -msgstr "" +msgstr "라이브 스크립팅 도구" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" @@ -4517,12 +4487,12 @@ msgstr "UM3 네트워크 연결" #: MonitorStage/plugin.json msgctxt "description" msgid "Provides a monitor stage in Cura." -msgstr "" +msgstr "Cura에서 모니터 단계 제공." #: MonitorStage/plugin.json msgctxt "name" msgid "Monitor Stage" -msgstr "" +msgstr "모니터 단계" #: FirmwareUpdateChecker/plugin.json msgctxt "description" @@ -4537,7 +4507,7 @@ msgstr "펌웨어 업데이트 검사기" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." -msgstr "" +msgstr "SolidWorks를 사용하여 특정 파일을 열 수 있는 가능성을 제공합니다. 이 플러그인과 추가 최적화로 변환을 수행합니다." #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4607,12 +4577,12 @@ msgstr "레거시 Cura 프로필 리더" #: CuraBlenderPlugin/plugin.json msgctxt "description" msgid "Helps to open Blender files directly in Cura." -msgstr "" +msgstr "Cura에서 직접 Blender 파일을 열도록 도와줍니다." #: CuraBlenderPlugin/plugin.json msgctxt "name" msgid "Blender Integration (experimental)" -msgstr "" +msgstr "Blender 통합(실험 중)" #: GCodeProfileReader/plugin.json msgctxt "description" @@ -4777,12 +4747,12 @@ msgstr "Cura 프로필 작성자" #: CuraPrintProfileCreator/plugin.json msgctxt "description" msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." -msgstr "" +msgstr "재료 제조사가 드롭 인 UI를 사용하여 새로운 재료와 품질 프로필을 만들 수 있게 합니다." #: CuraPrintProfileCreator/plugin.json msgctxt "name" msgid "Print Profile Assistant" -msgstr "" +msgstr "프린트 프로필 어시스턴트" #: 3MFWriter/plugin.json msgctxt "description" diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 6b504c74de..36637151ca 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -350,12 +350,12 @@ msgstr "반복기" #: fdmprinter.def.json msgctxt "machine_firmware_retract label" msgid "Firmware Retraction" -msgstr "" +msgstr "펌웨어 제거" #: fdmprinter.def.json msgctxt "machine_firmware_retract description" msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." -msgstr "" +msgstr "재료를 제거하는 G1 명령어에서 E 속성을 사용하는 대신 펌웨어 제거 명령어(G10/G11)를 사용할 지 여부." #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" @@ -1050,12 +1050,12 @@ msgstr "어디에나" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps label" msgid "Filter Out Tiny Gaps" -msgstr "" +msgstr "아주 작은 갭 필터 아웃" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps description" msgid "Filter out tiny gaps to reduce blobs on outside of model." -msgstr "" +msgstr "아주 작은 갭을 필터 아웃하여 모델 외부의 얼룩을 줄입니다." #: fdmprinter.def.json msgctxt "fill_outline_gaps label" @@ -1440,7 +1440,7 @@ msgstr "충진 X 오프셋" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is moved this distance along the X axis." -msgstr "" +msgstr "충진 패턴이 X축을 따라 이 거리만큼 이동합니다." #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1450,7 +1450,7 @@ msgstr "충진 Y 오프셋" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is moved this distance along the Y axis." -msgstr "" +msgstr "충진 패턴이 Y축을 따라 이 거리만큼 이동합니다." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1470,7 +1470,7 @@ msgstr "충진 오버랩 비율" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "충진 라인 폭의 비율인 충진재와 벽 사이의 오버랩 양 약간의 오버랩으로 벽이 충진재와 확실하게 체결됩니다." #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1490,7 +1490,7 @@ msgstr "피부 겹침 비율" #: fdmprinter.def.json msgctxt "skin_overlap description" msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." -msgstr "" +msgstr "스킨 라인 폭의 비율인 스킨과 벽 사이의 오버랩 양 약간의 오버랩으로 벽이 스킨과 확실하게 체결됩니다. 이것은 스킨 라인과 가장 안쪽 벽과의 평균 라인 폭의 비율입니다." #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1720,7 +1720,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 temperature will not be adjusted." -msgstr "" +msgstr "가열 된 빌드 플레이트에 사용되는 온도. 이것이 0이면, 베드 온도가 조정되지 않습니다." #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3502,9 +3502,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 "" -"프린트의 스커트와 첫 번째 레이어 사이의 수직 거리입니다.\n" -"이는 최소 거리입니다. 여러 개의 스커트 선이 이 거리에서 바깥쪽으로 연장됩니다." +msgstr "프린트의 스커트와 첫 번째 레이어 사이의 수직 거리입니다.\n이는 최소 거리입니다. 여러 개의 스커트 선이 이 거리에서 바깥쪽으로 연장됩니다." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4264,82 +4262,82 @@ msgstr "실험적인 " #: fdmprinter.def.json msgctxt "support_tree_enable label" msgid "Tree Support" -msgstr "" +msgstr "트리 지지물" #: fdmprinter.def.json msgctxt "support_tree_enable description" msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." -msgstr "" +msgstr "프린트물을 지지하는 가지가 달린 나무 모양의 지지물을 생성합니다. 이것이 재료 사용과 인쇄 시간을 줄여줄 수 있지만, 슬라이싱 시간이 상당히 늘어납니다." #: fdmprinter.def.json msgctxt "support_tree_angle label" msgid "Tree Support Branch Angle" -msgstr "" +msgstr "트리 지지물 브랜치 각도" #: fdmprinter.def.json msgctxt "support_tree_angle description" msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." -msgstr "" +msgstr "브랜치의 각도. 적은 각도를 사용하면 더 수직이 되어 더 안정됩니다. 높은 각도를 사용하면 더 많이 도달할 수 있습니다." #: fdmprinter.def.json msgctxt "support_tree_branch_distance label" msgid "Tree Support Branch Distance" -msgstr "" +msgstr "트리 지지물 브랜치 거리" #: fdmprinter.def.json msgctxt "support_tree_branch_distance description" msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." -msgstr "" +msgstr "모델에 접촉할 때 브랜치를 떨어뜨려야 하는 정도 이 거리를 짧게 하면 트리 지지물이 더 많은 접점에서 모델에 접촉하여, 오버행이 더 좋아지지만 지지물을 제거하기가 더 어렵게 됩니다." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter label" msgid "Tree Support Branch Diameter" -msgstr "" +msgstr "트리 지지물 브랜치 직경" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter description" msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." -msgstr "" +msgstr "트리 지지물의 가장 얇은 브랜치의 직경 브랜치가 두꺼울수록 더 견고해집니다. 베이스를 향한 브랜치는 이보다 더 두꺼워집니다." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle label" msgid "Tree Support Branch Diameter Angle" -msgstr "" +msgstr "트리 지지물 브랜치 직경 각도" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle description" msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." -msgstr "" +msgstr "하단을 향할수록 점점 더 두꺼워짐에 따른 브랜치의 직경 각도. 이 각도가 0이면 브랜치는 길이 전체에 균일한 두께를 갖게 됩니다. 약간의 각도가 있으면 트리 지지물의 안정성을 높여 줍니다." #: fdmprinter.def.json msgctxt "support_tree_collision_resolution label" msgid "Tree Support Collision Resolution" -msgstr "" +msgstr "트리 지지물 충돌 해결" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution description" msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." -msgstr "" +msgstr "모델에 부딪히는 것을 피하기 위해 충돌을 계산하는 해결책 이 값을 낮게 설정하면 실패도가 낮은 더 정확한 트리를 생성하지만, 슬라이싱 시간이 현격하게 늘어납니다." #: fdmprinter.def.json msgctxt "support_tree_wall_thickness label" msgid "Tree Support Wall Thickness" -msgstr "" +msgstr "트리 지지물 벽 두께" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness description" msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "트리 지지물의 브랜치 벽의 두께 벽이 두꺼울수록 인쇄 시간이 오래 걸리지만 쉽게 넘어지지 않습니다." #: fdmprinter.def.json msgctxt "support_tree_wall_count label" msgid "Tree Support Wall Line Count" -msgstr "" +msgstr "트리 지지물 벽 라인 카운트" #: fdmprinter.def.json msgctxt "support_tree_wall_count description" msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "트리 지지물의 브랜치 벽의 개수 벽이 두꺼울수록 인쇄 시간이 오래 걸리지만 쉽게 넘어지지 않습니다." #: fdmprinter.def.json msgctxt "slicing_tolerance label" @@ -4414,12 +4412,12 @@ msgstr "상단 표면 스킨 층이 선 또는 지그재그 패턴을 사용할 #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization label" msgid "Infill Travel Optimization" -msgstr "" +msgstr "충진재 이동 최적화" #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization description" msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." -msgstr "" +msgstr "가능하면, 충진 라인 인쇄 순서가 최적화되어 이동 거리를 줄입니다. 이동 시간의 감소는 슬라이스되는 모델, 충진 패턴, 밀도 등에 따라 달라집니다. 작은 충진 영역이 많은 일부 모델의 경우, 모델을 슬라이스하는 시간이 상당히 늘어납니다." #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" @@ -5051,42 +5049,42 @@ msgstr "노즐과 수평 아래쪽 라인 사이의 거리. 클리어런스가 #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled label" msgid "Use adaptive layers" -msgstr "" +msgstr "어댑티브 레이어 사용" #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled description" msgid "Adaptive layers computes the layer heights depending on the shape of the model." -msgstr "" +msgstr "어댑티브 레이어는 모델의 모양에 따라 레이어의 높이를 계산합니다." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation label" msgid "Adaptive layers maximum variation" -msgstr "" +msgstr "어댑티브 레이어 최대 변화" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height in mm." -msgstr "" +msgstr "기본 레이어 높이와 다른 최대 허용 높이 (mm)." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" msgid "Adaptive layers variation step size" -msgstr "" +msgstr "어댑티브 레이어 변화 단계 크기" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step description" msgid "The difference in height of the next layer height compared to the previous one." -msgstr "" +msgstr "이전 높이와 비교되는 다음 레이어 높이의 차이." #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold label" msgid "Adaptive layers threshold" -msgstr "" +msgstr "어댑티브 레이어 임계 값" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold description" msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." -msgstr "" +msgstr "더 작은 레이어를 사용할지 여부에 대한 임계 값 이 숫자는 레이어의 가장 급한 경사의 탄젠트와 비교됩니다." #: fdmprinter.def.json msgctxt "command_line_settings label" diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index 0c2d0236bc..001b2a264f 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -187,7 +187,7 @@ msgstr "Firmware van uw printer" #: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Prepare" -msgstr "" +msgstr "Voorbereiden" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -560,7 +560,7 @@ msgstr "Opent de printtaken-interface in uw browser." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 msgctxt "@label Printer name" msgid "Unknown" -msgstr "" +msgstr "Onbekend" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format @@ -595,7 +595,7 @@ msgstr "Verbinding Maken via Netwerk" #: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Monitor" -msgstr "" +msgstr "Controleren" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format @@ -622,7 +622,7 @@ msgstr "Geen toegang tot update-informatie." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." -msgstr "" +msgstr "SolidWorks heeft fouten gerapporteerd tijdens het openen van uw bestand. Het wordt aanbevolen deze problemen binnen SolidWorks zelf op te lossen." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 msgctxt "@info:status" @@ -630,7 +630,7 @@ msgid "" "Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" "\n" " Thanks!." -msgstr "" +msgstr "In uw tekening zijn geen modellen gevonden. Controleer de inhoud en zorg ervoor dat zich in de tekening een onderdeel of assemblage bevindt.\n\n Hartelijk dank." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 msgctxt "@info:status" @@ -638,7 +638,7 @@ msgid "" "Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" "\n" "Sorry!" -msgstr "" +msgstr "In uw tekening is meer dan één onderdeel of assemblage gevonden. Momenteel worden alleen tekeningen met precies één onderdeel of assemblage ondersteund.\n\nSorry." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" @@ -653,7 +653,7 @@ msgstr "Montagebestand SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 msgctxt "@item:inlistbox" msgid "SolidWorks drawing file" -msgstr "" +msgstr "Tekenbestand SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 msgctxt "@info:status" @@ -663,7 +663,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Beste klant,\nOp uw systeem is geen geldige installatie van SolidWorks aangetroffen. Dit betekent dat SolidWorks niet is geïnstalleerd of dat u niet over een geldige licentie beschikt. Controleer of SolidWorks zelf zonder problemen kan worden uitgevoerd en/of neem contact op met uw IT-afdeling.\n\nMet vriendelijke groeten\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 msgctxt "@info:status" @@ -673,7 +673,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Beste klant,\nMomenteel voert u deze invoegtoepassing uit op een ander besturingssysteem dan Windows. Deze invoegtoepassing werkt alleen op systemen waarop Windows en SolidWorks met een geldige licentie zijn geïnstalleerd. Installeer deze invoegtoepassing op een Windows-systeem waarop SolidWorks is geïnstalleerd.\n\nMet vriendelijke groeten\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" @@ -681,7 +681,7 @@ msgstr "Configureren" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 msgid "Installation guide for SolidWorks macro" -msgstr "" +msgstr "Installatiegids voor SolidWorks-macro" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" @@ -705,7 +705,7 @@ msgstr "G-code wijzigen" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" msgid "Cura collects anonymized usage statistics." -msgstr "" +msgstr "Cura verzamelt geanonimiseerde gebruiksstatistieken." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -715,22 +715,22 @@ msgstr "Gegevens verzamelen" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Allow" -msgstr "" +msgstr "Toestaan" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." -msgstr "" +msgstr "Cura toestaan geanonimiseerde gebruiksstatistieken te verzenden om toekomstige verbeteringen aan Cura te helpen prioriteren. Onder de verzonden gegevens bevindt zich informatie over uw voorkeuren en instellingen, de Cura-versie en een selectie van de modellen die u slicet." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 msgctxt "@action:button" msgid "Disable" -msgstr "" +msgstr "Uitschakelen" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:tooltip" msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." -msgstr "" +msgstr "Cura niet toestaan geanonimiseerde gebruiksgegevens te verzenden. U kunt deze optie op een later tijdstip weer inschakelen in de voorkeuren." #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -740,14 +740,14 @@ msgstr "Cura 15.04-profielen" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 msgctxt "@item:inlistbox" msgid "Blender file" -msgstr "" +msgstr "Blender-bestand" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 msgctxt "@info:status" msgid "" "Could not export using \"{}\" quality!\n" "Felt back to \"{}\"." -msgstr "" +msgstr "Kan niet exporteren met de kwaliteit \"{}\"!\nInstelling teruggezet naar \"{}\"." #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 @@ -934,12 +934,12 @@ msgstr "Cura-profiel" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 msgctxt "@item:inmenu" msgid "Profile Assistant" -msgstr "" +msgstr "Profielassistent" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 msgctxt "@item:inlistbox" msgid "Profile Assistant" -msgstr "" +msgstr "Profielassistent" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" @@ -1137,13 +1137,13 @@ msgstr "Kan het profiel niet importeren uit {0}: { #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "This profile {0} contains incorrect data, could not import it." -msgstr "" +msgstr "Dit profiel {0} bevat incorrecte gegevens. Kan het profiel niet importeren." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." -msgstr "" +msgstr "De machine die is vastgelegd in het profiel {0} komt niet overeen met uw huidige machine. Kan het profiel niet importeren." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format @@ -1155,7 +1155,7 @@ msgstr "Het profiel {0} is geïmporteerd" #, python-brace-format msgctxt "@info:status" msgid "File {0} does not contain any valid profile." -msgstr "" +msgstr "Het bestand {0} bevat geen geldig profiel." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format @@ -1183,7 +1183,7 @@ msgstr "Kan geen kwaliteitstype {0} vinden voor de huidige configuratie." #, python-brace-format msgctxt "@label" msgid "Group #{group_nr}" -msgstr "" +msgstr "Groepsnummer {group_nr}" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" @@ -1242,7 +1242,7 @@ msgid "" "

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

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

    Er is een fatale fout opgetreden. Stuur ons het Crashrapport om het probleem op te lossen

    \n

    Druk op de knop \"Rapport verzenden\" om het foutenrapport automatisch naar onze servers te verzenden

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" @@ -1257,32 +1257,32 @@ msgstr "Onbekend" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 msgctxt "@label Cura version number" msgid "Cura version" -msgstr "" +msgstr "Cura-versie" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 msgctxt "@label Type of platform" msgid "Platform" -msgstr "" +msgstr "Platform" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 msgctxt "@label" msgid "Qt version" -msgstr "" +msgstr "Qt version" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 msgctxt "@label" msgid "PyQt version" -msgstr "" +msgstr "PyQt version" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 msgctxt "@label OpenGL version" msgid "OpenGL" -msgstr "" +msgstr "OpenGL" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 msgctxt "@label" msgid "not yet initialised
    " -msgstr "" +msgstr "nog niet geïnitialiseerd
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format @@ -1305,7 +1305,7 @@ msgstr "
  • OpenGL-renderer: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" msgid "Error traceback" -msgstr "" +msgstr "Traceback van fout" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" @@ -1516,7 +1516,7 @@ msgstr "Maat nozzle" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 msgctxt "@label" msgid "Compatible material diameter" -msgstr "" +msgstr "Compatibele materiaaldiameter" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 msgctxt "@tooltip" @@ -1618,10 +1618,7 @@ 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 "" -"Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n" -"\n" -"Selecteer uw printer in de onderstaande lijst:" +msgstr "Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n\nSelecteer uw printer in de onderstaande lijst:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1661,12 +1658,12 @@ msgstr "Type" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "" +msgstr "Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "" +msgstr "Ultimaker 3 Extended" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1733,7 +1730,7 @@ msgstr "%1 is niet ingesteld voor het hosten van een groep aangesloten Ultimaker #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 msgctxt "@label link to connect manager" msgid "Add/Remove printers" -msgstr "" +msgstr "Printers toevoegen/verwijderen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" @@ -1773,7 +1770,7 @@ msgstr "Verbinding met de printer is verbroken" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 msgctxt "@label Printer status" msgid "Unknown" -msgstr "" +msgstr "Onbekend" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" @@ -1869,164 +1866,164 @@ msgstr "Configuratie Activeren" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" msgid "SolidWorks: Export wizard" -msgstr "" +msgstr "SolidWorks: exportwizard" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" msgid "Quality:" -msgstr "" +msgstr "Kwaliteit:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (3D-printing)" -msgstr "" +msgstr "Fijn (3D-printen)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (3D-printing)" -msgstr "" +msgstr "Grof (3D-printen)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (SolidWorks)" -msgstr "" +msgstr "Fijn (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (SolidWorks)" -msgstr "" +msgstr "Grof (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" msgid "Show this dialog again" -msgstr "" +msgstr "Dit dialoogvenster opnieuw tonen" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 msgctxt "@action:button" msgid "Continue" -msgstr "" +msgstr "Verder" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 msgctxt "@action:button" msgid "Abort" -msgstr "" +msgstr "Afbreken" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 msgctxt "@title:window" msgid "How to install Cura SolidWorks macro" -msgstr "" +msgstr "De Cura SolidWorks-macro installeren" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 msgctxt "@description:label" msgid "Steps:" -msgstr "" +msgstr "Stappen:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 msgctxt "@action:button" msgid "" "Open the directory\n" "with macro and icon" -msgstr "" +msgstr "Open de map\nmet macro en pictogram" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 msgctxt "@description:label" msgid "Instructions:" -msgstr "" +msgstr "Instructies:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 msgctxt "@action:playpause" msgid "Play" -msgstr "" +msgstr "Afspelen" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 msgctxt "@action:playpause" msgid "Pause" -msgstr "" +msgstr "Pauzeren" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 msgctxt "@action:button" msgid "Previous Step" -msgstr "" +msgstr "Vorige stap" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 msgctxt "@action:button" msgid "Done" -msgstr "" +msgstr "Gereed" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 msgctxt "@action:button" msgid "Next Step" -msgstr "" +msgstr "Volgende stap" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 msgctxt "@title:window" msgid "SolidWorks plugin: Configuration" -msgstr "" +msgstr "SolidWorks-invoegtoepassing: configuratie" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 msgctxt "@title:tab" msgid "Conversion settings" -msgstr "" +msgstr "Conversie-instellingen" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 msgctxt "@label" msgid "First choice:" -msgstr "" +msgstr "Eerste keuze:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 msgctxt "@text:menu" msgid "Latest installed version (Recommended)" -msgstr "" +msgstr "Recentst geïnstalleerde versie (aanbevolen)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 msgctxt "@text:menu" msgid "Default version" -msgstr "" +msgstr "Standaardversie" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 msgctxt "@label" msgid "Show wizard before opening SolidWorks files" -msgstr "" +msgstr "Wizard tonen voordat SolidWorks-bestanden worden geopend" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 msgctxt "@label" msgid "Automatically rotate opened file into normed orientation" -msgstr "" +msgstr "Geopend bestand automatisch roteren naar de genormaliseerde stand" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 msgctxt "@title:tab" msgid "Installation(s)" -msgstr "" +msgstr "Installatie(s)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 msgctxt "@label" msgid "COM service found" -msgstr "" +msgstr "COM-service gevonden" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 msgctxt "@label" msgid "Executable found" -msgstr "" +msgstr "Uitvoerbaar bestand gevonden" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 msgctxt "@label" msgid "COM starting" -msgstr "" +msgstr "COM starten" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 msgctxt "@label" msgid "Revision number" -msgstr "" +msgstr "Revisienummer" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 msgctxt "@label" msgid "Functions available" -msgstr "" +msgstr "Beschikbare functies" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 @@ -2212,32 +2209,32 @@ msgstr "Effenen" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 msgctxt "@label" msgid "Mesh Type" -msgstr "" +msgstr "Rastertype" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 msgctxt "@label" msgid "Normal model" -msgstr "" +msgstr "Normaal model" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 msgctxt "@label" msgid "Print as support" -msgstr "" +msgstr "Printen als supportstructuur" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 msgctxt "@label" msgid "Don't support overlap with other models" -msgstr "" +msgstr "Supportstructuur niet laten overlappen met andere modellen" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 msgctxt "@label" msgid "Modify settings for overlap with other models" -msgstr "" +msgstr "Instellingen aanpassen voor overlapping met andere modellen" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 msgctxt "@label" msgid "Modify settings for infill of other models" -msgstr "" +msgstr "Instellingen aanpassen voor vulling van andere modellen" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" @@ -2423,10 +2420,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Deze invoegtoepassing bevat een licentie.\n" -"U moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\n" -"Gaat u akkoord met de onderstaande voorwaarden?" +msgstr "Deze invoegtoepassing bevat een licentie.\nU moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\nGaat u akkoord met de onderstaande voorwaarden?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2691,9 +2685,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"U hebt enkele profielinstellingen aangepast.\n" -"Wilt u deze instellingen behouden of verwijderen?" +msgstr "U hebt enkele profielinstellingen aangepast.\nWilt u deze instellingen behouden of verwijderen?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3097,27 +3089,27 @@ msgstr "(Anonieme) printgegevens verzenden" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 msgctxt "@label" msgid "Experimental" -msgstr "" +msgstr "Experimenteel" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 msgctxt "@info:tooltip" msgid "Use multi build plate functionality" -msgstr "" +msgstr "Functionaliteit voor meerdere platformen gebruiken" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 msgctxt "@option:check" msgid "Use multi build plate functionality (restart required)" -msgstr "" +msgstr "Functionaliteit voor meerdere platformen gebruiken (opnieuw opstarten vereist)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 msgctxt "@info:tooltip" msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" -msgstr "" +msgstr "Moeten nieuw geladen modellen op het platform worden geschikt? Gebruikt in combinatie met meerdere platformen (EXPERIMENTEEL)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 msgctxt "@option:check" msgid "Do not arrange objects on load" -msgstr "" +msgstr "Objecten niet schikken na laden" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 @@ -3361,9 +3353,7 @@ 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 is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\n" -"Cura maakt met trots gebruik van de volgende opensourceprojecten:" +msgstr "Cura is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\nCura maakt met trots gebruik van de volgende opensourceprojecten:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3471,10 +3461,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n" -"\n" -"Klik om het profielbeheer te openen." +msgstr "Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n\nKlik om het profielbeheer te openen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" @@ -3512,10 +3499,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n" -"\n" -"Klik om deze instellingen zichtbaar te maken." +msgstr "Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n\nKlik om deze instellingen zichtbaar te maken." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3530,7 +3514,7 @@ msgstr "Beïnvloed door" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." -msgstr "" +msgstr "Deze instelling wordt altijd door alle extruders gedeeld. Als u hier de instelling wijzigt, wordt de waarde voor alle extruders gewijzigd" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" @@ -3543,10 +3527,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Deze instelling heeft een andere waarde dan in het profiel.\n" -"\n" -"Klik om de waarde van het profiel te herstellen." +msgstr "Deze instelling heeft een andere waarde dan in het profiel.\n\nKlik om de waarde van het profiel te herstellen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" @@ -3554,10 +3535,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n" -"\n" -"Klik om de berekende waarde te herstellen." +msgstr "Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n\nKlik om de berekende waarde te herstellen." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" @@ -3569,9 +3547,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Instelling voor printen uitgeschakeld\n" -"G-code-bestanden kunnen niet worden aangepast" +msgstr "Instelling voor printen uitgeschakeld\nG-code-bestanden kunnen niet worden aangepast" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" @@ -3581,7 +3557,7 @@ msgstr "00u 00min" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" msgid "Time specification" -msgstr "" +msgstr "Tijdspecificatie" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" @@ -3638,12 +3614,12 @@ msgstr "Beel&d" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 msgctxt "@action:inmenu menubar:view" msgid "&Camera position" -msgstr "" +msgstr "&Camerapositie" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "" +msgstr "&Platform" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" @@ -3813,27 +3789,27 @@ msgstr "&Afsluiten" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" msgid "&3D View" -msgstr "" +msgstr "&3D-weergave" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:view" msgid "&Front View" -msgstr "" +msgstr "Weergave &voorzijde" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 msgctxt "@action:inmenu menubar:view" msgid "&Top View" -msgstr "" +msgstr "Weergave &bovenzijde" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 msgctxt "@action:inmenu menubar:view" msgid "&Left Side View" -msgstr "" +msgstr "Weergave &linkerzijde" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:view" msgid "&Right Side View" -msgstr "" +msgstr "Weergave &rechterzijde" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" @@ -3959,7 +3935,7 @@ msgstr "Alle Modellen Opnieuw &Laden" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "" +msgstr "Alle modellen schikken op alle platformen" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" @@ -4019,7 +3995,7 @@ msgstr "Geïnstalleerde plugins..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 msgctxt "@action:inmenu menubar:view" msgid "Expand/Collapse Sidebar" -msgstr "" +msgstr "Zijbalk uitbreiden/samenvouwen" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" @@ -4054,12 +4030,12 @@ msgstr "Slicen is niet beschikbaar" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Slice current printjob" -msgstr "" +msgstr "Huidige printtaak slicen" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Cancel slicing process" -msgstr "" +msgstr "Slicen annuleren" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" @@ -4115,7 +4091,7 @@ msgstr "Opslaan &als..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" msgid "Save &Project..." -msgstr "" +msgstr "&Project opslaan..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" @@ -4354,7 +4330,7 @@ msgstr "Materiaal" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Compatibiliteit controleren" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" @@ -4364,17 +4340,17 @@ msgstr "Klik om de materiaalcompatibiliteit te controleren op Ultimaker.com." #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 msgctxt "@option:check" msgid "See only current build plate" -msgstr "" +msgstr "Alleen huidig platform weergeven" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 msgctxt "@action:button" msgid "Arrange to all build plates" -msgstr "" +msgstr "Schikken naar alle platformen" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 msgctxt "@action:button" msgid "Arrange current build plate" -msgstr "" +msgstr "Huidig platform schikken" #: MachineSettingsAction/plugin.json msgctxt "description" @@ -4469,22 +4445,22 @@ msgstr "USB-printen" #: PrepareStage/plugin.json msgctxt "description" msgid "Provides a prepare stage in Cura." -msgstr "" +msgstr "Deze optie biedt een voorbereidingsstadium in Cura." #: PrepareStage/plugin.json msgctxt "name" msgid "Prepare Stage" -msgstr "" +msgstr "Stadium voorbereiden" #: CuraLiveScriptingPlugin/plugin.json msgctxt "description" msgid "Provides an edit window for direct script editing." -msgstr "" +msgstr "Deze optie biedt een bewerkingsvenster voor rechtstreeks bewerken van scripts." #: CuraLiveScriptingPlugin/plugin.json msgctxt "name" msgid "Live scripting tool" -msgstr "" +msgstr "Gereedschap voor live uitvoeren van scripts" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" @@ -4509,12 +4485,12 @@ msgstr "UM3-netwerkverbinding" #: MonitorStage/plugin.json msgctxt "description" msgid "Provides a monitor stage in Cura." -msgstr "" +msgstr "Deze optie biedt een controlestadium in Cura." #: MonitorStage/plugin.json msgctxt "name" msgid "Monitor Stage" -msgstr "" +msgstr "Controlestadium" #: FirmwareUpdateChecker/plugin.json msgctxt "description" @@ -4529,7 +4505,7 @@ msgstr "Firmware-updatecontrole" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." -msgstr "" +msgstr "Deze optie biedt u de mogelijkheid bepaalde bestanden via SolidWorks te openen. De bestanden worden vervolgens via deze invoegtoepassing geconverteerd en geoptimaliseerd." #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4599,12 +4575,12 @@ msgstr "Lezer voor Profielen van oudere Cura-versies" #: CuraBlenderPlugin/plugin.json msgctxt "description" msgid "Helps to open Blender files directly in Cura." -msgstr "" +msgstr "Hiermee kunnen Blender-bestanden rechtstreeks in Cura worden geopend." #: CuraBlenderPlugin/plugin.json msgctxt "name" msgid "Blender Integration (experimental)" -msgstr "" +msgstr "Blender-integratie (experimenteel)" #: GCodeProfileReader/plugin.json msgctxt "description" @@ -4769,12 +4745,12 @@ msgstr "Cura-profielschrijver" #: CuraPrintProfileCreator/plugin.json msgctxt "description" msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." -msgstr "" +msgstr "Maakt het fabrikanten mogelijk nieuwe materiaal- en kwaliteitsprofielen aan te maken met behulp van een drop-in-gebruikersinterface." #: CuraPrintProfileCreator/plugin.json msgctxt "name" msgid "Print Profile Assistant" -msgstr "" +msgstr "Profielassistent afdrukken" #: 3MFWriter/plugin.json msgctxt "description" diff --git a/resources/i18n/nl_NL/fdmprinter.def.json.po b/resources/i18n/nl_NL/fdmprinter.def.json.po index eb846edf25..36f7ece010 100644 --- a/resources/i18n/nl_NL/fdmprinter.def.json.po +++ b/resources/i18n/nl_NL/fdmprinter.def.json.po @@ -348,12 +348,12 @@ msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_firmware_retract label" msgid "Firmware Retraction" -msgstr "" +msgstr "Intrekken via firmware" #: fdmprinter.def.json msgctxt "machine_firmware_retract description" msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." -msgstr "" +msgstr "Hiermee bepaalt u of u voor het intrekken van materiaal firmwareopdrachten voor intrekken (G10/G11) gebruikt in plaats van de eigenschap E in G1-opdrachten." #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" @@ -1048,12 +1048,12 @@ msgstr "Overal" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps label" msgid "Filter Out Tiny Gaps" -msgstr "" +msgstr "Kleine gaten wegfilteren" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps description" msgid "Filter out tiny gaps to reduce blobs on outside of model." -msgstr "" +msgstr "Kleine gaten wegfilteren om blobs aan de buitenzijde van het model te verminderen." #: fdmprinter.def.json msgctxt "fill_outline_gaps label" @@ -1438,7 +1438,7 @@ msgstr "Vulling X-offset" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is moved this distance along the X axis." -msgstr "" +msgstr "Het vulpatroon wordt over deze afstand verplaatst langs de X-as." #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1448,7 +1448,7 @@ msgstr "Vulling Y-offset" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is moved this distance along the Y axis." -msgstr "" +msgstr "Het vulpatroon wordt over deze afstand verplaatst langs de Y-as." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1468,7 +1468,7 @@ msgstr "Overlappercentage vulling" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "De mate van overlap tussen de vulling en de wanden als percentage van de lijnbreedte van de vulling. Met een lichte overlap kunnen de wanden goed hechten aan de vulling." #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1488,7 +1488,7 @@ msgstr "Overlappercentage Skin" #: fdmprinter.def.json msgctxt "skin_overlap description" msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." -msgstr "" +msgstr "De mate van overlap tussen de skin en de wanden als percentage van de lijnbreedte van de skin. Met een lichte overlap kunnen de wanden goed hechten aan de skin. Dit is een percentage van de gemiddelde lijnbreedte van de skinlijnen en de binnenste wand." #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1718,7 +1718,7 @@ msgstr "Platformtemperatuur" #: fdmprinter.def.json msgctxt "material_bed_temperature description" msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." -msgstr "" +msgstr "De temperatuur van het verwarmde platform. Als deze waarde is ingesteld op 0, wordt de printbedtemperatuur niet aangepast." #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3500,9 +3500,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 "" -"De horizontale afstand tussen de skirt en de eerste laag van de print.\n" -"Dit is de minimumafstand. Als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint." +msgstr "De horizontale afstand tussen de skirt en de eerste laag van de print.\nDit is de minimumafstand. Als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4262,82 +4260,82 @@ msgstr "experimenteel!" #: fdmprinter.def.json msgctxt "support_tree_enable label" msgid "Tree Support" -msgstr "" +msgstr "Boomsupportstructuur" #: fdmprinter.def.json msgctxt "support_tree_enable description" msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." -msgstr "" +msgstr "Genereer een boomachtige supportstructuur met takken die uw print ondersteunen. Hierdoor worden materiaalgebruik en printtijd mogelijk gereduceerd, maar wordt de slicetijd aanzienlijk verlengd." #: fdmprinter.def.json msgctxt "support_tree_angle label" msgid "Tree Support Branch Angle" -msgstr "" +msgstr "Hoek van takken van boomsupportstructuur" #: fdmprinter.def.json msgctxt "support_tree_angle description" msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." -msgstr "" +msgstr "Hiermee stelt u de hoek van de takken in. Met een kleinere hoek worden de takken verticaler en stabieler. Met een grotere hoek hebben ze een groter bereik." #: fdmprinter.def.json msgctxt "support_tree_branch_distance label" msgid "Tree Support Branch Distance" -msgstr "" +msgstr "Takafstand van boomsupportstructuur" #: fdmprinter.def.json msgctxt "support_tree_branch_distance description" msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." -msgstr "" +msgstr "Hiermee stelt u in hoe ver de takken moeten uitsteken als ze het model raken. Met een kleinere afstand raakt de boomsupportstructuur het model op meer plaatsen. Hierdoor creëert u een betere overhang maar is de supportstructuur moeilijker te verwijderen." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter label" msgid "Tree Support Branch Diameter" -msgstr "" +msgstr "Takdiameter van boomsupportstructuur" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter description" msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." -msgstr "" +msgstr "Hiermee stelt u de diameter in van de dunste takken van de boomsupportstructuur. Dikkere takken zijn steviger. Takken die dichter bij de stam liggen, zijn dikker dan dit." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle label" msgid "Tree Support Branch Diameter Angle" -msgstr "" +msgstr "Hoek van takdiameter van boomsupportstructuur" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle description" msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." -msgstr "" +msgstr "De hoek van de diameter van de takken terwijl ze naar beneden toe geleidelijk dikker worden. Met de hoekinstelling 0 zijn de takken over de gehele lengte even dik. Een kleine hoek verbetert de stabiliteit van de boomsupportstructuur." #: fdmprinter.def.json msgctxt "support_tree_collision_resolution label" msgid "Tree Support Collision Resolution" -msgstr "" +msgstr "Resolutie bij botsingen van de boomsupportstructuur" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution description" msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." -msgstr "" +msgstr "Resolutie voor het berekenen van botsingen om te voorkomen dat het model wordt geraakt. Als u deze optie op een lagere waarde instelt, creëert u nauwkeurigere bomen die minder vaak fouten vertonen, maar wordt de slicetijd aanzienlijk verlengd." #: fdmprinter.def.json msgctxt "support_tree_wall_thickness label" msgid "Tree Support Wall Thickness" -msgstr "" +msgstr "Wanddikte boomsupportstructuur" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness description" msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "Hiermee stelt u de wanddikte in voor de takken van de boomsupportstructuur. Het printen van dikkere wanden duurt langer, maar deze vallen minder snel om." #: fdmprinter.def.json msgctxt "support_tree_wall_count label" msgid "Tree Support Wall Line Count" -msgstr "" +msgstr "Aantal wandlijnen boomsupportstructuur" #: fdmprinter.def.json msgctxt "support_tree_wall_count description" msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "Hiermee stelt u het aantal wanden in voor de takken van de boomsupportstructuur. Het printen van dikkere wanden duurt langer, maar deze vallen minder snel om." #: fdmprinter.def.json msgctxt "slicing_tolerance label" @@ -4412,12 +4410,12 @@ msgstr "Een lijst met gehele getallen voor lijnrichtingen die moet worden gebrui #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization label" msgid "Infill Travel Optimization" -msgstr "" +msgstr "Bewegingsoptimalisatie vulling" #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization description" msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." -msgstr "" +msgstr "Wanneer deze optie is ingeschakeld, wordt de volgorde geoptimaliseerd waarin de vullijnen worden geprint om de afgelegde beweging te reduceren. De reductie in bewegingstijd die wordt bereikt, is in hoge mate afhankelijk van het model dat wordt geslicet, het vulpatroon, de dichtheid enz. Houd er rekening mee dat de slicetijd voor modellen met veel kleine vulgebieden aanzienlijk kan worden verlengd." #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" @@ -4939,9 +4937,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 "" -"De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\n" -"Hierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten." +msgstr "De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\nHierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5051,42 +5047,42 @@ msgstr "De afstand tussen de nozzle en horizontaal neergaande lijnen. Een groter #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled label" msgid "Use adaptive layers" -msgstr "" +msgstr "Adaptieve lagen gebruiken" #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled description" msgid "Adaptive layers computes the layer heights depending on the shape of the model." -msgstr "" +msgstr "Met adaptieve lagen berekent u de laaghoogte afhankelijk van de vorm van het model." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation label" msgid "Adaptive layers maximum variation" -msgstr "" +msgstr "Maximale variatie adaptieve lagen" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height in mm." -msgstr "" +msgstr "De maximaal toegestane hoogte ten opzichte van de grondlaaghoogte in mm." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" msgid "Adaptive layers variation step size" -msgstr "" +msgstr "Stapgrootte variatie adaptieve lagen" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step description" msgid "The difference in height of the next layer height compared to the previous one." -msgstr "" +msgstr "Het hoogteverschil tussen de hoogte van de volgende laag ten opzichte van de vorige laag." #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold label" msgid "Adaptive layers threshold" -msgstr "" +msgstr "Drempel adaptieve lagen" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold description" msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." -msgstr "" +msgstr "De drempel of er al dan niet een kleinere laag moet worden gebruikt. Deze waarde wordt vergeleken met de waarde van de steilste helling in een laag." #: fdmprinter.def.json msgctxt "command_line_settings label" diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po index 1fae4d7adb..0c2b205b3d 100644 --- a/resources/i18n/pt_PT/cura.po +++ b/resources/i18n/pt_PT/cura.po @@ -199,7 +199,7 @@ msgstr "Firmware da Impressora" #: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Prepare" -msgstr "" +msgstr "Preparar" # rever! # unidade amovível @@ -601,7 +601,7 @@ msgstr "Abre a interface dos trabalhos de impressão no seu web browser." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 msgctxt "@label Printer name" msgid "Unknown" -msgstr "" +msgstr "Desconhecido" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format @@ -640,7 +640,7 @@ msgstr "Ligar Através da Rede" #: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Monitor" -msgstr "" +msgstr "Monitorizar" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format @@ -667,7 +667,7 @@ msgstr "Não foi possível aceder às informações de atualização." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." -msgstr "" +msgstr "O SolidWorks comunicou erros ao abrir o ficheiro. Recomendamos a resolução destes problemas no SolidWorks." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 msgctxt "@info:status" @@ -675,7 +675,7 @@ msgid "" "Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" "\n" " Thanks!." -msgstr "" +msgstr "Não foram encontrados modelos no interior do seu desenho. Pode verificar novamente o seu conteúdo e confirmar se a peça ou conjunto está no seu interior?\n\n Obrigado!" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 msgctxt "@info:status" @@ -683,7 +683,7 @@ msgid "" "Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" "\n" "Sorry!" -msgstr "" +msgstr "Detetou-se mais do que uma peça ou um conjunto no interior do seu desenho. Atualmente, apenas suportamos desenhos com exatamente uma peça ou um conjunto no seu interior.\n\nLamentamos!" # rever! # versão PT do solidworks? @@ -702,7 +702,7 @@ msgstr "Ficheiro SolidWorks de montagem" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 msgctxt "@item:inlistbox" msgid "SolidWorks drawing file" -msgstr "" +msgstr "Ficheiro de desenho SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 msgctxt "@info:status" @@ -712,7 +712,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Caro cliente,\nNão conseguimos encontrar uma instalação válida do SolidWorks no seu sistema. Isto significa que o SolidWorks não está instalado ou que não possui uma licença válida. Certifique-se de que o SolidWorks é executado sem problemas e/ou entre em contacto com o seu serviço de TI.\n\nAtenciosamente\n – Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 msgctxt "@info:status" @@ -722,7 +722,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Caro cliente,\nEstá atualmente a executar este plug-in num sistema operativo que não o Windows. Este plug-in apenas funciona no Windows com o SolidWorks instalado e com uma licença válida. Instale este plug-in num dispositivo Windows com o SolidWorks instalado.\n\nAtenciosamente\n – Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" @@ -730,12 +730,12 @@ msgstr "Configurar" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 msgid "Installation guide for SolidWorks macro" -msgstr "" +msgstr "Guia de instalação para uma macro SolidWorks" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Layer view" -msgstr "" +msgstr "Visualização de camadas" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:103 msgctxt "@info:status" @@ -756,7 +756,7 @@ msgstr "Modificar G-Code" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" msgid "Cura collects anonymized usage statistics." -msgstr "" +msgstr "O Cura recolhe estatísticas de utilização anónimas." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -766,22 +766,22 @@ msgstr "A Recolher Dados" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Allow" -msgstr "" +msgstr "Permitir" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." -msgstr "" +msgstr "Permitir que o Cura envie estatísticas de utilização anónimas para ajudar a priorizar futuras melhorias do Cura. São enviadas algumas das suas preferências e definições, a versão do Cura e um hash dos modelos que está a seccionar." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 msgctxt "@action:button" msgid "Disable" -msgstr "" +msgstr "Desativar" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:tooltip" msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." -msgstr "" +msgstr "Não permitir que o Cura envie estatísticas de utilização anónimas. É possível ativá-las novamente nas suas preferências." #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -791,14 +791,14 @@ msgstr "Perfis Cura 15.04" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 msgctxt "@item:inlistbox" msgid "Blender file" -msgstr "" +msgstr "Ficheiro Blender" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 msgctxt "@info:status" msgid "" "Could not export using \"{}\" quality!\n" "Felt back to \"{}\"." -msgstr "" +msgstr "Não foi possível exportar utilizando a qualidade \"{}\"!\nFoi revertido para \"{}\"." #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 @@ -991,12 +991,12 @@ msgstr "Perfil Cura" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 msgctxt "@item:inmenu" msgid "Profile Assistant" -msgstr "" +msgstr "Assistente de perfis" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 msgctxt "@item:inlistbox" msgid "Profile Assistant" -msgstr "" +msgstr "Assistente de perfis" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" @@ -1197,13 +1197,13 @@ msgstr "Falha ao importar perfil de {0}: {1} or !" msgid "This profile {0} contains incorrect data, could not import it." -msgstr "" +msgstr "O perfil {0} contém dados incorretos, não foi possível importá-lo." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." -msgstr "" +msgstr "A máquina definida no perfil {0} não corresponde à sua máquina atual, não foi possível importá-la." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format @@ -1215,7 +1215,7 @@ msgstr "Perfil {0} importado com êxito" #, python-brace-format msgctxt "@info:status" msgid "File {0} does not contain any valid profile." -msgstr "" +msgstr "O ficheiro {0} não contém nenhum perfil válido." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format @@ -1243,7 +1243,7 @@ msgstr "Não foi possível encontrar um tipo de qualidade {0} para a configuraç #, python-brace-format msgctxt "@label" msgid "Group #{group_nr}" -msgstr "" +msgstr "Grupo #{group_nr}" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" @@ -1303,7 +1303,7 @@ msgid "" "

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

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

    Ocorreu um erro fatal. Envie-nos este relatório de falhas para resolver o problema

    \n

    Utilize o botão \"Enviar relatório\" para publicar um relatório de erros automaticamente nos nossos servidores

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" @@ -1318,32 +1318,32 @@ msgstr "Desconhecido" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 msgctxt "@label Cura version number" msgid "Cura version" -msgstr "" +msgstr "Versão do Cura" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 msgctxt "@label Type of platform" msgid "Platform" -msgstr "" +msgstr "Plataforma" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 msgctxt "@label" msgid "Qt version" -msgstr "" +msgstr "Qt version" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 msgctxt "@label" msgid "PyQt version" -msgstr "" +msgstr "PyQt version" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 msgctxt "@label OpenGL version" msgid "OpenGL" -msgstr "" +msgstr "OpenGL" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 msgctxt "@label" msgid "not yet initialised
    " -msgstr "" +msgstr "ainda não foi inicializado
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format @@ -1366,7 +1366,7 @@ msgstr "
  • Processador do OpenGL: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" msgid "Error traceback" -msgstr "" +msgstr "Determinação da origem do erro" # rever! # Registos? @@ -1579,7 +1579,7 @@ msgstr "Tamanho do nozzle" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 msgctxt "@label" msgid "Compatible material diameter" -msgstr "" +msgstr "Diâmetro do material compatível" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 msgctxt "@tooltip" @@ -1681,10 +1681,7 @@ 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 "" -"Para imprimir diretamente para a sua impressora através da rede, certifique-se de que a sua impressora está ligada à rede por meio de um cabo de rede ou através de ligação à rede Wi-Fi. Se não ligar o Cura à impressora, poderá ainda assim utilizar uma unidade USB para transferir ficheiros g-code para a impressora.\n" -"\n" -"Selecione a sua impressora na lista a seguir:" +msgstr "Para imprimir diretamente para a sua impressora através da rede, certifique-se de que a sua impressora está ligada à rede por meio de um cabo de rede ou através de ligação à rede Wi-Fi. Se não ligar o Cura à impressora, poderá ainda assim utilizar uma unidade USB para transferir ficheiros g-code para a impressora.\n\nSelecione a sua impressora na lista a seguir:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1724,12 +1721,12 @@ msgstr "Tipo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "" +msgstr "Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "" +msgstr "Ultimaker 3 Extended" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1796,7 +1793,7 @@ msgstr "%1 não está configurado para alojar um grupo de impressoras Ultimaker #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 msgctxt "@label link to connect manager" msgid "Add/Remove printers" -msgstr "" +msgstr "Adicionar/remover impressoras" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" @@ -1836,7 +1833,7 @@ msgstr "Perdeu-se a ligação com a impressora" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 msgctxt "@label Printer status" msgid "Unknown" -msgstr "" +msgstr "Desconhecido" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" @@ -1932,164 +1929,164 @@ msgstr "Ativar Configuração" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" msgid "SolidWorks: Export wizard" -msgstr "" +msgstr "SolidWorks: Exportar assistente" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" msgid "Quality:" -msgstr "" +msgstr "Qualidade:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (3D-printing)" -msgstr "" +msgstr "Alta resolução (impressão 3D)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (3D-printing)" -msgstr "" +msgstr "Baixa resolução (impressão 3D)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (SolidWorks)" -msgstr "" +msgstr "Alta resolução (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (SolidWorks)" -msgstr "" +msgstr "Baixa resolução (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" msgid "Show this dialog again" -msgstr "" +msgstr "Mostrar esta caixa de diálogo novamente" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 msgctxt "@action:button" msgid "Continue" -msgstr "" +msgstr "Continuar" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 msgctxt "@action:button" msgid "Abort" -msgstr "" +msgstr "Cancelar" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 msgctxt "@title:window" msgid "How to install Cura SolidWorks macro" -msgstr "" +msgstr "Como instalar a macro Cura SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 msgctxt "@description:label" msgid "Steps:" -msgstr "" +msgstr "Passos:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 msgctxt "@action:button" msgid "" "Open the directory\n" "with macro and icon" -msgstr "" +msgstr "Abrir o diretório\ncom macro e ícone" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 msgctxt "@description:label" msgid "Instructions:" -msgstr "" +msgstr "Instruções:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 msgctxt "@action:playpause" msgid "Play" -msgstr "" +msgstr "Reproduzir" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 msgctxt "@action:playpause" msgid "Pause" -msgstr "" +msgstr "Colocar em pausa" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 msgctxt "@action:button" msgid "Previous Step" -msgstr "" +msgstr "Passo anterior" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 msgctxt "@action:button" msgid "Done" -msgstr "" +msgstr "Concluído" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 msgctxt "@action:button" msgid "Next Step" -msgstr "" +msgstr "Passo seguinte" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 msgctxt "@title:window" msgid "SolidWorks plugin: Configuration" -msgstr "" +msgstr "Plug-in SolidWorks: Configuração" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 msgctxt "@title:tab" msgid "Conversion settings" -msgstr "" +msgstr "Definições de conversão" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 msgctxt "@label" msgid "First choice:" -msgstr "" +msgstr "Primeira escolha:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 msgctxt "@text:menu" msgid "Latest installed version (Recommended)" -msgstr "" +msgstr "Última versão instalada (Recomendada)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 msgctxt "@text:menu" msgid "Default version" -msgstr "" +msgstr "Versão predefinida" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 msgctxt "@label" msgid "Show wizard before opening SolidWorks files" -msgstr "" +msgstr "Mostrar assistente antes de abrir ficheiros SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 msgctxt "@label" msgid "Automatically rotate opened file into normed orientation" -msgstr "" +msgstr "Rodar automaticamente o ficheiro aberto para uma orientação normalizada" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 msgctxt "@title:tab" msgid "Installation(s)" -msgstr "" +msgstr "Instalação(ões)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 msgctxt "@label" msgid "COM service found" -msgstr "" +msgstr "Serviço COM encontrado" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 msgctxt "@label" msgid "Executable found" -msgstr "" +msgstr "Executável encontrado" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 msgctxt "@label" msgid "COM starting" -msgstr "" +msgstr "A iniciar COM" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 msgctxt "@label" msgid "Revision number" -msgstr "" +msgstr "Número da revisão" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 msgctxt "@label" msgid "Functions available" -msgstr "" +msgstr "Funções disponíveis" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 @@ -2282,32 +2279,32 @@ msgstr "Suavização" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 msgctxt "@label" msgid "Mesh Type" -msgstr "" +msgstr "Tipo de malha" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 msgctxt "@label" msgid "Normal model" -msgstr "" +msgstr "Modelo normal" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 msgctxt "@label" msgid "Print as support" -msgstr "" +msgstr "Imprimir como suporte" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 msgctxt "@label" msgid "Don't support overlap with other models" -msgstr "" +msgstr "Não suportar sobreposição com outros modelos" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 msgctxt "@label" msgid "Modify settings for overlap with other models" -msgstr "" +msgstr "Modificar definições para sobreposição com outros modelos" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 msgctxt "@label" msgid "Modify settings for infill of other models" -msgstr "" +msgstr "Modificar definições para preenchimento de outros modelos" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" @@ -2495,10 +2492,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Este plug-in contém uma licença.\n" -"É necessário aceitar esta licença para instalar o plug-in.\n" -"Concorda com os termos abaixo?" +msgstr "Este plug-in contém uma licença.\nÉ necessário aceitar esta licença para instalar o plug-in.\nConcorda com os termos abaixo?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2771,9 +2765,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Alterou algumas das definições do perfil.\n" -"Gostaria de manter ou descartar essas alterações?" +msgstr "Alterou algumas das definições do perfil.\nGostaria de manter ou descartar essas alterações?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3181,27 +3173,27 @@ msgstr "Enviar informações (anónimas) da impressão" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 msgctxt "@label" msgid "Experimental" -msgstr "" +msgstr "Experimental" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 msgctxt "@info:tooltip" msgid "Use multi build plate functionality" -msgstr "" +msgstr "Utilizar a funcionalidade de múltiplas placas de construção" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 msgctxt "@option:check" msgid "Use multi build plate functionality (restart required)" -msgstr "" +msgstr "Utilizar a funcionalidade de múltiplas placas de construção (é necessário reiniciar)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 msgctxt "@info:tooltip" msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" -msgstr "" +msgstr "Os modelos recém-carregados devem ser dispostos na placa de construção? Utilizado em conjunto com múltiplas placas de construção (EXPERIMENTAL)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 msgctxt "@option:check" msgid "Do not arrange objects on load" -msgstr "" +msgstr "Não dispor objetos durante o carregamento" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 @@ -3445,9 +3437,7 @@ 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 "" -"O Cura foi desenvolvido pela Ultimaker B.V. em colaboração com a comunidade.\n" -"O Cura tem o prazer de utilizar os seguintes projetos open source:" +msgstr "O Cura foi desenvolvido pela Ultimaker B.V. em colaboração com a comunidade.\nO Cura tem o prazer de utilizar os seguintes projetos open source:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3557,10 +3547,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Alguns valores de definição/substituição são diferentes dos valores armazenados no perfil.\n" -"\n" -"Clique para abrir o gestor de perfis." +msgstr "Alguns valores de definição/substituição são diferentes dos valores armazenados no perfil.\n\nClique para abrir o gestor de perfis." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" @@ -3602,10 +3589,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Algumas das definições invisíveis têm valores diferentes dos valores normais calculados automaticamente.\n" -"\n" -"Clique para tornar estas definições visíveis." +msgstr "Algumas das definições invisíveis têm valores diferentes dos valores normais calculados automaticamente.\n\nClique para tornar estas definições visíveis." # rever! # Afeta? @@ -3625,7 +3609,7 @@ msgstr "Modificado Por" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." -msgstr "" +msgstr "Esta definição é sempre partilhada entre todas as extrusoras. Ao alterá-la aqui, o valor será alterado para todas as extrusoras." # rever! # contexto?! @@ -3642,10 +3626,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Esta definição tem um valor que é diferente do perfil.\n" -"\n" -"Clique para restaurar o valor do perfil." +msgstr "Esta definição tem um valor que é diferente do perfil.\n\nClique para restaurar o valor do perfil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" @@ -3653,10 +3634,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Normalmente, o valor desta definição é calculado, mas atualmente tem definido um valor absoluto.\n" -"\n" -"Clique para restaurar o valor calculado." +msgstr "Normalmente, o valor desta definição é calculado, mas atualmente tem definido um valor absoluto.\n\nClique para restaurar o valor calculado." # rever! # Configuração da Impressão? @@ -3670,9 +3648,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Configuração da Impressão desativada\n" -"Os ficheiros G-code não podem ser modificados" +msgstr "Configuração da Impressão desativada\nOs ficheiros G-code não podem ser modificados" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" @@ -3682,7 +3658,7 @@ msgstr "00h00min" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" msgid "Time specification" -msgstr "" +msgstr "Especificação de tempo" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" @@ -3739,12 +3715,12 @@ msgstr "&Visualizar" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 msgctxt "@action:inmenu menubar:view" msgid "&Camera position" -msgstr "" +msgstr "&Posição da câmara" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "" +msgstr "&Placa de construção" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" @@ -3920,27 +3896,27 @@ msgstr "&Sair" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" msgid "&3D View" -msgstr "" +msgstr "&Visualização 3D" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:view" msgid "&Front View" -msgstr "" +msgstr "&Vista frontal" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 msgctxt "@action:inmenu menubar:view" msgid "&Top View" -msgstr "" +msgstr "&Vista superior" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 msgctxt "@action:inmenu menubar:view" msgid "&Left Side View" -msgstr "" +msgstr "&Vista lateral esquerda" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:view" msgid "&Right Side View" -msgstr "" +msgstr "&Vista lateral direita" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" @@ -4066,7 +4042,7 @@ msgstr "Re&carregar todos os modelos" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "" +msgstr "Dispor todos os modelos para todas as placas de construção" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" @@ -4128,7 +4104,7 @@ msgstr "Plug-ins instalados..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 msgctxt "@action:inmenu menubar:view" msgid "Expand/Collapse Sidebar" -msgstr "" +msgstr "Expandir/fechar barra lateral" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" @@ -4169,12 +4145,12 @@ msgstr "Seccionamento indisponível" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Slice current printjob" -msgstr "" +msgstr "Seccionar o trabalho de impressão atual" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Cancel slicing process" -msgstr "" +msgstr "Cancelar o processo de seccionamento" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" @@ -4230,7 +4206,7 @@ msgstr "Guardar &como..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" msgid "Save &Project..." -msgstr "" +msgstr "Guardar &projeto..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" @@ -4482,7 +4458,7 @@ msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Verificar a compatibilidade" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" @@ -4492,17 +4468,17 @@ msgstr "Clique para verificar a compatibilidade dos materiais em Ultimaker.com." #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 msgctxt "@option:check" msgid "See only current build plate" -msgstr "" +msgstr "Ver apenas a placa de construção atual" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 msgctxt "@action:button" msgid "Arrange to all build plates" -msgstr "" +msgstr "Dispor em todas as placas de construção" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 msgctxt "@action:button" msgid "Arrange current build plate" -msgstr "" +msgstr "Dispor a placa de construção atual" #: MachineSettingsAction/plugin.json msgctxt "description" @@ -4600,22 +4576,22 @@ msgstr "Impressão através de USB" #: PrepareStage/plugin.json msgctxt "description" msgid "Provides a prepare stage in Cura." -msgstr "" +msgstr "Fornece uma fase de preparação no Cura." #: PrepareStage/plugin.json msgctxt "name" msgid "Prepare Stage" -msgstr "" +msgstr "Fase de preparação" #: CuraLiveScriptingPlugin/plugin.json msgctxt "description" msgid "Provides an edit window for direct script editing." -msgstr "" +msgstr "Fornece uma janela de edição para a edição direta de scripts." #: CuraLiveScriptingPlugin/plugin.json msgctxt "name" msgid "Live scripting tool" -msgstr "" +msgstr "Ferramenta de scripting em direto" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" @@ -4640,12 +4616,12 @@ msgstr "Ligação de rede UM3" #: MonitorStage/plugin.json msgctxt "description" msgid "Provides a monitor stage in Cura." -msgstr "" +msgstr "Fornece uma fase de monitorização no Cura." #: MonitorStage/plugin.json msgctxt "name" msgid "Monitor Stage" -msgstr "" +msgstr "Fase de monitorização" #: FirmwareUpdateChecker/plugin.json msgctxt "description" @@ -4660,7 +4636,7 @@ msgstr "Verificador Atualizações Firmware" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." -msgstr "" +msgstr "Oferece a possibilidade de abrir determinados ficheiros utilizando o SolidWorks. A conversão é efetuada através deste plug-in e de otimizações adicionais." #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4731,12 +4707,12 @@ msgstr "Leitor de perfis antigos do Cura" #: CuraBlenderPlugin/plugin.json msgctxt "description" msgid "Helps to open Blender files directly in Cura." -msgstr "" +msgstr "Ajuda a abrir ficheiros Blender diretamente no Cura." #: CuraBlenderPlugin/plugin.json msgctxt "name" msgid "Blender Integration (experimental)" -msgstr "" +msgstr "Integração do Blender (experimental)" #: GCodeProfileReader/plugin.json msgctxt "description" @@ -4903,12 +4879,12 @@ msgstr "Gravador de perfis Cura" #: CuraPrintProfileCreator/plugin.json msgctxt "description" msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." -msgstr "" +msgstr "Permite aos fabricantes de material a criação de novo material e de perfis de qualidade utilizando uma IU de fácil acesso." #: CuraPrintProfileCreator/plugin.json msgctxt "name" msgid "Print Profile Assistant" -msgstr "" +msgstr "Assistente de perfis de impressão" #: 3MFWriter/plugin.json msgctxt "description" diff --git a/resources/i18n/pt_PT/fdmprinter.def.json.po b/resources/i18n/pt_PT/fdmprinter.def.json.po index 8340465a37..e106780669 100644 --- a/resources/i18n/pt_PT/fdmprinter.def.json.po +++ b/resources/i18n/pt_PT/fdmprinter.def.json.po @@ -59,9 +59,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"Comandos Gcode a serem executados no início – separados por \n" -"." +msgstr "Comandos Gcode a serem executados no início – separados por \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -73,9 +71,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"Comandos Gcode a serem executados no fim – separados por \n" -"." +msgstr "Comandos Gcode a serem executados no fim – separados por \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -360,12 +356,12 @@ msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_firmware_retract label" msgid "Firmware Retraction" -msgstr "" +msgstr "Retração de firmware" #: fdmprinter.def.json msgctxt "machine_firmware_retract description" msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." -msgstr "" +msgstr "Utilizar ou não comandos de retração de firmware (G10/G11) em vez de utilizar a propriedade E em comandos G1 para retrair o material." #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" @@ -1083,12 +1079,12 @@ msgstr "Em todo o lado" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps label" msgid "Filter Out Tiny Gaps" -msgstr "" +msgstr "Eliminar pequenas folgas" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps description" msgid "Filter out tiny gaps to reduce blobs on outside of model." -msgstr "" +msgstr "Eliminar pequenas folgas para reduzir blobs no exterior do modelo." #: fdmprinter.def.json msgctxt "fill_outline_gaps label" @@ -1108,9 +1104,7 @@ msgstr "Expansão Horizontal" #: 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 "" -"Quantidade de desvio aplicado a todos os polígonos em cada camada.\n" -" Valores positivos podem compensar buracos demasiado grandes; os valores negativos podem compensar buracos demasiado pequenos." +msgstr "Quantidade de desvio aplicado a todos os polígonos em cada camada.\n Valores positivos podem compensar buracos demasiado grandes; os valores negativos podem compensar buracos demasiado pequenos." #: fdmprinter.def.json msgctxt "xy_offset_layer_0 label" @@ -1122,9 +1116,7 @@ msgstr "Expansão Horizontal Camada Inicial" #: fdmprinter.def.json msgctxt "xy_offset_layer_0 description" msgid "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\"." -msgstr "" -"Quantidade de desvio aplicado a todos os polígonos na primeira camada.\n" -" Um valor negativo pode compensar o \"esmagamento\" da camada inicial, conhecido como \"pé de elefante\"." +msgstr "Quantidade de desvio aplicado a todos os polígonos na primeira camada.\n Um valor negativo pode compensar o \"esmagamento\" da camada inicial, conhecido como \"pé de elefante\"." #: fdmprinter.def.json msgctxt "z_seam_type label" @@ -1135,10 +1127,7 @@ msgstr "Alinhamento da Junta-Z" #: 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 "" -"Ponto inicial de cada trajetória de uma camada.\n" -"Quando as trajetórias em camadas consecutivas começam no mesmo ponto, pode aparecer uma junta vertical na impressão.\n" -" Ao alinhar o inicio das trajectórias próximo a uma posição definida pelo utilizador, é mais fácil remover a linha de junta. Quando dispostas aleatoriamente, as imprecisões no início das trajetórias serão menos perceptíveis. Ao adoptar a trajetória mais curta, a impressão será mais rápida." +msgstr "Ponto inicial de cada trajetória de uma camada.\nQuando as trajetórias em camadas consecutivas começam no mesmo ponto, pode aparecer uma junta vertical na impressão.\n Ao alinhar o inicio das trajectórias próximo a uma posição definida pelo utilizador, é mais fácil remover a linha de junta. Quando dispostas aleatoriamente, as imprecisões no início das trajetórias serão menos perceptíveis. Ao adoptar a trajetória mais curta, a impressão será mais rápida." #: fdmprinter.def.json msgctxt "z_seam_type option back" @@ -1517,7 +1506,7 @@ msgstr "Deslocar Enchimento em X" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is moved this distance along the X axis." -msgstr "" +msgstr "O padrão de preenchimento foi movido a esta distância ao longo do eixo X." # Desvio? # Delocar? deslocamento @@ -1530,7 +1519,7 @@ msgstr "Deslocar Enchimento em Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is moved this distance along the Y axis." -msgstr "" +msgstr "O padrão de preenchimento foi movido a esta distância ao longo do eixo Y." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1550,7 +1539,7 @@ msgstr "Sobreposição Enchimento (%)" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "A quantidade de sobreposição entre o preenchimento e as paredes, como percentagem de largura da linha de preenchimento. Uma ligeira sobreposição permite que as paredes sejam ligadas firmemente ao preenchimento." #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1570,7 +1559,7 @@ msgstr "Sobreposição Revestimento (%)" #: fdmprinter.def.json msgctxt "skin_overlap description" msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." -msgstr "" +msgstr "A quantidade de sobreposição entre o revestimento e as paredes, como percentagem de largura da linha de revestimento. Uma ligeira sobreposição permite que as paredes se liguem firmemente ao revestimento. Esta é uma percentagem das larguras médias de linha das linhas de revestimento e da parede mais interna." #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1805,7 +1794,7 @@ msgstr "Temperatura da base de construção" #: fdmprinter.def.json msgctxt "material_bed_temperature description" msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." -msgstr "" +msgstr "A temperatura utilizada para a placa de construção aquecida. Se for 0, a temperatura da base não será ajustada." #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3652,9 +3641,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 "" -"A distância horizontal entre o contorno e o perímetro exterior da primeira camada da impressão.\n" -"Esta é a distância mínima. Linhas múltiplas de contorno serão impressas para o exterior." +msgstr "A distância horizontal entre o contorno e o perímetro exterior da primeira camada da impressão.\nEsta é a distância mínima. Linhas múltiplas de contorno serão impressas para o exterior." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4449,82 +4436,82 @@ msgstr "experimental!" #: fdmprinter.def.json msgctxt "support_tree_enable label" msgid "Tree Support" -msgstr "" +msgstr "Suporte em árvore" #: fdmprinter.def.json msgctxt "support_tree_enable description" msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." -msgstr "" +msgstr "Crie uma estrutura em forma de árvore com ramos que suportem a sua impressão. Isto poderá reduzir a utilização de material e o tempo de impressão, mas aumentará consideravelmente o tempo de seccionamento." #: fdmprinter.def.json msgctxt "support_tree_angle label" msgid "Tree Support Branch Angle" -msgstr "" +msgstr "Ângulo dos ramos do suporte em árvore" #: fdmprinter.def.json msgctxt "support_tree_angle description" msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." -msgstr "" +msgstr "O ângulo dos ramos. Utilize um ângulo menor para torná-los mais verticais e estáveis. Utilize um ângulo maior para obter mais alcance." #: fdmprinter.def.json msgctxt "support_tree_branch_distance label" msgid "Tree Support Branch Distance" -msgstr "" +msgstr "Distância dos ramos do suporte em árvore" #: fdmprinter.def.json msgctxt "support_tree_branch_distance description" msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." -msgstr "" +msgstr "A distância a que os ramos devem encontrar-se ao entrar em contacto com o modelo. Diminuir esta distância irá fazer com que o suporte em árvore entre em contacto com o modelo em vários pontos, melhorando a qualidade das saliências, mas dificultando a sua remoção." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter label" msgid "Tree Support Branch Diameter" -msgstr "" +msgstr "Diâmetro dos ramos do suporte em árvore" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter description" msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." -msgstr "" +msgstr "O diâmetro dos ramos mais finos do suporte em árvore. Os ramos mais espessos são mais robustos. Os ramos tornar-se-ão mais espessos em direção à base." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle label" msgid "Tree Support Branch Diameter Angle" -msgstr "" +msgstr "Ângulo do diâmetro dos ramos do suporte em árvore" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle description" msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." -msgstr "" +msgstr "O ângulo do diâmetro dos ramos, à medida que ficam mais espessos em direção à base. Um ângulo de 0 irá causar uma espessura uniforme dos ramos ao longo do seu comprimento. Um ângulo reduzido poderá aumentar a estabilidade do suporte em árvore." #: fdmprinter.def.json msgctxt "support_tree_collision_resolution label" msgid "Tree Support Collision Resolution" -msgstr "" +msgstr "Resolução de colisão do suporte em árvore" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution description" msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." -msgstr "" +msgstr "Resolução do cálculo de colisões para evitar a colisão com o modelo. Uma definição inferior irá produzir árvores mais precisas com menos falhas, mas aumentar drasticamente o tempo de seccionamento." #: fdmprinter.def.json msgctxt "support_tree_wall_thickness label" msgid "Tree Support Wall Thickness" -msgstr "" +msgstr "Espessura das paredes do suporte em árvore" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness description" msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "A espessura das paredes dos ramos do suporte em árvore. As paredes mais espessas demoram mais tempo a imprimir, mas não caem tão facilmente." #: fdmprinter.def.json msgctxt "support_tree_wall_count label" msgid "Tree Support Wall Line Count" -msgstr "" +msgstr "Contagem de linhas das paredes do suporte em árvore" #: fdmprinter.def.json msgctxt "support_tree_wall_count description" msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "O número de paredes dos ramos do suporte em árvore. As paredes mais espessas demoram mais tempo a imprimir, mas não caem tão facilmente." #: fdmprinter.def.json msgctxt "slicing_tolerance label" @@ -4601,12 +4588,12 @@ msgstr "Uma lista de ângulos (números inteiros) relativos às direções de li #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization label" msgid "Infill Travel Optimization" -msgstr "" +msgstr "Otimização da deslocação de preenchimento" #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization description" msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." -msgstr "" +msgstr "Quando ativada, a ordem pela qual as linhas de preenchimento são impressas é otimizada para reduzir a distância percorrida. A redução do tempo de deslocação alcançado depende em grande medida do modelo a segmentar, do padrão de preenchimento, da densidade etc. Observe que, em alguns modelos com muitas áreas de preenchimento reduzidas, o tempo de segmentação do modelo pode aumentar consideravelmente." #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" @@ -5142,9 +5129,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 "" -"A distância de um movimento ascendente que é extrudido a metade da velocidade.\n" -"Isto pode causar melhor aderência às camadas anteriores, sendo que o material nessas camadas não é demasiado aquecido. Aplica-se apenas à impressão de fios." +msgstr "A distância de um movimento ascendente que é extrudido a metade da velocidade.\nIsto pode causar melhor aderência às camadas anteriores, sendo que o material nessas camadas não é demasiado aquecido. Aplica-se apenas à impressão de fios." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5254,42 +5239,42 @@ msgstr "Distância entre o nozzle e as linhas horizontais descendentes. Uma maio #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled label" msgid "Use adaptive layers" -msgstr "" +msgstr "Utilizar camadas adaptáveis" #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled description" msgid "Adaptive layers computes the layer heights depending on the shape of the model." -msgstr "" +msgstr "As camadas adaptáveis calculam a altura da camada dependendo da forma do modelo." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation label" msgid "Adaptive layers maximum variation" -msgstr "" +msgstr "Variação máxima das camadas adaptáveis" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height in mm." -msgstr "" +msgstr "A altura máxima permitida em comparação com a altura da camada da base em mm." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" msgid "Adaptive layers variation step size" -msgstr "" +msgstr "Tamanho da fase de variação das camadas adaptáveis" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step description" msgid "The difference in height of the next layer height compared to the previous one." -msgstr "" +msgstr "A diferença de altura da camada seguinte em comparação com a anterior." #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold label" msgid "Adaptive layers threshold" -msgstr "" +msgstr "Limite das camadas adaptáveis" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold description" msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." -msgstr "" +msgstr "Limita ou não a utilização de uma camada mais pequena. Este número é comparado com a tangente da inclinação mais acentuada numa camada." #: fdmprinter.def.json msgctxt "command_line_settings label" diff --git a/resources/i18n/ru_RU/cura.po b/resources/i18n/ru_RU/cura.po index ff07772555..4bae22f214 100644 --- a/resources/i18n/ru_RU/cura.po +++ b/resources/i18n/ru_RU/cura.po @@ -189,7 +189,7 @@ msgstr "Прошивка принтера" #: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Prepare" -msgstr "" +msgstr "Подготовка" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -562,7 +562,7 @@ msgstr "Открыть интерфейс с заданиями печати в #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 msgctxt "@label Printer name" msgid "Unknown" -msgstr "" +msgstr "Неизвестно" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format @@ -597,7 +597,7 @@ msgstr "Подключиться через сеть" #: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Monitor" -msgstr "" +msgstr "Монитор" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format @@ -624,7 +624,7 @@ msgstr "Не могу получить информацию об обновле #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." -msgstr "" +msgstr "При открытии вашего файла поступили сообщения об ошибках от SolidWorks. Рекомендуется устранить данные проблемы непосредственно в SolidWorks." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 msgctxt "@info:status" @@ -632,7 +632,7 @@ msgid "" "Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" "\n" " Thanks!." -msgstr "" +msgstr "В вашем чертеже не обнаружены модели. Проверьте еще раз его содержимое и убедитесь в наличии одной части или сборки.\n\nБлагодарим!" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 msgctxt "@info:status" @@ -640,7 +640,7 @@ msgid "" "Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" "\n" "Sorry!" -msgstr "" +msgstr "В вашем чертеже обнаружено больше одной части или сборки. В данный момент поддерживаются исключительно чертежи с одной частью или сборкой.\n\nСожалеем!" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" @@ -655,7 +655,7 @@ msgstr "Файл сборки SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 msgctxt "@item:inlistbox" msgid "SolidWorks drawing file" -msgstr "" +msgstr "Файл чертежа SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 msgctxt "@info:status" @@ -665,7 +665,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Уважаемый клиент!\nМы не обнаружили подходящую установку SolidWorks в вашей системе. Это означает, что ПО SolidWorks не установлено либо у вас нет подходящей лицензии. Убедитесь, что при запуске ПО SolidWorks оно работает надлежащим образом и (или) обратитесь к своим специалистам по ИКТ.\n\nС наилучшими пожеланиями,\n - Томас Карл Петровски (Thomas Karl Pietrowski)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 msgctxt "@info:status" @@ -675,7 +675,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Уважаемый клиент!\nВ данный момент этот плагин запущен в операционной системе, отличной от Windows. Плагин функционирует исключительно под управлением ОС Windows с установленным ПО SolidWorks, для которого имеется подходящая лицензия. Установите данный плагин на принтер под управлением Windows с установленным ПО SolidWorks.\n\nС наилучшими пожеланиями,\n - Томас Карл Петровски (Thomas Karl Pietrowski)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" @@ -683,7 +683,7 @@ msgstr "Настройка" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 msgid "Installation guide for SolidWorks macro" -msgstr "" +msgstr "Руководство по установке макроса SolidWorks" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" @@ -707,7 +707,7 @@ msgstr "Изменить G-код" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" msgid "Cura collects anonymized usage statistics." -msgstr "" +msgstr "Cura собирает анонимизированную статистику об использовании." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -717,22 +717,22 @@ msgstr "Сбор данных" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Allow" -msgstr "" +msgstr "Разрешить" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." -msgstr "" +msgstr "Разрешить Cura отправлять анонимизированную статистику об использовании, чтобы помочь назначить приоритеты будущим улучшениям в Cura. Отправлены некоторые ваши настройки и параметры, включая версию Cura и хэш моделей, разделяемых на слои." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 msgctxt "@action:button" msgid "Disable" -msgstr "" +msgstr "Отключить" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:tooltip" msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." -msgstr "" +msgstr "Запретить Cura отправлять анонимизированную статистику об использовании. Данное разрешение можно повторно активировать в разделе параметров." #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -742,14 +742,14 @@ msgstr "Профили Cura 15.04" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 msgctxt "@item:inlistbox" msgid "Blender file" -msgstr "" +msgstr "Файл Blender" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 msgctxt "@info:status" msgid "" "Could not export using \"{}\" quality!\n" "Felt back to \"{}\"." -msgstr "" +msgstr "Не удалось выполнить экспорт с использованием качества \"{}\"!\nВыполнен возврат к \"{}\"." #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 @@ -936,12 +936,12 @@ msgstr "Профиль Cura" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 msgctxt "@item:inmenu" msgid "Profile Assistant" -msgstr "" +msgstr "Помощник по профилю" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 msgctxt "@item:inlistbox" msgid "Profile Assistant" -msgstr "" +msgstr "Помощник по профилю" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" @@ -1139,13 +1139,13 @@ msgstr "Невозможно импортировать профиль из or !" msgid "This profile {0} contains incorrect data, could not import it." -msgstr "" +msgstr "Данный профиль {0} содержит неверные данные, поэтому его невозможно импортировать." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." -msgstr "" +msgstr "Аппарат, заданный в профиле {0}, не совпадает с вашим текущим аппаратом, поэтому его невозможно импортировать." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format @@ -1157,7 +1157,7 @@ msgstr "Успешно импортирован профиль {0}" #, python-brace-format msgctxt "@info:status" msgid "File {0} does not contain any valid profile." -msgstr "" +msgstr "В файле {0} нет подходящих профилей." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format @@ -1185,7 +1185,7 @@ msgstr "Невозможно найти тип качества {0} для те #, python-brace-format msgctxt "@label" msgid "Group #{group_nr}" -msgstr "" +msgstr "Группа #{group_nr}" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" @@ -1244,7 +1244,7 @@ msgid "" "

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

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

    Возникла критическая ошибка. Отправьте нам этот отчет о сбое, чтобы мы могли устранить проблему

    \n

    Нажмите кнопку «Отправить отчёт», чтобы автоматически отправить отчет об ошибке на наши серверы

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" @@ -1259,32 +1259,32 @@ msgstr "Неизвестно" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 msgctxt "@label Cura version number" msgid "Cura version" -msgstr "" +msgstr "Версия Cura" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 msgctxt "@label Type of platform" msgid "Platform" -msgstr "" +msgstr "Платформа" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 msgctxt "@label" msgid "Qt version" -msgstr "" +msgstr "Версия Qt" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 msgctxt "@label" msgid "PyQt version" -msgstr "" +msgstr "Версия PyQt" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 msgctxt "@label OpenGL version" msgid "OpenGL" -msgstr "" +msgstr "OpenGL" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 msgctxt "@label" msgid "not yet initialised
    " -msgstr "" +msgstr "в данный момент не инициализировано
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format @@ -1307,7 +1307,7 @@ msgstr "
  • Средство визуализации OpenGL: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" msgid "Error traceback" -msgstr "" +msgstr "Обратное отслеживание ошибки" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" @@ -1518,7 +1518,7 @@ msgstr "Диаметр сопла" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 msgctxt "@label" msgid "Compatible material diameter" -msgstr "" +msgstr "Диаметр совместимого материала" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 msgctxt "@tooltip" @@ -1620,10 +1620,7 @@ 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 "" -"Для печати на вашем принтере через сеть, пожалуйста, удостоверьтесь, что ваш принтер подключен к сети с помощью кабеля или через WiFi. Если вы не подключили Cura к вашему принтеру, вы по прежнему можете использовать USB флешку для переноса G-Code файлов на ваш принтер.\n" -"\n" -"Укажите ваш принтер в списке ниже:" +msgstr "Для печати на вашем принтере через сеть, пожалуйста, удостоверьтесь, что ваш принтер подключен к сети с помощью кабеля или через WiFi. Если вы не подключили Cura к вашему принтеру, вы по прежнему можете использовать USB флешку для переноса G-Code файлов на ваш принтер.\n\nУкажите ваш принтер в списке ниже:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1663,12 +1660,12 @@ msgstr "Тип" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "" +msgstr "Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "" +msgstr "Ultimaker 3 Extended" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1735,7 +1732,7 @@ msgstr "%1 не настроен для управления группой по #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 msgctxt "@label link to connect manager" msgid "Add/Remove printers" -msgstr "" +msgstr "Добавить/удалить принтеры" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" @@ -1775,7 +1772,7 @@ msgstr "Потеряно соединение с принтером" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 msgctxt "@label Printer status" msgid "Unknown" -msgstr "" +msgstr "Неизвестно" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" @@ -1871,164 +1868,164 @@ msgstr "Активировать конфигурацию" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" msgid "SolidWorks: Export wizard" -msgstr "" +msgstr "SolidWorks: Мастер экспорта" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" msgid "Quality:" -msgstr "" +msgstr "Качество:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (3D-printing)" -msgstr "" +msgstr "Точное (3D-печать)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (3D-printing)" -msgstr "" +msgstr "Грубое (3D-печать)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (SolidWorks)" -msgstr "" +msgstr "Точное (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (SolidWorks)" -msgstr "" +msgstr "Грубое (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" msgid "Show this dialog again" -msgstr "" +msgstr "Показывать это диалоговое окно в дальнейшем" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 msgctxt "@action:button" msgid "Continue" -msgstr "" +msgstr "Продолжить" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 msgctxt "@action:button" msgid "Abort" -msgstr "" +msgstr "Прервать" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 msgctxt "@title:window" msgid "How to install Cura SolidWorks macro" -msgstr "" +msgstr "Порядок установки макроса Cura SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 msgctxt "@description:label" msgid "Steps:" -msgstr "" +msgstr "Шаги:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 msgctxt "@action:button" msgid "" "Open the directory\n" "with macro and icon" -msgstr "" +msgstr "Откройте каталог\nс макросом и значком" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 msgctxt "@description:label" msgid "Instructions:" -msgstr "" +msgstr "Инструкции:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 msgctxt "@action:playpause" msgid "Play" -msgstr "" +msgstr "Воспроизвести" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 msgctxt "@action:playpause" msgid "Pause" -msgstr "" +msgstr "Пауза" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 msgctxt "@action:button" msgid "Previous Step" -msgstr "" +msgstr "Предыдущий шаг" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 msgctxt "@action:button" msgid "Done" -msgstr "" +msgstr "Готово" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 msgctxt "@action:button" msgid "Next Step" -msgstr "" +msgstr "Следующий шаг" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 msgctxt "@title:window" msgid "SolidWorks plugin: Configuration" -msgstr "" +msgstr "Плагин SolidWorks: Конфигурация" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 msgctxt "@title:tab" msgid "Conversion settings" -msgstr "" +msgstr "Настройки преобразования" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 msgctxt "@label" msgid "First choice:" -msgstr "" +msgstr "Первый выбранный вариант:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 msgctxt "@text:menu" msgid "Latest installed version (Recommended)" -msgstr "" +msgstr "Последняя установленная версия (рекомендуется)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 msgctxt "@text:menu" msgid "Default version" -msgstr "" +msgstr "Версия по умолчанию" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 msgctxt "@label" msgid "Show wizard before opening SolidWorks files" -msgstr "" +msgstr "Показывать окно мастера перед открытием файлов SolidWorks" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 msgctxt "@label" msgid "Automatically rotate opened file into normed orientation" -msgstr "" +msgstr "Автоматически поворачивать открытый файл с применением нормированной ориентации" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 msgctxt "@title:tab" msgid "Installation(s)" -msgstr "" +msgstr "Установка (-и)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 msgctxt "@label" msgid "COM service found" -msgstr "" +msgstr "Обнаружена служба COM" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 msgctxt "@label" msgid "Executable found" -msgstr "" +msgstr "Обнаружен исполняемый файл" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 msgctxt "@label" msgid "COM starting" -msgstr "" +msgstr "COM запускается" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 msgctxt "@label" msgid "Revision number" -msgstr "" +msgstr "Номер редакции" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 msgctxt "@label" msgid "Functions available" -msgstr "" +msgstr "Доступные функции" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 @@ -2214,32 +2211,32 @@ msgstr "Сглаживание" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 msgctxt "@label" msgid "Mesh Type" -msgstr "" +msgstr "Тип объекта" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 msgctxt "@label" msgid "Normal model" -msgstr "" +msgstr "Нормальная модель" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 msgctxt "@label" msgid "Print as support" -msgstr "" +msgstr "Печать в качестве поддержки" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 msgctxt "@label" msgid "Don't support overlap with other models" -msgstr "" +msgstr "Не поддерживать перекрытие с другими моделями" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 msgctxt "@label" msgid "Modify settings for overlap with other models" -msgstr "" +msgstr "Изменять настройки для перекрытия с другими моделями" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 msgctxt "@label" msgid "Modify settings for infill of other models" -msgstr "" +msgstr "Изменять настройки для заполнения других моделей" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" @@ -2427,10 +2424,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Этот плагин содержит лицензию.\n" -"Чтобы установить этот плагин, необходимо принять условия лицензии.\n" -"Принять приведенные ниже условия?" +msgstr "Этот плагин содержит лицензию.\nЧтобы установить этот плагин, необходимо принять условия лицензии.\nПринять приведенные ниже условия?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2695,9 +2689,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Вы изменили некоторые параметры профиля.\n" -"Желаете сохранить их или вернуть к прежним значениям?" +msgstr "Вы изменили некоторые параметры профиля.\nЖелаете сохранить их или вернуть к прежним значениям?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3101,27 +3093,27 @@ msgstr "Отправлять (анонимно) информацию о печа #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 msgctxt "@label" msgid "Experimental" -msgstr "" +msgstr "Экспериментальное" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 msgctxt "@info:tooltip" msgid "Use multi build plate functionality" -msgstr "" +msgstr "Использовать функционал нескольких рабочих столов" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 msgctxt "@option:check" msgid "Use multi build plate functionality (restart required)" -msgstr "" +msgstr "Использовать функционал нескольких рабочих столов (требуется перезапуск)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 msgctxt "@info:tooltip" msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" -msgstr "" +msgstr "Должны ли новые загруженные модели выравниваться на рабочем столе? Используется в сочетании с несколькими рабочими столами (ЭКСПЕРИМЕНТАЛЬНАЯ ОПЦИЯ)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 msgctxt "@option:check" msgid "Do not arrange objects on load" -msgstr "" +msgstr "Не выравнивать объекты под нагрузкой" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 @@ -3365,9 +3357,7 @@ 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 разработана компанией Ultimaker B.V. совместно с сообществом.\n" -"Cura использует следующие проекты с открытым исходным кодом:" +msgstr "Cura разработана компанией Ultimaker B.V. совместно с сообществом.\nCura использует следующие проекты с открытым исходным кодом:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3475,10 +3465,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Значения некоторых параметров отличаются от значений профиля.\n" -"\n" -"Нажмите для открытия менеджера профилей." +msgstr "Значения некоторых параметров отличаются от значений профиля.\n\nНажмите для открытия менеджера профилей." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" @@ -3516,10 +3503,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Некоторые из скрытых параметров используют значения, отличающиеся от их вычисленных значений.\n" -"\n" -"Щёлкните. чтобы сделать эти параметры видимыми." +msgstr "Некоторые из скрытых параметров используют значения, отличающиеся от их вычисленных значений.\n\nЩёлкните. чтобы сделать эти параметры видимыми." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3534,7 +3518,7 @@ msgstr "Зависит от" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." -msgstr "" +msgstr "Данная настройка всегда используется совместно всеми экструдерами. Изменение данного значения приведет к изменению значения для всех экструдеров." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" @@ -3547,10 +3531,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Значение этого параметра отличается от значения в профиле.\n" -"\n" -"Щёлкните для восстановления значения из профиля." +msgstr "Значение этого параметра отличается от значения в профиле.\n\nЩёлкните для восстановления значения из профиля." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" @@ -3558,10 +3539,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Обычно это значение вычисляется, но в настоящий момент было установлено явно.\n" -"\n" -"Щёлкните для восстановления вычисленного значения." +msgstr "Обычно это значение вычисляется, но в настоящий момент было установлено явно.\n\nЩёлкните для восстановления вычисленного значения." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" @@ -3573,9 +3551,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Настройка принтера отключена\n" -"G-code файлы нельзя изменять" +msgstr "Настройка принтера отключена\nG-code файлы нельзя изменять" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" @@ -3585,7 +3561,7 @@ msgstr "00 ч 00 мин" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" msgid "Time specification" -msgstr "" +msgstr "Настройка расчета времени" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" @@ -3642,12 +3618,12 @@ msgstr "Вид" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 msgctxt "@action:inmenu menubar:view" msgid "&Camera position" -msgstr "" +msgstr "Положение камеры" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "" +msgstr "Рабочий стол" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" @@ -3819,27 +3795,27 @@ msgstr "Выход" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" msgid "&3D View" -msgstr "" +msgstr "Трехмерный вид" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:view" msgid "&Front View" -msgstr "" +msgstr "Вид спереди" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 msgctxt "@action:inmenu menubar:view" msgid "&Top View" -msgstr "" +msgstr "Вид сверху" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 msgctxt "@action:inmenu menubar:view" msgid "&Left Side View" -msgstr "" +msgstr "Вид слева" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:view" msgid "&Right Side View" -msgstr "" +msgstr "Вид справа" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" @@ -3968,7 +3944,7 @@ msgstr "Перезагрузить все модели" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "" +msgstr "Выровнять все модели по всем рабочим столам" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" @@ -4028,7 +4004,7 @@ msgstr "Установленные плагины..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 msgctxt "@action:inmenu menubar:view" msgid "Expand/Collapse Sidebar" -msgstr "" +msgstr "Развернуть/свернуть боковую панель" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" @@ -4063,12 +4039,12 @@ msgstr "Нарезка недоступна" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Slice current printjob" -msgstr "" +msgstr "Разделить на слои текущее задание на печать" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Cancel slicing process" -msgstr "" +msgstr "Отмена разделения на слои" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" @@ -4124,7 +4100,7 @@ msgstr "Сохранить как..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" msgid "Save &Project..." -msgstr "" +msgstr "Сохранить проект..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" @@ -4364,7 +4340,7 @@ msgstr "Материал" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Проверить совместимость" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" @@ -4374,17 +4350,17 @@ msgstr "Нажмите для проверки совместимости мат #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 msgctxt "@option:check" msgid "See only current build plate" -msgstr "" +msgstr "Показывать только текущий рабочий стол" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 msgctxt "@action:button" msgid "Arrange to all build plates" -msgstr "" +msgstr "Выровнять для всех рабочих столов" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 msgctxt "@action:button" msgid "Arrange current build plate" -msgstr "" +msgstr "Выровнять текущий рабочий стол" #: MachineSettingsAction/plugin.json msgctxt "description" @@ -4479,22 +4455,22 @@ msgstr "Печать через USB" #: PrepareStage/plugin.json msgctxt "description" msgid "Provides a prepare stage in Cura." -msgstr "" +msgstr "Обеспечивает подготовительный этап в Cura." #: PrepareStage/plugin.json msgctxt "name" msgid "Prepare Stage" -msgstr "" +msgstr "Подготовительный этап" #: CuraLiveScriptingPlugin/plugin.json msgctxt "description" msgid "Provides an edit window for direct script editing." -msgstr "" +msgstr "Открывает окно редактирования для непосредственного редактирования скриптов." #: CuraLiveScriptingPlugin/plugin.json msgctxt "name" msgid "Live scripting tool" -msgstr "" +msgstr "Интерактивный инструмент для работы со скриптами" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" @@ -4519,12 +4495,12 @@ msgstr "Соединение с сетью UM3" #: MonitorStage/plugin.json msgctxt "description" msgid "Provides a monitor stage in Cura." -msgstr "" +msgstr "Обеспечивает этап мониторинга в Cura." #: MonitorStage/plugin.json msgctxt "name" msgid "Monitor Stage" -msgstr "" +msgstr "Этап мониторинга" #: FirmwareUpdateChecker/plugin.json msgctxt "description" @@ -4539,7 +4515,7 @@ msgstr "Проверка обновлений" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." -msgstr "" +msgstr "Позволяет открывать определенные файлы непосредственно с помощью SolidWorks. Преобразование выполняется с помощью данного плагина и дополнительных оптимизаций." #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4609,12 +4585,12 @@ msgstr "Чтение устаревших профилей Cura" #: CuraBlenderPlugin/plugin.json msgctxt "description" msgid "Helps to open Blender files directly in Cura." -msgstr "" +msgstr "Помогает открывать файлы Blender непосредственно в Cura." #: CuraBlenderPlugin/plugin.json msgctxt "name" msgid "Blender Integration (experimental)" -msgstr "" +msgstr "Интеграция Blender (экспериментальная опция)" #: GCodeProfileReader/plugin.json msgctxt "description" @@ -4779,12 +4755,12 @@ msgstr "Запись профиля Cura" #: CuraPrintProfileCreator/plugin.json msgctxt "description" msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." -msgstr "" +msgstr "Позволяет производителям материалов создавать новые профили материалов и качества с помощью дружественного интерфейса." #: CuraPrintProfileCreator/plugin.json msgctxt "name" msgid "Print Profile Assistant" -msgstr "" +msgstr "Помощник по профилю печати" #: 3MFWriter/plugin.json msgctxt "description" diff --git a/resources/i18n/ru_RU/fdmprinter.def.json.po b/resources/i18n/ru_RU/fdmprinter.def.json.po index 72f419ade9..036d0d5edc 100644 --- a/resources/i18n/ru_RU/fdmprinter.def.json.po +++ b/resources/i18n/ru_RU/fdmprinter.def.json.po @@ -58,9 +58,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"Команды в G-коде, которые будут выполнены при старте печати, разделённые \n" -"." +msgstr "Команды в G-коде, которые будут выполнены при старте печати, разделённые \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -72,9 +70,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"Команды в G-коде, которые будут выполнены в конце печати, разделённые \n" -"." +msgstr "Команды в G-коде, которые будут выполнены в конце печати, разделённые \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -354,12 +350,12 @@ msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_firmware_retract label" msgid "Firmware Retraction" -msgstr "" +msgstr "Откат встроенного программного обеспечения" #: fdmprinter.def.json msgctxt "machine_firmware_retract description" msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." -msgstr "" +msgstr "Определяет, использовать ли команды отката встроенного программного обеспечения (G10/G11) вместо применения свойства E в командах G1 для отката материала." #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" @@ -1054,12 +1050,12 @@ msgstr "Везде" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps label" msgid "Filter Out Tiny Gaps" -msgstr "" +msgstr "Фильтровать только небольшие зазоры" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps description" msgid "Filter out tiny gaps to reduce blobs on outside of model." -msgstr "" +msgstr "Фильтровать только небольшие зазоры для сокращения пузырей за пределами модели." #: fdmprinter.def.json msgctxt "fill_outline_gaps label" @@ -1444,7 +1440,7 @@ msgstr "Смещение заполнения по X" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is moved this distance along the X axis." -msgstr "" +msgstr "Расстояние перемещения шаблона заполнения по оси X." #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1454,7 +1450,7 @@ msgstr "Смещение заполнения по Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is moved this distance along the Y axis." -msgstr "" +msgstr "Расстояние перемещения шаблона заполнения по оси Y." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1474,7 +1470,7 @@ msgstr "Процент перекрытие заполнения" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "Величина перекрытия между заполнением и стенками в виде процентного отношения от ширины линии заполнения. Небольшое перекрытие позволяет стенкам надежно соединяться с заполнением." #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1494,7 +1490,7 @@ msgstr "Процент перекрытия оболочек" #: fdmprinter.def.json msgctxt "skin_overlap description" msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." -msgstr "" +msgstr "Величина перекрытия между оболочкой и стенками в виде процентного отношения от ширины линии оболочки. Небольшое перекрытие позволяет стенкам надежно соединяться с оболочкой. Это значение является процентным отношением от средней ширины линии оболочки и внутренней стенки." #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1724,7 +1720,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 temperature will not be adjusted." -msgstr "" +msgstr "Температура, задаваемая для разогретого рабочего стола. Если значение равно 0, температура основания не будет регулироваться." #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3506,9 +3502,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 "" -"Горизонтальное расстояние между юбкой и первым слоем печати.\n" -"Минимальное расстояние. Несколько линий юбки будут расширяться от этого расстояния." +msgstr "Горизонтальное расстояние между юбкой и первым слоем печати.\nМинимальное расстояние. Несколько линий юбки будут расширяться от этого расстояния." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4268,82 +4262,82 @@ msgstr "экспериментальное!" #: fdmprinter.def.json msgctxt "support_tree_enable label" msgid "Tree Support" -msgstr "" +msgstr "Древовидная поддержка" #: fdmprinter.def.json msgctxt "support_tree_enable description" msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." -msgstr "" +msgstr "Генерирование древовидной поддержки с ответвлениями, поддерживающими вашу печать. Данная опция может сэкономить материал и сократить время печати, однако при этом существенно возрастает время разделения на слои." #: fdmprinter.def.json msgctxt "support_tree_angle label" msgid "Tree Support Branch Angle" -msgstr "" +msgstr "Угол ответвления древовидной поддержки" #: fdmprinter.def.json msgctxt "support_tree_angle description" msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." -msgstr "" +msgstr "Угол ответвлений. При указании меньшего угла поддержка будет более вертикальной и устойчивой. Для получения большего охвата указывайте более высокий угол." #: fdmprinter.def.json msgctxt "support_tree_branch_distance label" msgid "Tree Support Branch Distance" -msgstr "" +msgstr "Расстояние ответвления древовидной поддержки" #: fdmprinter.def.json msgctxt "support_tree_branch_distance description" msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." -msgstr "" +msgstr "Указывает, насколько далеко должны друг от друга располагаться ответвления при касании модели. Если задать небольшое расстояние, увеличится количество точек, в которых древовидная поддержка касается модели; это улучшает нависание, но при этом усложняет удаление поддержки." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter label" msgid "Tree Support Branch Diameter" -msgstr "" +msgstr "Диаметр ответвления древовидной поддержки" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter description" msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." -msgstr "" +msgstr "Диаметр самых тонких ответвлений древовидной поддержки. Чем толще ответвление, тем оно крепче. Ответвления возле основания будут иметь толщину, превышающую данное значение." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle label" msgid "Tree Support Branch Diameter Angle" -msgstr "" +msgstr "Угол диаметра ответвления древовидной поддержки" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle description" msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." -msgstr "" +msgstr "Угол диаметра ответвлений по мере их постепенного утолщения к основанию. Если значение угла равно 0, ответвления будут иметь одинаковую толщину по всей своей длине. Небольшой угол может повысить устойчивость древовидной поддержки." #: fdmprinter.def.json msgctxt "support_tree_collision_resolution label" msgid "Tree Support Collision Resolution" -msgstr "" +msgstr "Разрешение для расчета столкновений древовидной поддержки" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution description" msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." -msgstr "" +msgstr "Разрешение, применяемое при расчете столкновений во избежание столкновений с моделью. Если указать меньшее значение, древовидные структуры будут получаться более точными и устойчивыми, однако при этом значительно увеличится время разделения на слои." #: fdmprinter.def.json msgctxt "support_tree_wall_thickness label" msgid "Tree Support Wall Thickness" -msgstr "" +msgstr "Толщина стенки древовидной поддержки" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness description" msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "Толщина стенок ответвлений древовидной поддержки. Для печати утолщенных стенок требуется больше времени, однако при этом возрастает устойчивость поддержки." #: fdmprinter.def.json msgctxt "support_tree_wall_count label" msgid "Tree Support Wall Line Count" -msgstr "" +msgstr "Количество линий стенки древовидной поддержки" #: fdmprinter.def.json msgctxt "support_tree_wall_count description" msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "Количество стенок ответвлений древовидной поддержки. Для печати утолщенных стенок требуется больше времени, однако при этом возрастает устойчивость поддержки." #: fdmprinter.def.json msgctxt "slicing_tolerance label" @@ -4418,12 +4412,12 @@ msgstr "Список направлений линии при печати сл #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization label" msgid "Infill Travel Optimization" -msgstr "" +msgstr "Оптимизация перемещения заполнения" #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization description" msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." -msgstr "" +msgstr "Если включено, заказ, в котором печатаются линии заполнения, оптимизируется для сокращения пройденного расстояния. Достигнутое сокращение времени перемещения в очень большой степени зависит от модели, разделяемой на слои, шаблона заполнения, плотности и т. п. Обратите внимание, что для некоторых моделей, имеющих множество небольших заполняемых областей, время разделения на слои может существенно возрасти." #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" @@ -4945,9 +4939,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 "" -"Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\n" -"Это может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при каркасной печати." +msgstr "Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\nЭто может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при каркасной печати." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5057,42 +5049,42 @@ msgstr "Зазор между соплом и горизонтально нис #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled label" msgid "Use adaptive layers" -msgstr "" +msgstr "Использовать адаптивные слои" #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled description" msgid "Adaptive layers computes the layer heights depending on the shape of the model." -msgstr "" +msgstr "В случае адаптивных слоев расчет высоты слоя осуществляется в зависимости от формы модели." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation label" msgid "Adaptive layers maximum variation" -msgstr "" +msgstr "Максимальная вариация адаптивных слоев" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height in mm." -msgstr "" +msgstr "Максимальная разрешенная высота по сравнению с высотой базового уровня (в мм)." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" msgid "Adaptive layers variation step size" -msgstr "" +msgstr "Размер шага вариации адаптивных слоев" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step description" msgid "The difference in height of the next layer height compared to the previous one." -msgstr "" +msgstr "Разница между высотой следующего слоя и высотой предыдущего слоя." #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold label" msgid "Adaptive layers threshold" -msgstr "" +msgstr "Порог для адаптивных слове" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold description" msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." -msgstr "" +msgstr "Пороговое значение, при достижении которого будет использоваться меньший слой. Это число сравнивается с тангенсом наиболее крутого наклона в слое." #: fdmprinter.def.json msgctxt "command_line_settings label" diff --git a/resources/i18n/tr_TR/cura.po b/resources/i18n/tr_TR/cura.po index f449a2a44b..a955cd5a4e 100644 --- a/resources/i18n/tr_TR/cura.po +++ b/resources/i18n/tr_TR/cura.po @@ -187,7 +187,7 @@ msgstr "Yazıcı Bellenimi" #: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Prepare" -msgstr "" +msgstr "Hazırla" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -560,7 +560,7 @@ msgstr "Yazdırma işleri arayüzünü tarayıcınızda açar." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 msgctxt "@label Printer name" msgid "Unknown" -msgstr "" +msgstr "Bilinmeyen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format @@ -595,7 +595,7 @@ msgstr "Ağ ile Bağlan" #: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Monitor" -msgstr "" +msgstr "Görüntüle" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format @@ -622,7 +622,7 @@ msgstr "Güncelleme bilgilerine erişilemedi." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." -msgstr "" +msgstr "Dosyanızı açarken SolidWorks tarafından hata rapor edildi. Bu sorunları SolidWorks’ün içinde çözmenizi öneririz." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 msgctxt "@info:status" @@ -630,7 +630,7 @@ msgid "" "Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" "\n" " Thanks!." -msgstr "" +msgstr "Çiziminizde model bulunamadı. İçeriğini tekrar kontrol edip bir parçanın veya düzeneğin içinde olduğunu teyit edebilir misiniz?\n\n Teşekkürler!." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 msgctxt "@info:status" @@ -638,7 +638,7 @@ msgid "" "Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" "\n" "Sorry!" -msgstr "" +msgstr "Çiziminizin içinde birden fazla parça veya düzenek bulundu. Şu anda sadece içerisinde bir parça veya düzenek olan çizimleri desteklemekteyiz.\n\nÜzgünüz!" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" @@ -653,7 +653,7 @@ msgstr "SolidWorks assembly dosyası" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 msgctxt "@item:inlistbox" msgid "SolidWorks drawing file" -msgstr "" +msgstr "SolidWorks çizim dosyası" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 msgctxt "@info:status" @@ -663,7 +663,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Sayın müşterimiz,\nSisteminizde SolidWorks’ün geçerli bir yüklemesini bulamadık. Ya sisteminizde SolidWorks yüklü değil ya da geçerli bir lisansa sahip değilsiniz. SolidWorks’ü tek başına sorunsuz bir biçimde çalıştırabildiğinizden emin olun ve/veya ICT’niz ile irtibata geçin.\n\nSaygılarımızla\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 msgctxt "@info:status" @@ -673,7 +673,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "Sayın müşterimiz,\nŞu anda bu eklentiyi Windows dışında farklı bir işletim sisteminde kullanmaktasınız. Bu eklenti sadece Windows işletim sisteminde, geçerli bir lisansa sahip, kurulu SolidWorks programıyla çalışır. Lütfen bu eklentiyi SolidWorks’ün kurulu olduğu Windows işletim sistemli bir bilgisayara yükleyin.\n\nSaygılarımızla\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" @@ -681,7 +681,7 @@ msgstr "Yapılandırma" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 msgid "Installation guide for SolidWorks macro" -msgstr "" +msgstr "SolidWorks makro kurulum rehberi" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" @@ -705,7 +705,7 @@ msgstr "GCode Değiştir" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" msgid "Cura collects anonymized usage statistics." -msgstr "" +msgstr "Cura anonimleştirilmiş kullanım istatistikleri toplar." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -715,22 +715,22 @@ msgstr "Veri Toplanıyor" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Allow" -msgstr "" +msgstr "İzin Verme" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." -msgstr "" +msgstr "Programın gelecek sürümlerinin iyileştirilmesine yardımcı olmak için Cura’ya anonimleştirilmiş kullanım istatistikleri gönderme izni verin. Tercih ve ayarlarınızın bazıları, Cura sürümü ve dilimlere ayırdığınız modellerin sağlaması gönderilir." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 msgctxt "@action:button" msgid "Disable" -msgstr "" +msgstr "Devre Dışı Bırakma" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:tooltip" msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." -msgstr "" +msgstr "Cura’nın anonimleştirilmiş kullanım istatistikleri göndermesine izin vermeyin. Tercihler sekmesinden tekrar açabilirsiniz." #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -740,14 +740,14 @@ msgstr "Cura 15.04 profilleri" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 msgctxt "@item:inlistbox" msgid "Blender file" -msgstr "" +msgstr "Blender dosyası" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 msgctxt "@info:status" msgid "" "Could not export using \"{}\" quality!\n" "Felt back to \"{}\"." -msgstr "" +msgstr "\"{}\" quality!\nFell back to \"{}\" kullanarak dışarı aktarım yapılamadı." #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 @@ -934,12 +934,12 @@ msgstr "Cura Profili" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 msgctxt "@item:inmenu" msgid "Profile Assistant" -msgstr "" +msgstr "Profil Asistanı" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 msgctxt "@item:inlistbox" msgid "Profile Assistant" -msgstr "" +msgstr "Profil Asistanı" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" @@ -1137,13 +1137,13 @@ msgstr "{0} dosyasından profil içe aktarımı başarısı #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "This profile {0} contains incorrect data, could not import it." -msgstr "" +msgstr "Bu profil {0} yanlış veri içermekte, içeri aktarılamadı." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." -msgstr "" +msgstr "Profilde {0} tanımlanan mevcut cihazınızla eşleşmemekte, içeri aktarılamadı." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format @@ -1155,7 +1155,7 @@ msgstr "Profil başarıyla içe aktarıldı {0}" #, python-brace-format msgctxt "@info:status" msgid "File {0} does not contain any valid profile." -msgstr "" +msgstr "Dosya {0} geçerli bir profil içermemekte." #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format @@ -1183,7 +1183,7 @@ msgstr "Mevcut yapılandırma için bir kalite tipi {0} bulunamıyor." #, python-brace-format msgctxt "@label" msgid "Group #{group_nr}" -msgstr "" +msgstr "Grup #{group_nr}" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" @@ -1242,7 +1242,7 @@ msgid "" "

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

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

    Onarılamaz bir hata oluştu. Lütfen sorunu çözmek için bize Çökme Raporunu gönderin

    \n

    Sunucularımıza otomatik olarak bir hata raporu yüklemek için lütfen \"Rapor gönder\" düğmesini kullanın

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" @@ -1257,32 +1257,32 @@ msgstr "Bilinmiyor" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 msgctxt "@label Cura version number" msgid "Cura version" -msgstr "" +msgstr "Cura sürümü" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 msgctxt "@label Type of platform" msgid "Platform" -msgstr "" +msgstr "Platform" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 msgctxt "@label" msgid "Qt version" -msgstr "" +msgstr "Qt Sürümü" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 msgctxt "@label" msgid "PyQt version" -msgstr "" +msgstr "PyQt Sürümü" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 msgctxt "@label OpenGL version" msgid "OpenGL" -msgstr "" +msgstr "OpenGL" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 msgctxt "@label" msgid "not yet initialised
    " -msgstr "" +msgstr "henüz başlatılmadı
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format @@ -1305,7 +1305,7 @@ msgstr "
  • OpenGL Oluşturucusu: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" msgid "Error traceback" -msgstr "" +msgstr "Hata geri izleme" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" @@ -1516,7 +1516,7 @@ msgstr "Nozzle boyutu" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 msgctxt "@label" msgid "Compatible material diameter" -msgstr "" +msgstr "Uyumlu malzeme çapı" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 msgctxt "@tooltip" @@ -1618,10 +1618,7 @@ 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 "" -"Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n" -"\n" -"Aşağıdaki listeden yazıcınızı seçin:" +msgstr "Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n\nAşağıdaki listeden yazıcınızı seçin:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1661,12 +1658,12 @@ msgstr "Tür" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "" +msgstr "Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "" +msgstr "Genişletilmiş Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1733,7 +1730,7 @@ msgstr "%1, bağlı Ultimaker 3 yazıcı grubunu barındırmak için ayarlı de #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 msgctxt "@label link to connect manager" msgid "Add/Remove printers" -msgstr "" +msgstr "Yazıcı Ekle/Kaldır" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" @@ -1773,7 +1770,7 @@ msgstr "Yazıcı bağlantısı koptu" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 msgctxt "@label Printer status" msgid "Unknown" -msgstr "" +msgstr "Bilinmeyen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" @@ -1869,164 +1866,164 @@ msgstr "Yapılandırmayı Etkinleştir" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" msgid "SolidWorks: Export wizard" -msgstr "" +msgstr "SolidWorks: Dışarı aktarma sihirbazı" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" msgid "Quality:" -msgstr "" +msgstr "Kalite:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (3D-printing)" -msgstr "" +msgstr "Yüksek Kaliteli (3 boyutlu baskı)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (3D-printing)" -msgstr "" +msgstr "Yüzeysel (3 boyutlu baskı)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (SolidWorks)" -msgstr "" +msgstr "Yüksek Kaliteli (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (SolidWorks)" -msgstr "" +msgstr "Yüzeysel (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" msgid "Show this dialog again" -msgstr "" +msgstr "Bu diyaloğu tekrardan göster" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 msgctxt "@action:button" msgid "Continue" -msgstr "" +msgstr "Devam Et" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 msgctxt "@action:button" msgid "Abort" -msgstr "" +msgstr "Durdur" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 msgctxt "@title:window" msgid "How to install Cura SolidWorks macro" -msgstr "" +msgstr "Cura SolidWorks makrosunun yüklenmesi" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 msgctxt "@description:label" msgid "Steps:" -msgstr "" +msgstr "Adımlar:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 msgctxt "@action:button" msgid "" "Open the directory\n" "with macro and icon" -msgstr "" +msgstr "Makro ve simge ile\ndizini açın" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 msgctxt "@description:label" msgid "Instructions:" -msgstr "" +msgstr "Talimatlar:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 msgctxt "@action:playpause" msgid "Play" -msgstr "" +msgstr "Oynat" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 msgctxt "@action:playpause" msgid "Pause" -msgstr "" +msgstr "Duraklat" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 msgctxt "@action:button" msgid "Previous Step" -msgstr "" +msgstr "Önceki Adım" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 msgctxt "@action:button" msgid "Done" -msgstr "" +msgstr "Bitti" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 msgctxt "@action:button" msgid "Next Step" -msgstr "" +msgstr "Sonraki Adım" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 msgctxt "@title:window" msgid "SolidWorks plugin: Configuration" -msgstr "" +msgstr "SolidWorks eklentisi: Yapılandırma" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 msgctxt "@title:tab" msgid "Conversion settings" -msgstr "" +msgstr "Dönüştürme ayarları" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 msgctxt "@label" msgid "First choice:" -msgstr "" +msgstr "İlk seçenek:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 msgctxt "@text:menu" msgid "Latest installed version (Recommended)" -msgstr "" +msgstr "Yüklü en son sürüm (Önerilen)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 msgctxt "@text:menu" msgid "Default version" -msgstr "" +msgstr "Varsayılan sürüm" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 msgctxt "@label" msgid "Show wizard before opening SolidWorks files" -msgstr "" +msgstr "SolidWorks dosyalarını açmadan önce sihirbazı göster" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 msgctxt "@label" msgid "Automatically rotate opened file into normed orientation" -msgstr "" +msgstr "Açılmış dosyayı normlu yöne döndür" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 msgctxt "@title:tab" msgid "Installation(s)" -msgstr "" +msgstr "Kurulumlar" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 msgctxt "@label" msgid "COM service found" -msgstr "" +msgstr "COM hizmeti bulundu" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 msgctxt "@label" msgid "Executable found" -msgstr "" +msgstr "Çalıştırılabilir dosya bulundu" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 msgctxt "@label" msgid "COM starting" -msgstr "" +msgstr "COM başlatılıyor" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 msgctxt "@label" msgid "Revision number" -msgstr "" +msgstr "Revizyon numarası" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 msgctxt "@label" msgid "Functions available" -msgstr "" +msgstr "Mevcut fonksiyonlar" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 @@ -2212,32 +2209,32 @@ msgstr "Düzeltme" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 msgctxt "@label" msgid "Mesh Type" -msgstr "" +msgstr "Ağ Tipi" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 msgctxt "@label" msgid "Normal model" -msgstr "" +msgstr "Normal model" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 msgctxt "@label" msgid "Print as support" -msgstr "" +msgstr "Destek olarak yazdır" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 msgctxt "@label" msgid "Don't support overlap with other models" -msgstr "" +msgstr "Diğer modellerle örtüşmeyi destekleme" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 msgctxt "@label" msgid "Modify settings for overlap with other models" -msgstr "" +msgstr "Diğer modellerle örtüşme ayarlarını değiştir" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 msgctxt "@label" msgid "Modify settings for infill of other models" -msgstr "" +msgstr "Diğer modellerle doldurma ayarlarını değiştir" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" @@ -2423,10 +2420,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"Bu eklenti bir lisans içerir.\n" -"Bu eklentiyi yüklemek için bu lisansı kabul etmeniz gerekir.\n" -"Aşağıdaki koşulları kabul ediyor musunuz?" +msgstr "Bu eklenti bir lisans içerir.\nBu eklentiyi yüklemek için bu lisansı kabul etmeniz gerekir.\nAşağıdaki koşulları kabul ediyor musunuz?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2691,9 +2685,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Bazı profil ayarlarını özelleştirdiniz.\n" -"Bu ayarları kaydetmek veya iptal etmek ister misiniz?" +msgstr "Bazı profil ayarlarını özelleştirdiniz.\nBu ayarları kaydetmek veya iptal etmek ister misiniz?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3097,27 +3089,27 @@ msgstr "(Anonim) yazdırma bilgisi gönder" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 msgctxt "@label" msgid "Experimental" -msgstr "" +msgstr "Deneysel" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 msgctxt "@info:tooltip" msgid "Use multi build plate functionality" -msgstr "" +msgstr "Çok yapılı levha fonksiyonelliğini kullan" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 msgctxt "@option:check" msgid "Use multi build plate functionality (restart required)" -msgstr "" +msgstr "Çok yapılı levha fonksiyonelliğini kullan (yeniden başlatma gerektirir)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 msgctxt "@info:tooltip" msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" -msgstr "" +msgstr "Yeni yüklenen modeller yapılı levhaya mı yerleştirilsin? Çok yapılı levha ile birlikte kullanılır (DENEYSEL)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 msgctxt "@option:check" msgid "Do not arrange objects on load" -msgstr "" +msgstr "Yüklemenin ardından nesneleri yerleştirme" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 @@ -3361,9 +3353,7 @@ 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, topluluk iş birliği ile Ultimaker B.V. tarafından geliştirilmiştir.\n" -"Cura aşağıdaki açık kaynak projelerini gururla kullanmaktadır:" +msgstr "Cura, topluluk iş birliği ile Ultimaker B.V. tarafından geliştirilmiştir.\nCura aşağıdaki açık kaynak projelerini gururla kullanmaktadır:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3471,10 +3461,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Bazı ayar/geçersiz kılma değerleri profilinizde saklanan değerlerden farklıdır.\n" -"\n" -"Profil yöneticisini açmak için tıklayın." +msgstr "Bazı ayar/geçersiz kılma değerleri profilinizde saklanan değerlerden farklıdır.\n\nProfil yöneticisini açmak için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" @@ -3512,10 +3499,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Gizlenen bazı ayarlar normal hesaplanan değerden farklı değerler kullanır.\n" -"\n" -"Bu ayarları görmek için tıklayın." +msgstr "Gizlenen bazı ayarlar normal hesaplanan değerden farklı değerler kullanır.\n\nBu ayarları görmek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3530,7 +3514,7 @@ msgstr ".........den etkilenir" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." -msgstr "" +msgstr "Bu ayar her zaman, tüm ekstrüderler arasında paylaşılır. Buradan değiştirildiğinde tüm ekstrüderler için değer değiştirir." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" @@ -3543,10 +3527,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Bu ayarın değeri profilden farklıdır.\n" -"\n" -"Profil değerini yenilemek için tıklayın." +msgstr "Bu ayarın değeri profilden farklıdır.\n\nProfil değerini yenilemek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" @@ -3554,10 +3535,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Bu ayar normal olarak yapılır ama şu anda mutlak değer ayarı var.\n" -"\n" -"Hesaplanan değeri yenilemek için tıklayın." +msgstr "Bu ayar normal olarak yapılır ama şu anda mutlak değer ayarı var.\n\nHesaplanan değeri yenilemek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" @@ -3569,9 +3547,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Yazdırma Ayarı devre dışı\n" -"G-code dosyaları üzerinde değişiklik yapılamaz" +msgstr "Yazdırma Ayarı devre dışı\nG-code dosyaları üzerinde değişiklik yapılamaz" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" @@ -3581,7 +3557,7 @@ msgstr "00sa 00dk" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" msgid "Time specification" -msgstr "" +msgstr "Zaman Özellikleri" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" @@ -3638,12 +3614,12 @@ msgstr "&Görünüm" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 msgctxt "@action:inmenu menubar:view" msgid "&Camera position" -msgstr "" +msgstr "&Kamera konumu" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "" +msgstr "&Yapı levhası" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" @@ -3813,27 +3789,27 @@ msgstr "&Çıkış" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" msgid "&3D View" -msgstr "" +msgstr "&3 Boyutlu Görünüm" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:view" msgid "&Front View" -msgstr "" +msgstr "&Önden Görünüm" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 msgctxt "@action:inmenu menubar:view" msgid "&Top View" -msgstr "" +msgstr "&Yukarıdan Görünüm" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 msgctxt "@action:inmenu menubar:view" msgid "&Left Side View" -msgstr "" +msgstr "&Sol Taraftan Görünüm" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:view" msgid "&Right Side View" -msgstr "" +msgstr "&Sağ Taraftan Görünüm" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" @@ -3959,7 +3935,7 @@ msgstr "Tüm Modelleri Yeniden Yükle" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "" +msgstr "Tüm Modelleri Tüm Yapı Levhalarına Yerleştir" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" @@ -4019,7 +3995,7 @@ msgstr "Yüklü eklentiler..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 msgctxt "@action:inmenu menubar:view" msgid "Expand/Collapse Sidebar" -msgstr "" +msgstr "Kenar Çubuğunu Genişlet/Daralt" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" @@ -4054,12 +4030,12 @@ msgstr "Dilimleme kullanılamıyor" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Slice current printjob" -msgstr "" +msgstr "Mevcut yazdırma görevini dilimlere ayır" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Cancel slicing process" -msgstr "" +msgstr "Dilimleme sürecini iptal et" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" @@ -4115,7 +4091,7 @@ msgstr "&Farklı Kaydet" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" msgid "Save &Project..." -msgstr "" +msgstr "Kaydet&Projelendir..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" @@ -4354,7 +4330,7 @@ msgstr "Malzeme" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Uyumluluğu Kontrol Et" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" @@ -4364,17 +4340,17 @@ msgstr "Malzemenin uyumluluğunu Ultimaker.com üzerinden kontrol etmek için t #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 msgctxt "@option:check" msgid "See only current build plate" -msgstr "" +msgstr "Sadece mevcut yapı levhasını görüntüle" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 msgctxt "@action:button" msgid "Arrange to all build plates" -msgstr "" +msgstr "Tüm yapı levhalarına yerleştir" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 msgctxt "@action:button" msgid "Arrange current build plate" -msgstr "" +msgstr "Sadece mevcut yapı levhasına yerleştir" #: MachineSettingsAction/plugin.json msgctxt "description" @@ -4469,22 +4445,22 @@ msgstr "USB yazdırma" #: PrepareStage/plugin.json msgctxt "description" msgid "Provides a prepare stage in Cura." -msgstr "" +msgstr "Cura’da hazırlık aşaması sunar." #: PrepareStage/plugin.json msgctxt "name" msgid "Prepare Stage" -msgstr "" +msgstr "Hazırlık Aşaması" #: CuraLiveScriptingPlugin/plugin.json msgctxt "description" msgid "Provides an edit window for direct script editing." -msgstr "" +msgstr "Doğrudan komut dosyası düzenlemek için düzenleme penceresi sunar." #: CuraLiveScriptingPlugin/plugin.json msgctxt "name" msgid "Live scripting tool" -msgstr "" +msgstr "Canlı komut dosyası aracı" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" @@ -4509,12 +4485,12 @@ msgstr "UM3 Ağ Bağlantısı" #: MonitorStage/plugin.json msgctxt "description" msgid "Provides a monitor stage in Cura." -msgstr "" +msgstr "Cura’da görüntüleme aşaması sunar." #: MonitorStage/plugin.json msgctxt "name" msgid "Monitor Stage" -msgstr "" +msgstr "Görüntüleme Aşaması" #: FirmwareUpdateChecker/plugin.json msgctxt "description" @@ -4529,7 +4505,7 @@ msgstr "Bellenim Güncelleme Denetleyicisi" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." -msgstr "" +msgstr "Bazı dosyaları SolidWorks kullanarak açma imkanı sağlar. Dönüştürme, bu eklenti ve ek optimizasyonlar tarafından gerçekleştirilir." #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4599,12 +4575,12 @@ msgstr "Eski Cura Profil Okuyucu" #: CuraBlenderPlugin/plugin.json msgctxt "description" msgid "Helps to open Blender files directly in Cura." -msgstr "" +msgstr "Cura’da Blender dosyalarını doğrudan açmanıza yardımcı olur." #: CuraBlenderPlugin/plugin.json msgctxt "name" msgid "Blender Integration (experimental)" -msgstr "" +msgstr "Blender Entegrasyonu (deneysel)" #: GCodeProfileReader/plugin.json msgctxt "description" @@ -4769,12 +4745,12 @@ msgstr "Cura Profili Yazıcı" #: CuraPrintProfileCreator/plugin.json msgctxt "description" msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." -msgstr "" +msgstr "Malzeme üreticilerine bir drop-in UI kullanarak yeni malzeme ve kalite profili oluşturma imkanı sunar." #: CuraPrintProfileCreator/plugin.json msgctxt "name" msgid "Print Profile Assistant" -msgstr "" +msgstr "Baskı Profili Asistanı" #: 3MFWriter/plugin.json msgctxt "description" diff --git a/resources/i18n/tr_TR/fdmprinter.def.json.po b/resources/i18n/tr_TR/fdmprinter.def.json.po index ae06ce1095..aba2389cee 100644 --- a/resources/i18n/tr_TR/fdmprinter.def.json.po +++ b/resources/i18n/tr_TR/fdmprinter.def.json.po @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"​\n" -" ile ayrılan, başlangıçta yürütülecek G-code komutları." +msgstr "​\n ile ayrılan, başlangıçta yürütülecek G-code komutları." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"​\n" -" ile ayrılan, bitişte yürütülecek Gcode komutları." +msgstr "​\n ile ayrılan, bitişte yürütülecek Gcode komutları." #: fdmprinter.def.json msgctxt "material_guid label" @@ -352,12 +348,12 @@ msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_firmware_retract label" msgid "Firmware Retraction" -msgstr "" +msgstr "Üretici Yazılımı Geri Çekme" #: fdmprinter.def.json msgctxt "machine_firmware_retract description" msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." -msgstr "" +msgstr "Malzemeyi geri çekmek için G1 komutlarında E özelliği yerine aygıt yazılımı çekme komutlarının (G10/G11) kullanılıp kullanılmayacağı." #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" @@ -1052,12 +1048,12 @@ msgstr "Her bölüm" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps label" msgid "Filter Out Tiny Gaps" -msgstr "" +msgstr "Küçük Boşlukların Filtrelenmesi" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps description" msgid "Filter out tiny gaps to reduce blobs on outside of model." -msgstr "" +msgstr "Modelin dışındaki damlalarını azaltmak için küçük boşlukları filtreleyin." #: fdmprinter.def.json msgctxt "fill_outline_gaps label" @@ -1442,7 +1438,7 @@ msgstr "Dolgu X Kayması" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is moved this distance along the X axis." -msgstr "" +msgstr "Dolgu şekli X ekseni boyunca bu mesafe kadar kaydırılır." #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1452,7 +1448,7 @@ msgstr "Dolgu Y Kayması" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is moved this distance along the Y axis." -msgstr "" +msgstr "Dolgu şekli Y ekseni boyunca bu mesafe kadar kaydırılır." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1472,7 +1468,7 @@ msgstr "Dolgu Çakışma Oranı" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "Dolgu hattı genişliğinin yüzdesi olarak dolgu ve duvarların arasındaki çakışma miktarı. Ufak bir çakışma duvarların dolguya sıkıca bağlanmasını sağlar." #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1492,7 +1488,7 @@ msgstr "Yüzey Çakışma Oranı" #: fdmprinter.def.json msgctxt "skin_overlap description" msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." -msgstr "" +msgstr "Yüzey hattı genişliğinin yüzdesi olarak yüzey ve duvar çakışmasının miktarı. Ufak bir çakışma duvarların yüzeye sıkıca bağlanmasını sağlar. Bu, yüzey ve en iç duvar hat eninin ortalama yüzdesidir." #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1722,7 +1718,7 @@ msgstr "Yapı Levhası Sıcaklığı" #: fdmprinter.def.json msgctxt "material_bed_temperature description" msgid "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted." -msgstr "" +msgstr "Isınan yapı levhası için kullanılan sıcaklık. Bu değer 0 ise yatak sıcaklığı değiştirilmez." #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -3504,9 +3500,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 "" -"Baskının eteği ve ilk katmanı arasındaki yatay mesafe.\n" -"Minimum mesafedir. Bu mesafeden çok sayıda etek hattı dışarı doğru uzanır." +msgstr "Baskının eteği ve ilk katmanı arasındaki yatay mesafe.\nMinimum mesafedir. Bu mesafeden çok sayıda etek hattı dışarı doğru uzanır." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4266,82 +4260,82 @@ msgstr "deneysel!" #: fdmprinter.def.json msgctxt "support_tree_enable label" msgid "Tree Support" -msgstr "" +msgstr "Ağaç Destek" #: fdmprinter.def.json msgctxt "support_tree_enable description" msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." -msgstr "" +msgstr "Baskınızı desteklemesi adına dallarıyla birlikte ağaca benzeyen bir destek oluşturun. Malzeme kullanımı ve baskı süresi düşer ancak dilimleme zamanı da önemli ölçüde artar." #: fdmprinter.def.json msgctxt "support_tree_angle label" msgid "Tree Support Branch Angle" -msgstr "" +msgstr "Ağaç Destek Dal Açısı" #: fdmprinter.def.json msgctxt "support_tree_angle description" msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." -msgstr "" +msgstr "Dalların açısı. Daha dikey ve daha stabil olmaları için daha düşük bir açı kullanın. Daha fazla erişim için daha yüksek bir açı kullanın." #: fdmprinter.def.json msgctxt "support_tree_branch_distance label" msgid "Tree Support Branch Distance" -msgstr "" +msgstr "Ağaç Destek Dal Mesafesi" #: fdmprinter.def.json msgctxt "support_tree_branch_distance description" msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." -msgstr "" +msgstr "Dalların modele temas ettiklerinde birbirlerine ne kadar uzaklıkta olacakları. Bu mesafenin kısa yapılması ağaç desteğin modele daha fazla noktada temas etmesini sağlayarak daha iyi bir sarkma sunacaktır ancak desteğin sökülmesini de daha güç hale getirecektir." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter label" msgid "Tree Support Branch Diameter" -msgstr "" +msgstr "Ağaç Destek Dalının Çapı" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter description" msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." -msgstr "" +msgstr "Ağaç desteğin en ince dallarının çapı. Daha kalın dallar daha dayanıklı olur. Tabana doğru uzanan dallar bundan daha kalın olacaktır." #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle label" msgid "Tree Support Branch Diameter Angle" -msgstr "" +msgstr "Ağaç Destek Dalının Çap Açısı" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle description" msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." -msgstr "" +msgstr "Alta doğru gidildikçe kademeli olarak kalınlaşan dalların açısı. 0 derecelik bir açı dalların uzunluklarını gözetmeksizin tekdüze bir kalınlığa sahip olmalarını sağlayacaktır. Birazcık açı ağaç desteğin sabitliğini artırabilir." #: fdmprinter.def.json msgctxt "support_tree_collision_resolution label" msgid "Tree Support Collision Resolution" -msgstr "" +msgstr "Ağaç Destek Çarpışma Çözünürlüğü" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution description" msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." -msgstr "" +msgstr "Modele çarpmamak adına çarpışmaları hesaplamak için çözünürlük. Buna düşük bir değerin verilmesi daha az hata çıkaran daha isabetli ağaçların üretilmesini sağlar ancak dilimleme süresini önemli ölçüde artırır." #: fdmprinter.def.json msgctxt "support_tree_wall_thickness label" msgid "Tree Support Wall Thickness" -msgstr "" +msgstr "Ağaç Destek Duvarının Kalınlığı" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness description" msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "Ağaç desteğin dallarında yer alan duvarların kalınlığı. Kalın duvarların basılması daha uzun sürer ancak kalın duvarlar kolay devrilmezler." #: fdmprinter.def.json msgctxt "support_tree_wall_count label" msgid "Tree Support Wall Line Count" -msgstr "" +msgstr "Ağaç Destek Duvarının Hat Sayısı" #: fdmprinter.def.json msgctxt "support_tree_wall_count description" msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "Ağaç desteğin dallarında yer alan duvarların sayısı. Kalın duvarların basılması daha uzun sürer ancak kalın duvarlar kolay devrilmezler." #: fdmprinter.def.json msgctxt "slicing_tolerance label" @@ -4416,12 +4410,12 @@ msgstr "Üst yüzey katmanları çizgi veya zikzak biçimindeyken kullanılacak #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization label" msgid "Infill Travel Optimization" -msgstr "" +msgstr "Dolgu Hareket Optimizasyonu" #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization description" msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." -msgstr "" +msgstr "Aktifleştirildiğinde, dolgu hatlarının baskı düzeni, hareketi azaltmak için optimize edilir. Elde edilen hareket zamanındaki azalma dilimlenen modele, dolgu şekline ve yoğunluğuna vs. bağlıdır. Birçok ufak dolgu bölgesine sahip bazı modeller için modelin dilimlenme süresi önemli ölçüde artabilir." #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" @@ -4943,9 +4937,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 "" -"Yarı hızda sıkıştırılmış yukarı doğru hareket mesafesi.\n" -"Bu katmanlarda malzemeyi çok fazla ısıtmayarak önceki katmanlarda daha iyi yapışma sağlayabilir. Sadece kablo yazdırmaya uygulanır." +msgstr "Yarı hızda sıkıştırılmış yukarı doğru hareket mesafesi.\nBu katmanlarda malzemeyi çok fazla ısıtmayarak önceki katmanlarda daha iyi yapışma sağlayabilir. Sadece kablo yazdırmaya uygulanır." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5055,42 +5047,42 @@ msgstr "Nozül ve aşağı yöndeki hatlar arasındaki mesafe. Daha büyük aç #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled label" msgid "Use adaptive layers" -msgstr "" +msgstr "Uyarlanabilir Katmanların Kullanımı" #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled description" msgid "Adaptive layers computes the layer heights depending on the shape of the model." -msgstr "" +msgstr "Uyarlanabilir katmanlar modelin şekline bağlı olarak katman yüksekliğini hesaplar." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation label" msgid "Adaptive layers maximum variation" -msgstr "" +msgstr "Uyarlanabilir katmanların azami değişkenliği" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height in mm." -msgstr "" +msgstr "Mm bazında taban katmanı yüksekliğine göre izin verilen azami yükseklik." #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" msgid "Adaptive layers variation step size" -msgstr "" +msgstr "Uyarlanabilir katmanların değişkenlik adım boyu" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step description" msgid "The difference in height of the next layer height compared to the previous one." -msgstr "" +msgstr "Bir önceki ve bir sonraki katman yüksekliği arasındaki yükseklik farkı." #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold label" msgid "Adaptive layers threshold" -msgstr "" +msgstr "Uyarlanabilir katman eşiği" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold description" msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." -msgstr "" +msgstr "Daha küçük bir katmanın kullanılıp kullanılmayacağını belirleyen eşik. Bu rakam bir katmandaki en dik eğimin tanjantına eşittir." #: fdmprinter.def.json msgctxt "command_line_settings label" diff --git a/resources/i18n/zh_CN/cura.po b/resources/i18n/zh_CN/cura.po index f2d1e5561f..9800a0bac5 100644 --- a/resources/i18n/zh_CN/cura.po +++ b/resources/i18n/zh_CN/cura.po @@ -117,17 +117,17 @@ msgstr "配置文件已被合并并激活。" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@item:inmenu" msgid "USB printing" -msgstr "USB 联机打印" +msgstr "USB 打印" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" -msgstr "通过 USB 联机打印" +msgstr "通过 USB 打印" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:29 msgctxt "@info:tooltip" msgid "Print via USB" -msgstr "通过 USB 联机打印" +msgstr "通过 USB 打印" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:31 msgctxt "@info:status" @@ -189,7 +189,7 @@ msgstr "打印机固件" #: /home/ruben/Projects/Cura/plugins/PrepareStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Prepare" -msgstr "" +msgstr "准备" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." @@ -424,7 +424,7 @@ msgstr "线轴 {0} 上没有足够的材料。" #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" -msgstr "不同的打印头(Cura: {0},打印机: 为挤出机 {2} 选择了 {1})" +msgstr "不同的打印头(Cura: {0},打印机: 为挤出机 {2} 选择了 {1})" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:734 #, python-brace-format @@ -562,7 +562,7 @@ msgstr "在您的浏览器中打开打印作业界面。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 msgctxt "@label Printer name" msgid "Unknown" -msgstr "" +msgstr "未知" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:505 #, python-brace-format @@ -597,7 +597,7 @@ msgstr "通过网络连接" #: /home/ruben/Projects/Cura/plugins/MonitorStage/__init__.py:12 msgctxt "@item:inmenu" msgid "Monitor" -msgstr "" +msgstr "监控" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 #, python-brace-format @@ -624,7 +624,7 @@ msgstr "无法获取更新信息。" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:579 msgctxt "@info:status" msgid "SolidWorks reported errors, while opening your file. We recommend to solve these issues inside SolidWorks itself." -msgstr "" +msgstr "打开文件时,SolidWorks 报错。我们建议在 SolidWorks 内部解决这些问题。" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:591 msgctxt "@info:status" @@ -632,7 +632,7 @@ msgid "" "Found no models inside your drawing. Could you please check it's content again and make sure one part or assembly is inside?\n" "\n" " Thanks!." -msgstr "" +msgstr "在您的图纸中找不到模型。请再次检查图纸内容,确保里面有一个零件或组件。\n\n谢谢!" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:595 msgctxt "@info:status" @@ -640,7 +640,7 @@ msgid "" "Found more then one part or assembly inside your drawing. We currently only support drawings with exactly one part or assembly inside.\n" "\n" "Sorry!" -msgstr "" +msgstr "在您的图纸中找到一个以上的零件或组件。我们目前只支持里面正好有一个零件或组件的图纸。\n\n很抱歉!" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:25 msgctxt "@item:inlistbox" @@ -655,7 +655,7 @@ msgstr "SolidWorks 组件文件" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:33 msgctxt "@item:inlistbox" msgid "SolidWorks drawing file" -msgstr "" +msgstr "SolidWorks 图纸文件" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:48 msgctxt "@info:status" @@ -665,7 +665,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "尊敬的客户:\n我们无法在您的系统中找到有效的 SolidWorks 软件。这意味着您的系统中没有安装 SolidWorks,或者您没有获得有效的许可。请确保 SolidWorks 的运行没有任何问题并/或联系您的 ICT。\n\n此致\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:57 msgctxt "@info:status" @@ -675,7 +675,7 @@ msgid "" "\n" "With kind regards\n" " - Thomas Karl Pietrowski" -msgstr "" +msgstr "尊敬的客户:\n您当前正在非 Windows 操作系统上运行此插件。此插件只能在装有 SolidWorks 且拥有有效许可的 Windows 系统上运行。请在装有 SolidWorks 的 Windows 计算机上安装此插件。\n\n此致\n - Thomas Karl Pietrowski" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:70 msgid "Configure" @@ -683,7 +683,7 @@ msgstr "配置" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksDialogHandler.py:71 msgid "Installation guide for SolidWorks macro" -msgstr "" +msgstr "SolidWorks 宏的安装指南" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" @@ -707,7 +707,7 @@ msgstr "修改 G-Code 文件" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" msgid "Cura collects anonymized usage statistics." -msgstr "" +msgstr "Cura 将收集匿名的使用统计数据。" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" @@ -717,22 +717,22 @@ msgstr "正在收集数据" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Allow" -msgstr "" +msgstr "允许" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:49 msgctxt "@action:tooltip" msgid "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing." -msgstr "" +msgstr "允许 Cura 发送匿名的使用统计数据,以帮助确定将来 Cura 的改进优先顺序。已发送您的一些偏好和设置,Cura 版本和您正在切片的模型的散列值。" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:50 msgctxt "@action:button" msgid "Disable" -msgstr "" +msgstr "禁用" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:51 msgctxt "@action:tooltip" msgid "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences." -msgstr "" +msgstr "不允许 Cura 发送匿名的使用统计数据。您可以在偏好中再次启用。" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" @@ -742,14 +742,14 @@ msgstr "Cura 15.04 配置文件" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/__init__.py:15 msgctxt "@item:inlistbox" msgid "Blender file" -msgstr "" +msgstr "Blender 文件" #: /home/ruben/Projects/Cura/plugins/CuraBlenderPlugin/CadIntegrationUtils/CommonReader.py:199 msgctxt "@info:status" msgid "" "Could not export using \"{}\" quality!\n" "Felt back to \"{}\"." -msgstr "" +msgstr "无法使用 \"{}\" 导出质量!\n返回 \"{}\"。" #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 @@ -936,12 +936,12 @@ msgstr "Cura 配置文件" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:12 msgctxt "@item:inmenu" msgid "Profile Assistant" -msgstr "" +msgstr "配置文件助手" #: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/__init__.py:17 msgctxt "@item:inlistbox" msgid "Profile Assistant" -msgstr "" +msgstr "配置文件助手" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" @@ -1017,7 +1017,7 @@ msgstr "Skirt" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:106 msgctxt "@tooltip" msgid "Travel" -msgstr "移动" +msgstr "空驶" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:107 msgctxt "@tooltip" @@ -1061,7 +1061,7 @@ msgstr "文件已存在" #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" -msgstr "文件 {0} 已存在。 您确定要替换它吗?" +msgstr "文件 {0} 已存在。 您确定要覆盖它吗?" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:872 msgctxt "@label" @@ -1139,13 +1139,13 @@ msgstr "无法从 {0} 导入配置文件: {1}< #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "This profile {0} contains incorrect data, could not import it." -msgstr "" +msgstr "此配置文件 {0} 包含错误数据,无法导入。" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:240 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "The machine defined in profile {0} doesn't match with your current machine, could not import it." -msgstr "" +msgstr "配置文件 {0} 中定义的机器与您当前的机器不匹配,无法导入。" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 #, python-brace-format @@ -1157,7 +1157,7 @@ msgstr "已成功导入配置文件 {0}" #, python-brace-format msgctxt "@info:status" msgid "File {0} does not contain any valid profile." -msgstr "" +msgstr "文件 {0} 不包含任何有效的配置文件。" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:280 #, python-brace-format @@ -1185,7 +1185,7 @@ msgstr "无法为当前配置找到质量类型 {0}。" #, python-brace-format msgctxt "@label" msgid "Group #{group_nr}" -msgstr "" +msgstr "组 #{group_nr}" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" @@ -1244,7 +1244,7 @@ msgid "" "

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

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

    发生了致命错误。请将这份错误报告发送给我们以便修复问题

    \n

    请使用“发送报告”按钮将错误报告自动发布到我们的服务器

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:102 msgctxt "@title:groupbox" @@ -1259,32 +1259,32 @@ msgstr "未知" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 msgctxt "@label Cura version number" msgid "Cura version" -msgstr "" +msgstr "Cura 版本" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 msgctxt "@label Type of platform" msgid "Platform" -msgstr "" +msgstr "平台" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 msgctxt "@label" msgid "Qt version" -msgstr "" +msgstr "Qt 版本" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 msgctxt "@label" msgid "PyQt version" -msgstr "" +msgstr "PyQt 版本" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:116 msgctxt "@label OpenGL version" msgid "OpenGL" -msgstr "" +msgstr "OpenGL" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:133 msgctxt "@label" msgid "not yet initialised
    " -msgstr "" +msgstr "尚未初始化
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:136 #, python-brace-format @@ -1307,7 +1307,7 @@ msgstr "
  • OpenGL 渲染器: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:147 msgctxt "@title:groupbox" msgid "Error traceback" -msgstr "" +msgstr "错误追溯" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:214 msgctxt "@title:groupbox" @@ -1518,7 +1518,7 @@ msgstr "喷嘴孔径" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:393 msgctxt "@label" msgid "Compatible material diameter" -msgstr "" +msgstr "兼容的材料直径" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:395 msgctxt "@tooltip" @@ -1620,10 +1620,7 @@ 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 "" -"要通过网络向打印机发送打印请求,请确保您的打印机已通过网线或 WIFI 连接到网络。若您不能连接 Cura 与打印机,您仍然可以使用 USB 设备将 G-code 文件传输到打印机。\n" -"\n" -"从以下列表中选择您的打印机:" +msgstr "要通过网络向打印机发送打印请求,请确保您的打印机已通过网线或 WIFI 连接到网络。若您不能连接 Cura 与打印机,您仍然可以使用 USB 设备将 G-code 文件传输到打印机。\n\n从以下列表中选择您的打印机:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1663,12 +1660,12 @@ msgstr "类型" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label Printer name" msgid "Ultimaker 3" -msgstr "" +msgstr "Ultimaker 3" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label Printer name" msgid "Ultimaker 3 Extended" -msgstr "" +msgstr "Ultimaker 3 Extended" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" @@ -1735,7 +1732,7 @@ msgstr "%1 未设置为运行一组连接的 Ultimaker 3 打印机" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:55 msgctxt "@label link to connect manager" msgid "Add/Remove printers" -msgstr "" +msgstr "添加/删除打印机" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" @@ -1775,7 +1772,7 @@ msgstr "与打印机的连接中断" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 msgctxt "@label Printer status" msgid "Unknown" -msgstr "" +msgstr "未知" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" @@ -1871,164 +1868,164 @@ msgstr "应用配置" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:21 msgctxt "@title:window" msgid "SolidWorks: Export wizard" -msgstr "" +msgstr "SolidWorks:导出向导" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:45 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:140 msgctxt "@action:label" msgid "Quality:" -msgstr "" +msgstr "质量:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:179 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (3D-printing)" -msgstr "" +msgstr "精细(3D 打印)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:79 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:180 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (3D-printing)" -msgstr "" +msgstr "粗糙(3D 打印)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:80 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:181 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine (SolidWorks)" -msgstr "" +msgstr "精细 (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:81 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:182 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse (SolidWorks)" -msgstr "" +msgstr "粗糙 (SolidWorks)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:94 msgctxt "@text:window" msgid "Show this dialog again" -msgstr "" +msgstr "再次显示此对话框" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:104 msgctxt "@action:button" msgid "Continue" -msgstr "" +msgstr "继续" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksWizard.qml:116 msgctxt "@action:button" msgid "Abort" -msgstr "" +msgstr "中止" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:21 msgctxt "@title:window" msgid "How to install Cura SolidWorks macro" -msgstr "" +msgstr "如何安装 Cura SolidWorks 宏" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:62 msgctxt "@description:label" msgid "Steps:" -msgstr "" +msgstr "步骤:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:140 msgctxt "@action:button" msgid "" "Open the directory\n" "with macro and icon" -msgstr "" +msgstr "打开宏和图标\n所在的目录" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:160 msgctxt "@description:label" msgid "Instructions:" -msgstr "" +msgstr "说明:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:202 msgctxt "@action:playpause" msgid "Play" -msgstr "" +msgstr "播放" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:206 msgctxt "@action:playpause" msgid "Pause" -msgstr "" +msgstr "暂停" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:268 msgctxt "@action:button" msgid "Previous Step" -msgstr "" +msgstr "上一步" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:283 msgctxt "@action:button" msgid "Done" -msgstr "" +msgstr "完成" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksMacroTutorial.qml:287 msgctxt "@action:button" msgid "Next Step" -msgstr "" +msgstr "下一步" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:21 msgctxt "@title:window" msgid "SolidWorks plugin: Configuration" -msgstr "" +msgstr "SolidWorks 插件:配置" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:39 msgctxt "@title:tab" msgid "Conversion settings" -msgstr "" +msgstr "转换设置" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:66 msgctxt "@label" msgid "First choice:" -msgstr "" +msgstr "首选:" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:86 msgctxt "@text:menu" msgid "Latest installed version (Recommended)" -msgstr "" +msgstr "最新安装的版本(推荐)" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:95 msgctxt "@text:menu" msgid "Default version" -msgstr "" +msgstr "默认版本" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:193 msgctxt "@label" msgid "Show wizard before opening SolidWorks files" -msgstr "" +msgstr "在打开 SolidWorks 文件前显示向导" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:203 msgctxt "@label" msgid "Automatically rotate opened file into normed orientation" -msgstr "" +msgstr "自动将打开的文件旋转到标准方向" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:210 msgctxt "@title:tab" msgid "Installation(s)" -msgstr "" +msgstr "装置" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:284 msgctxt "@label" msgid "COM service found" -msgstr "" +msgstr "发现 COM 服务" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:295 msgctxt "@label" msgid "Executable found" -msgstr "" +msgstr "发现可执行文件" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:306 msgctxt "@label" msgid "COM starting" -msgstr "" +msgstr "COM 启动" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:317 msgctxt "@label" msgid "Revision number" -msgstr "" +msgstr "版本号" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:328 msgctxt "@label" msgid "Functions available" -msgstr "" +msgstr "可用功能" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksConfiguration.qml:341 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 @@ -2214,32 +2211,32 @@ msgstr "平滑" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:38 msgctxt "@label" msgid "Mesh Type" -msgstr "" +msgstr "网格类型" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:69 msgctxt "@label" msgid "Normal model" -msgstr "" +msgstr "正常模式" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:76 msgctxt "@label" msgid "Print as support" -msgstr "" +msgstr "打印为支撑" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:84 msgctxt "@label" msgid "Don't support overlap with other models" -msgstr "" +msgstr "不支持与其他模型重叠" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:92 msgctxt "@label" msgid "Modify settings for overlap with other models" -msgstr "" +msgstr "修改与其他模型重叠的设置" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:100 msgctxt "@label" msgid "Modify settings for infill of other models" -msgstr "" +msgstr "修改其他模型填充物的设置" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:333 msgctxt "@action:button" @@ -2423,10 +2420,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" -"该插件包含一个许可。\n" -"您需要接受此许可才能安装此插件。\n" -"是否同意下列条款?" +msgstr "该插件包含一个许可。\n您需要接受此许可才能安装此插件。\n是否同意下列条款?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2691,9 +2685,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"您已自定义某些配置文件设置。\n" -"您想保留或舍弃这些设置吗?" +msgstr "您已自定义某些配置文件设置。\n您想保留或舍弃这些设置吗?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3097,27 +3089,27 @@ msgstr "(匿名)发送打印信息" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:674 msgctxt "@label" msgid "Experimental" -msgstr "" +msgstr "实验性" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:680 msgctxt "@info:tooltip" msgid "Use multi build plate functionality" -msgstr "" +msgstr "使用多打印平台功能" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685 msgctxt "@option:check" msgid "Use multi build plate functionality (restart required)" -msgstr "" +msgstr "使用多打印平台功能(需要重启)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:694 msgctxt "@info:tooltip" msgid "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)" -msgstr "" +msgstr "是否在打印平台上编位新加载的模型?与多打印平台结合使用(实验性)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:699 msgctxt "@option:check" msgid "Do not arrange objects on load" -msgstr "" +msgstr "不要编位加载的对象" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:514 @@ -3361,9 +3353,7 @@ 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 由 Ultimaker B.V. 与社区合作开发。\n" -"Cura 使用以下开源项目:" +msgstr "Cura 由 Ultimaker B.V. 与社区合作开发。\nCura 使用以下开源项目:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3471,10 +3461,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"某些设置/重写值与存储在配置文件中的值不同。\n" -"\n" -"点击打开配置文件管理器。" +msgstr "某些设置/重写值与存储在配置文件中的值不同。\n\n点击打开配置文件管理器。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:150 msgctxt "@label:textbox" @@ -3512,10 +3499,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"一些隐藏设置正在使用有别于一般设置的计算值。\n" -"\n" -"单击以使这些设置可见。" +msgstr "一些隐藏设置正在使用有别于一般设置的计算值。\n\n单击以使这些设置可见。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:61 msgctxt "@label Header for list of settings." @@ -3530,7 +3514,7 @@ msgstr "受影响项目:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:156 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders." -msgstr "" +msgstr "此设置始终在所有挤出机之间共享。在此处更改它将改变所有挤出机的值。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:159 msgctxt "@label" @@ -3543,10 +3527,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"此设置的值与配置文件不同。\n" -"\n" -"单击以恢复配置文件的值。" +msgstr "此设置的值与配置文件不同。\n\n单击以恢复配置文件的值。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 msgctxt "@label" @@ -3554,10 +3535,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"此设置通常可被自动计算,但其当前已被绝对定义。\n" -"\n" -"单击以恢复自动计算的值。" +msgstr "此设置通常可被自动计算,但其当前已被绝对定义。\n\n单击以恢复自动计算的值。" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:128 msgctxt "@label:listbox" @@ -3569,9 +3547,7 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"打印设置已禁用\n" -"G-code 文件无法被修改" +msgstr "打印设置已禁用\nG-code 文件无法被修改" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:342 msgctxt "@label Hours and minutes" @@ -3581,7 +3557,7 @@ msgstr "00 小时 00 分" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:359 msgctxt "@tooltip" msgid "Time specification" -msgstr "" +msgstr "时间规格" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:441 msgctxt "@label" @@ -3623,7 +3599,7 @@ msgstr "推荐的打印设置

    使用针对所选打印机、 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:596 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." -msgstr "自定义打印设置
    对切片过程中的每一个细节进行精细控制。" +msgstr "自定义打印设置

    对切片过程中的每一个细节进行精细控制。" #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:50 msgctxt "@title:menuitem %1 is the automatically selected material" @@ -3638,17 +3614,17 @@ msgstr "视图(&V)" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:37 msgctxt "@action:inmenu menubar:view" msgid "&Camera position" -msgstr "" +msgstr "摄像头位置(&C)" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:52 msgctxt "@action:inmenu menubar:view" msgid "&Build plate" -msgstr "" +msgstr "打印平台(&B)" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" -msgstr "自动: %1" +msgstr "自动:%1" #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:25 msgctxt "@label" @@ -3811,27 +3787,27 @@ msgstr "退出(&Q)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu menubar:view" msgid "&3D View" -msgstr "" +msgstr "3D 视图(&3)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:view" msgid "&Front View" -msgstr "" +msgstr "正视图(&F)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:128 msgctxt "@action:inmenu menubar:view" msgid "&Top View" -msgstr "" +msgstr "顶视图(&T)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:135 msgctxt "@action:inmenu menubar:view" msgid "&Left Side View" -msgstr "" +msgstr "左视图(&L)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:view" msgid "&Right Side View" -msgstr "" +msgstr "右视图(&R)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:149 msgctxt "@action:inmenu" @@ -3954,7 +3930,7 @@ msgstr "重新载入所有模型(&L)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:351 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models To All Build Plates" -msgstr "" +msgstr "将所有模型编位到所有打印平台" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:edit" @@ -4014,7 +3990,7 @@ msgstr "已安装插件..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:438 msgctxt "@action:inmenu menubar:view" msgid "Expand/Collapse Sidebar" -msgstr "" +msgstr "展开/折叠侧边栏" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" @@ -4049,12 +4025,12 @@ msgstr "切片不可用" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Slice current printjob" -msgstr "" +msgstr "分割当前打印作业" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:171 msgctxt "@info:tooltip" msgid "Cancel slicing process" -msgstr "" +msgstr "取消切片流程" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:183 msgctxt "@label:Printjob" @@ -4110,7 +4086,7 @@ msgstr "另存为(&A)…" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:139 msgctxt "@title:menu menubar:file" msgid "Save &Project..." -msgstr "" +msgstr "保存项目(&P)..." #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu menubar:toplevel" @@ -4302,7 +4278,7 @@ msgstr "允许打印 Brim 或 Raft。这将在您的对象周围或下方添加 #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:969 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" -msgstr "需要帮助改善您的打印?阅读 Ultimaker 故障排除指南" +msgstr "需要帮助改善您的打印?
    阅读 Ultimaker 故障排除指南" #: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 msgctxt "@label %1 is filled in with the name of an extruder" @@ -4348,7 +4324,7 @@ msgstr "材料" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:352 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "检查兼容性" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:372 msgctxt "@tooltip" @@ -4358,17 +4334,17 @@ msgstr "点击查看 Ultimaker.com 上的材料兼容情况。" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:211 msgctxt "@option:check" msgid "See only current build plate" -msgstr "" +msgstr "只能看到当前的打印平台" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:227 msgctxt "@action:button" msgid "Arrange to all build plates" -msgstr "" +msgstr "编位到所有打印平台" #: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:247 msgctxt "@action:button" msgid "Arrange current build plate" -msgstr "" +msgstr "编位当前打印平台" #: MachineSettingsAction/plugin.json msgctxt "description" @@ -4458,27 +4434,27 @@ msgstr "接受 G-Code 并将其发送到一台打印机。 插件也可以更新 #: USBPrinting/plugin.json msgctxt "name" msgid "USB printing" -msgstr "USB 联机打印" +msgstr "USB 打印" #: PrepareStage/plugin.json msgctxt "description" msgid "Provides a prepare stage in Cura." -msgstr "" +msgstr "在 Cura 中提供准备阶段。" #: PrepareStage/plugin.json msgctxt "name" msgid "Prepare Stage" -msgstr "" +msgstr "准备阶段" #: CuraLiveScriptingPlugin/plugin.json msgctxt "description" msgid "Provides an edit window for direct script editing." -msgstr "" +msgstr "提供直接脚本编辑的编辑窗口。" #: CuraLiveScriptingPlugin/plugin.json msgctxt "name" msgid "Live scripting tool" -msgstr "" +msgstr "实时脚本工具" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" @@ -4503,12 +4479,12 @@ msgstr "UM3 网络连接" #: MonitorStage/plugin.json msgctxt "description" msgid "Provides a monitor stage in Cura." -msgstr "" +msgstr "在 Cura 中提供监视阶段。" #: MonitorStage/plugin.json msgctxt "name" msgid "Monitor Stage" -msgstr "" +msgstr "监视阶段" #: FirmwareUpdateChecker/plugin.json msgctxt "description" @@ -4523,7 +4499,7 @@ msgstr "固件更新检查程序" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "Gives you the possibility to open certain files using SolidWorks itself. Conversion is done by this plugin and additional optimizations." -msgstr "" +msgstr "允许您使用 SolidWorks 打开某些文件。转换通过此插件和其他优化完成。" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" @@ -4593,12 +4569,12 @@ msgstr "旧版 Cura 配置文件读取器" #: CuraBlenderPlugin/plugin.json msgctxt "description" msgid "Helps to open Blender files directly in Cura." -msgstr "" +msgstr "帮助直接在 Cura 中打开 Blender 文件。" #: CuraBlenderPlugin/plugin.json msgctxt "name" msgid "Blender Integration (experimental)" -msgstr "" +msgstr "Blender 集成(实验性)" #: GCodeProfileReader/plugin.json msgctxt "description" @@ -4763,12 +4739,12 @@ msgstr "Cura 配置文件写入器" #: CuraPrintProfileCreator/plugin.json msgctxt "description" msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI." -msgstr "" +msgstr "允许材料制造商使用下拉式 UI 创建新的材料和质量配置文件。" #: CuraPrintProfileCreator/plugin.json msgctxt "name" msgid "Print Profile Assistant" -msgstr "" +msgstr "打印配置文件助手" #: 3MFWriter/plugin.json msgctxt "description" diff --git a/resources/i18n/zh_CN/fdmprinter.def.json.po b/resources/i18n/zh_CN/fdmprinter.def.json.po index 0e3eca14d7..3ba47cf8e4 100644 --- a/resources/i18n/zh_CN/fdmprinter.def.json.po +++ b/resources/i18n/zh_CN/fdmprinter.def.json.po @@ -58,9 +58,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"在开始后执行的 G-code 命令 - 以 \n" -" 分行" +msgstr "在开始后执行的 G-code 命令 - 以 \n 分行" #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -72,9 +70,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"在结束前执行的 G-code 命令 - 以 \n" -" 分行" +msgstr "在结束前执行的 G-code 命令 - 以 \n 分行" #: fdmprinter.def.json msgctxt "material_guid label" @@ -354,12 +350,12 @@ msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_firmware_retract label" msgid "Firmware Retraction" -msgstr "" +msgstr "固件收回" #: fdmprinter.def.json msgctxt "machine_firmware_retract description" msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material." -msgstr "" +msgstr "是否使用固件收回命令 (G10/G11) 而不是使用 G1 命令中的 E 属性来收回材料。" #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" @@ -919,12 +915,12 @@ msgstr "直线" #: fdmprinter.def.json msgctxt "top_bottom_pattern option concentric" msgid "Concentric" -msgstr "同心圆" +msgstr "同心" #: fdmprinter.def.json msgctxt "top_bottom_pattern option zigzag" msgid "Zig Zag" -msgstr "Zig Zag" +msgstr "锯齿形" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 label" @@ -944,12 +940,12 @@ msgstr "直线" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 option concentric" msgid "Concentric" -msgstr "同心圆" +msgstr "同心" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 option zigzag" msgid "Zig Zag" -msgstr "Zig Zag" +msgstr "锯齿形" #: fdmprinter.def.json msgctxt "skin_angles label" @@ -959,7 +955,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 "当顶层/底层采用线条或锯齿状图案时使用的整数走线方向的列表。 列表中的元素随层的进度依次使用,当达到列表末尾时,它将从头开始。 列表项以逗号分隔,整个列表包含在方括号中。 默认是一个空列表,即意味着使用传统的默认角度(45 和 135 度)。" +msgstr "当顶层/底层采用线条或锯齿形图案时使用的整数走线方向的列表。 列表中的元素随层的进度依次使用,当达到列表末尾时,它将从头开始。 列表项以逗号分隔,整个列表包含在方括号中。 默认是一个空列表,即意味着使用传统的默认角度(45 和 135 度)。" #: fdmprinter.def.json msgctxt "wall_0_inset label" @@ -1054,12 +1050,12 @@ msgstr "全部填充" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps label" msgid "Filter Out Tiny Gaps" -msgstr "" +msgstr "滤除微小的间隙" #: fdmprinter.def.json msgctxt "filter_out_tiny_gaps description" msgid "Filter out tiny gaps to reduce blobs on outside of model." -msgstr "" +msgstr "滤除微小的间隙以减少模型外的光点。" #: fdmprinter.def.json msgctxt "fill_outline_gaps label" @@ -1394,17 +1390,17 @@ msgstr "四面体" #: fdmprinter.def.json msgctxt "infill_pattern option concentric" msgid "Concentric" -msgstr "同心圆" +msgstr "同心" #: fdmprinter.def.json msgctxt "infill_pattern option concentric_3d" msgid "Concentric 3D" -msgstr "立体同心圆" +msgstr "同心 3D" #: fdmprinter.def.json msgctxt "infill_pattern option zigzag" msgid "Zig Zag" -msgstr "锯齿状" +msgstr "锯齿形" #: fdmprinter.def.json msgctxt "infill_pattern option cross" @@ -1444,7 +1440,7 @@ msgstr "填充 X 轴偏移量" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is moved this distance along the X axis." -msgstr "" +msgstr "填充图案沿 X 轴移动此距离。" #: fdmprinter.def.json msgctxt "infill_offset_y label" @@ -1454,7 +1450,7 @@ msgstr "填充 Y 轴偏移量" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is moved this distance along the Y axis." -msgstr "" +msgstr "填充图案沿 Y 轴移动此距离。" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1474,7 +1470,7 @@ msgstr "填充重叠百分比" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill." -msgstr "" +msgstr "填充物和壁之间的重叠量占填充走线宽度的百分比。稍微重叠可让各个壁与填充物牢固连接。" #: fdmprinter.def.json msgctxt "infill_overlap_mm label" @@ -1494,7 +1490,7 @@ msgstr "皮肤重叠百分比" #: fdmprinter.def.json msgctxt "skin_overlap description" msgid "The amount of overlap between the skin and the walls as a percentage of the skin 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." -msgstr "" +msgstr "皮肤和壁之间的重叠量占皮肤走线宽度的百分比。稍微重叠可让各个壁与皮肤牢固连接。这是皮肤走线和最内壁的平均走线宽度的百分比。" #: fdmprinter.def.json msgctxt "skin_overlap_mm label" @@ -1724,7 +1720,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 temperature will not be adjusted." -msgstr "" +msgstr "用于加热打印平台的温度。如果该值为 0,将不会调整热床。" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" @@ -2539,7 +2535,7 @@ msgstr "打印 skirt 和 brim 时的最大瞬时速度变化。" #: fdmprinter.def.json msgctxt "travel label" msgid "Travel" -msgstr "移动" +msgstr "空驶" #: fdmprinter.def.json msgctxt "travel description" @@ -2769,7 +2765,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" @@ -3304,17 +3300,17 @@ msgstr "三角形" #: fdmprinter.def.json msgctxt "support_roof_pattern option concentric" msgid "Concentric" -msgstr "同心圆" +msgstr "同心" #: fdmprinter.def.json msgctxt "support_roof_pattern option concentric_3d" msgid "Concentric 3D" -msgstr "立体同心圆" +msgstr "同心 3D" #: fdmprinter.def.json msgctxt "support_roof_pattern option zigzag" msgid "Zig Zag" -msgstr "锯齿状" +msgstr "锯齿形" #: fdmprinter.def.json msgctxt "support_bottom_pattern label" @@ -3506,9 +3502,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 "" -"skirt 和打印第一层之间的水平距离。\n" -"这是最小距离。多个 skirt 走线将从此距离向外延伸。" +msgstr "skirt 和打印第一层之间的水平距离。\n这是最小距离。多个 skirt 走线将从此距离向外延伸。" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -4268,82 +4262,82 @@ msgstr "实验性!" #: fdmprinter.def.json msgctxt "support_tree_enable label" msgid "Tree Support" -msgstr "" +msgstr "树形支撑" #: fdmprinter.def.json msgctxt "support_tree_enable description" msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time." -msgstr "" +msgstr "生成树形支撑,用分支支撑打印的模型。这可以减少材料用量和缩短打印时间,但会大幅增加切片时间。" #: fdmprinter.def.json msgctxt "support_tree_angle label" msgid "Tree Support Branch Angle" -msgstr "" +msgstr "树形支撑分支角度" #: fdmprinter.def.json msgctxt "support_tree_angle description" msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach." -msgstr "" +msgstr "分支的角度。使用较小的角度可增加垂直度和稳定性。使用较大的角度可支撑更大范围。" #: fdmprinter.def.json msgctxt "support_tree_branch_distance label" msgid "Tree Support Branch Distance" -msgstr "" +msgstr "树形支撑分支间距" #: fdmprinter.def.json msgctxt "support_tree_branch_distance description" msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove." -msgstr "" +msgstr "在支撑模型时,分支之间需要多大的间距。缩小这一间距会使树形支撑与模型之间有更多接触点,带来更好的悬垂,但会使支撑更难以拆除。" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter label" msgid "Tree Support Branch Diameter" -msgstr "" +msgstr "树形支撑分支直径" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter description" msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this." -msgstr "" +msgstr "树形支撑最细分支的直径。较粗的分支更坚固。接近基础的分支会比这更粗。" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle label" msgid "Tree Support Branch Diameter Angle" -msgstr "" +msgstr "树形支撑分支直径角度" #: fdmprinter.def.json msgctxt "support_tree_branch_diameter_angle description" msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support." -msgstr "" +msgstr "随着分支朝底部逐渐变粗,分支直径的角度。角度为 0 表明分支全长具有均匀的粗细度。稍微有些角度可以增加树形支撑的稳定性。" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution label" msgid "Tree Support Collision Resolution" -msgstr "" +msgstr "树形支撑碰撞分辨率" #: fdmprinter.def.json msgctxt "support_tree_collision_resolution description" msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically." -msgstr "" +msgstr "用于计算碰撞的分辨率,目的在于避免碰撞模型。将此设置得较低将产生更准确且通常较少失败的树,但是会大幅增加切片时间。" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness label" msgid "Tree Support Wall Thickness" -msgstr "" +msgstr "树形支撑壁厚度" #: fdmprinter.def.json msgctxt "support_tree_wall_thickness description" msgid "The thickness of the walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "树形支撑分支的壁厚度。较厚的壁需要的打印时间更长,但不易掉落。" #: fdmprinter.def.json msgctxt "support_tree_wall_count label" msgid "Tree Support Wall Line Count" -msgstr "" +msgstr "树形支撑壁走线次数" #: fdmprinter.def.json msgctxt "support_tree_wall_count description" msgid "The number of walls of the branches of tree support. Thicker walls take longer to print but don't fall over as easily." -msgstr "" +msgstr "树形支撑的分支壁数量。较厚的壁需要的打印时间更长,但不易掉落。" #: fdmprinter.def.json msgctxt "slicing_tolerance label" @@ -4353,7 +4347,7 @@ msgstr "切片公差" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "如何对带有对角线表面的层进行切片。层面积可以根据层的中心与表面(中间)相交的位置生成。或者每一层的面积可以为落在整个层高度中成形体积内的面积 (Exclusive),或者为落在层中任何位置的面积 (Inclusive)。Exclusive 保留大部分细节,Inclusive 可实现最佳匹配,而 Middle 需要的处理的时间最少。" +msgstr "如何对带有对角线表面的层进行切片。层面积可以根据层的中心与表面 (Middle) 相交的位置生成。或者每一层的面积可以为落在整个层高度中成形体积内的面积 (Exclusive),或者为落在层中任何位置的面积 (Inclusive)。Exclusive 保留大部分细节,Inclusive 可实现最佳匹配,而 Middle 需要的处理时间最少。" #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" @@ -4418,12 +4412,12 @@ msgstr "当顶部表面皮肤层采用线条或锯齿状图案时使用的整数 #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization label" msgid "Infill Travel Optimization" -msgstr "" +msgstr "填充物空驶优化" #: fdmprinter.def.json msgctxt "infill_enable_travel_optimization description" msgid "When enabled, the order in which the infill lines are printed is optimized to reduce the distance travelled. The reduction in travel time achieved very much depends on the model being sliced, infill pattern, density, etc. Note that, for some models that have many small areas of infill, the time to slice the model may be greatly increased." -msgstr "" +msgstr "启用后,可优化打印填充走线的顺序,缩短空驶距离。空驶时间的缩短很大程度上取决于被切割的模型、填充图案、密度等。请注意,对于具有许多小填充区域的一些模型,分割模型的时间可能会大幅增加。" #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" @@ -4945,9 +4939,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 "" -"以半速挤出的上行移动的距离。\n" -"这会与之前的层产生更好的附着,而不会将这些层中的材料过度加热。 仅应用于单线打印。" +msgstr "以半速挤出的上行移动的距离。\n这会与之前的层产生更好的附着,而不会将这些层中的材料过度加热。 仅应用于单线打印。" #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -5057,42 +5049,42 @@ msgstr "喷嘴和水平下行线之间的距离。 较大的间隙会让斜下 #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled label" msgid "Use adaptive layers" -msgstr "" +msgstr "使用自适应图层" #: fdmprinter.def.json msgctxt "adaptive_layer_height_enabled description" msgid "Adaptive layers computes the layer heights depending on the shape of the model." -msgstr "" +msgstr "自适应图层根据模型形状计算图层高度。" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation label" msgid "Adaptive layers maximum variation" -msgstr "" +msgstr "自适应图层最大变化" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation description" msgid "The maximum allowed height different from the base layer height in mm." -msgstr "" +msgstr "相比底层高度所允许的最大高度(单位:毫米)。" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step label" msgid "Adaptive layers variation step size" -msgstr "" +msgstr "自适应图层变化步长" #: fdmprinter.def.json msgctxt "adaptive_layer_height_variation_step description" msgid "The difference in height of the next layer height compared to the previous one." -msgstr "" +msgstr "下一层与前一层的高度差。" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold label" msgid "Adaptive layers threshold" -msgstr "" +msgstr "自适应图层阈值" #: fdmprinter.def.json msgctxt "adaptive_layer_height_threshold description" msgid "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer." -msgstr "" +msgstr "决定是否使用较小图层的阈值。该数字相当于一层中最大坡度的切线。" #: fdmprinter.def.json msgctxt "command_line_settings label" From 95d1d8cf345d2392ae24c553d6100427f616f225 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 5 Feb 2018 13:53:56 +0100 Subject: [PATCH 521/551] Update headers of translation files The dates are corrected, attribution correct, etc. Contributes to issue CURA-4883. --- resources/i18n/cura.pot | 2 +- resources/i18n/de_DE/cura.po | 10 +++++----- resources/i18n/es_ES/cura.po | 10 +++++----- resources/i18n/fr_FR/cura.po | 10 +++++----- resources/i18n/it_IT/cura.po | 10 +++++----- resources/i18n/ja_JP/cura.po | 16 ++++++++-------- resources/i18n/ko_KR/cura.po | 14 +++++++------- resources/i18n/nl_NL/cura.po | 10 +++++----- resources/i18n/pt_PT/cura.po | 14 +++++++------- resources/i18n/ru_RU/cura.po | 14 +++++++------- resources/i18n/tr_TR/cura.po | 10 +++++----- resources/i18n/zh_CN/cura.po | 10 +++++----- 12 files changed, 65 insertions(+), 65 deletions(-) diff --git a/resources/i18n/cura.pot b/resources/i18n/cura.pot index 08d81f0b00..e8148997ce 100644 --- a/resources/i18n/cura.pot +++ b/resources/i18n/cura.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"POT-Creation-Date: 2018-01-29 09:48+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: TEAM\n" diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index 4390cce0b6..e55354febb 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -1,14 +1,14 @@ # Cura -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-30 13:05+0100\n" +"POT-Creation-Date: 2018-01-29 09:48+0000\n" +"PO-Revision-Date: 2018-02-05 13:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: German\n" "Language: de_DE\n" diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index 3e007739be..ae780685dd 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -1,14 +1,14 @@ # Cura -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-30 13:05+0100\n" +"POT-Creation-Date: 2018-01-29 09:48+0000\n" +"PO-Revision-Date: 2018-02-05 13:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" "Language: es_ES\n" diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index a748297c46..9170316f5b 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -1,14 +1,14 @@ # Cura -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-30 13:05+0100\n" +"POT-Creation-Date: 2018-01-29 09:48+0000\n" +"PO-Revision-Date: 2018-02-05 13:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: French\n" "Language: fr_FR\n" diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po index 2b9f4ba177..d088670f39 100644 --- a/resources/i18n/it_IT/cura.po +++ b/resources/i18n/it_IT/cura.po @@ -1,14 +1,14 @@ # Cura -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-30 13:05+0100\n" +"POT-Creation-Date: 2018-01-29 09:48+0000\n" +"PO-Revision-Date: 2018-02-05 13:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" "Language: it_IT\n" diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index c2a61cf094..1900ec980f 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -1,17 +1,17 @@ # Cura -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-30 13:05+0100\n" -"Last-Translator: \n" -"Language-Team: TEAM\n" -"Language: xx_XX\n" +"POT-Creation-Date: 2018-01-29 09:48+0000\n" +"PO-Revision-Date: 2018-02-05 13:25+0100\n" +"Last-Translator: Bothof \n" +"Language-Team: Japanese\n" +"Language: ja_JP\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index 906a6c2ba3..1cabac3628 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -1,16 +1,16 @@ # Cura -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.1\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-30 13:05+0100\n" -"Last-Translator: Brule\n" -"Language-Team: Brule\n" +"POT-Creation-Date: 2018-01-29 09:48+0000\n" +"PO-Revision-Date: 2018-02-05 13:25+0100\n" +"Last-Translator: Bothof \n" +"Language-Team: Korean\n" "Language: ko_KR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index 001b2a264f..48fe968815 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -1,14 +1,14 @@ # Cura -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-30 13:05+0100\n" +"POT-Creation-Date: 2018-01-29 09:48+0000\n" +"PO-Revision-Date: 2018-02-05 13:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" "Language: nl_NL\n" diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po index 0c2b205b3d..b8a6bc87e7 100644 --- a/resources/i18n/pt_PT/cura.po +++ b/resources/i18n/pt_PT/cura.po @@ -1,16 +1,16 @@ # Cura -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.1\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2018-01-23 19:41+0000\n" -"Last-Translator: Paulo Miranda \n" -"Language-Team: Bothof\n" +"POT-Creation-Date: 2018-01-29 09:48+0000\n" +"PO-Revision-Date: 2018-02-05 13:25+0100\n" +"Last-Translator: Bothof \n" +"Language-Team: Paulo Miranda , Portuguese \n" "Language: pt_PT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/resources/i18n/ru_RU/cura.po b/resources/i18n/ru_RU/cura.po index 4bae22f214..5b803cc357 100644 --- a/resources/i18n/ru_RU/cura.po +++ b/resources/i18n/ru_RU/cura.po @@ -1,16 +1,16 @@ # Cura -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-30 13:05+0100\n" -"Last-Translator: Ruslan Popov \n" -"Language-Team: Ruslan Popov\n" +"POT-Creation-Date: 2018-01-29 09:48+0000\n" +"PO-Revision-Date: 2018-02-05 13:25+0100\n" +"Last-Translator: Bothof \n" +"Language-Team: Ruslan Popov , Russian \n" "Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" diff --git a/resources/i18n/tr_TR/cura.po b/resources/i18n/tr_TR/cura.po index a955cd5a4e..55a7f78890 100644 --- a/resources/i18n/tr_TR/cura.po +++ b/resources/i18n/tr_TR/cura.po @@ -1,14 +1,14 @@ # Cura -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-30 13:05+0100\n" +"POT-Creation-Date: 2018-01-29 09:48+0000\n" +"PO-Revision-Date: 2018-02-05 13:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" "Language: tr_TR\n" diff --git a/resources/i18n/zh_CN/cura.po b/resources/i18n/zh_CN/cura.po index 9800a0bac5..e7632b0193 100644 --- a/resources/i18n/zh_CN/cura.po +++ b/resources/i18n/zh_CN/cura.po @@ -1,14 +1,14 @@ # Cura -# Copyright (C) 2017 Ultimaker +# Copyright (C) 2018 Ultimaker # This file is distributed under the same license as the Cura package. -# Ruben Dulek , 2017. +# Ruben Dulek , 2018. # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.2\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-30 13:05+0100\n" +"POT-Creation-Date: 2018-01-29 09:48+0000\n" +"PO-Revision-Date: 2018-02-05 13:25+0100\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" "Language: zh_CN\n" From 27d250374fa570f3a7827e8c009135976c6569ad Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 5 Feb 2018 14:34:29 +0100 Subject: [PATCH 522/551] Removed print() statements --- plugins/PluginBrowser/PluginBrowser.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 52cba72478..0e6992c51d 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -287,7 +287,6 @@ class PluginBrowser(QObject, Extension): @pyqtProperty(QObject, notify=pluginsMetadataChanged) def pluginsModel(self): - print("Updating plugins model...", self._view) self._plugins_model = PluginsModel(self._view) # self._plugins_model.update() @@ -367,7 +366,6 @@ class PluginBrowser(QObject, Extension): # Add metadata to the manager: self._plugins_metadata = json_data - print(self._plugins_metadata) self._plugin_registry.addExternalPlugins(self._plugins_metadata) self.pluginsMetadataChanged.emit() except json.decoder.JSONDecodeError: From 0e7edc3eaf5ccf52f21c2ea0229b529f8ed344e5 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 5 Feb 2018 14:36:42 +0100 Subject: [PATCH 523/551] CURA-4425 the thumbnail now crops correctly --- cura/Snapshot.py | 74 +++++++++++----------------------- plugins/UFPWriter/UFPWriter.py | 2 +- 2 files changed, 24 insertions(+), 52 deletions(-) diff --git a/cura/Snapshot.py b/cura/Snapshot.py index f12ff3e0e1..ff915eeaeb 100644 --- a/cura/Snapshot.py +++ b/cura/Snapshot.py @@ -17,11 +17,16 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator class Snapshot: + ## Return a QImage of the scene + # Uses PreviewPass that leaves out some elements + # Aspect ratio assumes a square @staticmethod def snapshot(width = 300, height = 300): scene = Application.getInstance().getController().getScene() active_camera = scene.getActiveCamera() render_width, render_height = active_camera.getWindowSize() + render_width = int(render_width) + render_height = int(render_height) preview_pass = PreviewPass(render_width, render_height) root = scene.getRoot() @@ -29,7 +34,6 @@ class Snapshot: # determine zoom and look at bbox = None - hulls = None for node in DepthFirstIterator(root): if type(node) == ConvexHullNode: print(node) @@ -38,16 +42,12 @@ class Snapshot: bbox = node.getBoundingBox() else: bbox = bbox + node.getBoundingBox() - convex_hull = node.getMeshData().getConvexHullTransformedVertices(node.getWorldTransformation()) - if hulls is None: - hulls = convex_hull - else: - hulls = numpy.concatenate((hulls, convex_hull), axis = 0) if bbox is None: bbox = AxisAlignedBox() look_at = bbox.center + # guessed size so the objects are hopefully big size = max(bbox.width, bbox.height, bbox.depth * 0.5) # Somehow the aspect ratio is also influenced in reverse by the screen width/height @@ -56,56 +56,27 @@ class Snapshot: projection_matrix.setPerspective(30, render_width / render_height, 1, 500) camera.setProjectionMatrix(projection_matrix) + # Looking from this direction (x, y, z) in OGL coordinates looking_from_offset = Vector(1, 1, 2) if size > 0: # determine the watch distance depending on the size looking_from_offset = looking_from_offset * size * 1.3 - camera.setViewportSize(render_width, render_height) - camera.setWindowSize(render_width, render_height) camera.setPosition(look_at + looking_from_offset) camera.lookAt(look_at) - # we need this for the projection calculation - hulls4 = numpy.ones((hulls.shape[0], 4)) - hulls4[:, :-1] = hulls - #position = Vector(10, 10, 10) - # projected_position = camera.project(position) - preview_pass.setCamera(camera) - preview_pass.setSize(render_width, render_height) # texture size preview_pass.render() pixel_output = preview_pass.getOutput() - print("Calculating image coordinates...") - view = camera.getWorldTransformation().getInverse() - min_x, max_x, min_y, max_y = render_width, 0, render_height, 0 - for hull_coords in hulls4: - projected_position = view.getData().dot(hull_coords) - projected_position2 = projection_matrix.getData().dot(projected_position) - #xx, yy = camera.project(Vector(data = hull_coords)) - # xx, yy range from -1 to 1 - xx = projected_position2[0] / projected_position2[2] / 2.0 - yy = projected_position2[1] / projected_position2[2] / 2.0 - # x, y 0..render_width/height - x = int(render_width / 2 + xx * render_width / 2) - y = int(render_height / 2 + yy * render_height / 2) - min_x = min(x, min_x) - max_x = max(x, max_x) - min_y = min(y, min_y) - max_y = max(y, max_y) - print(min_x, max_x, min_y, max_y) - - # print("looping all pixels in python...") - # min_x_, max_x_, min_y_, max_y_ = render_width, 0, render_height, 0 - # for y in range(int(render_height)): - # for x in range(int(render_width)): - # color = pixel_output.pixelColor(x, y) - # if color.alpha() > 0: - # min_x_ = min(x, min_x_) - # max_x_ = max(x, max_x_) - # min_y_ = min(y, min_y_) - # max_y_ = max(y, max_y_) - # print(min_x_, max_x_, min_y_, max_y_) + # Look at the resulting image to get a good crop. + # Get the pixels as byte array + pixel_array = pixel_output.bits().asarray(pixel_output.byteCount()) + # Convert to numpy array, assume it's 32 bit (it should always be) + pixels = numpy.frombuffer(pixel_array, dtype=numpy.uint8).reshape([render_height, render_width, 4]) + # Find indices of non zero pixels + nonzero_pixels = numpy.nonzero(pixels) + min_y, min_x, min_a_ = numpy.amin(nonzero_pixels, axis=1) + max_y, max_x, max_a_ = numpy.amax(nonzero_pixels, axis=1) # make it a square if max_x - min_x >= max_y - min_y: @@ -114,11 +85,12 @@ class Snapshot: else: # make x bigger min_x, max_x = int((max_x + min_x) / 2 - (max_y - min_y) / 2), int((max_x + min_x) / 2 + (max_y - min_y) / 2) - copy_pixel_output = pixel_output.copy(min_x, min_y, max_x - min_x, max_y - min_y) + cropped_image = pixel_output.copy(min_x, min_y, max_x - min_x, max_y - min_y) - # Scale it to the correct height - image = copy_pixel_output.scaledToHeight(height, QtCore.Qt.SmoothTransformation) - # Then chop of the width - cropped_image = image.copy(image.width() // 2 - width // 2, 0, width, height) + # Scale it to the correct size + scaled_image = cropped_image.scaled( + width, height, + aspectRatioMode = QtCore.Qt.IgnoreAspectRatio, + transformMode = QtCore.Qt.SmoothTransformation) - return cropped_image + return scaled_image diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 0f49a30403..aca293e25a 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -23,7 +23,7 @@ class UFPWriter(MeshWriter): def _createSnapshot(self, *args): # must be called from the main thread because of OpenGL Logger.log("d", "Creating thumbnail image...") - self._snapshot = Snapshot.snapshot() + self._snapshot = Snapshot.snapshot(width = 300, height = 300) def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode): archive = VirtualFile() From e64fb9c7622d149ad3fdcaf2fb55469fdf361bf1 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 5 Feb 2018 14:47:11 +0100 Subject: [PATCH 524/551] Splash closed on early crash --- cura_app.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index d1cf215fc5..d0170e5972 100755 --- a/cura_app.py +++ b/cura_app.py @@ -32,7 +32,7 @@ if not known_args["debug"]: return os.path.expanduser("~/.local/share/cura") elif Platform.isOSX(): return os.path.expanduser("~/Library/Logs/cura") - + if hasattr(sys, "frozen"): dirpath = get_cura_dir_path() os.makedirs(dirpath, exist_ok = True) @@ -110,6 +110,7 @@ def exceptHook(hook_type, value, traceback): application = QApplication(sys.argv) application.removePostedEvents(None) _crash_handler = CrashHandler(hook_type, value, traceback, has_started) + CuraApplication.getInstance().closeSplash() _crash_handler.early_crash_dialog.show() sys.exit(application.exec_()) From be92bbfcb0f5509a99eba67837ba387a048ac6af Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 5 Feb 2018 15:28:34 +0100 Subject: [PATCH 525/551] CURA-4425 improve image quality for some models combined with some viewing angles --- cura/Snapshot.py | 61 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/cura/Snapshot.py b/cura/Snapshot.py index ff915eeaeb..fbbee29d1b 100644 --- a/cura/Snapshot.py +++ b/cura/Snapshot.py @@ -3,6 +3,7 @@ import numpy from PyQt5 import QtCore +from PyQt5.QtGui import QImage from cura.PreviewPass import PreviewPass from cura.Scene import ConvexHullNode @@ -17,6 +18,21 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator class Snapshot: + @staticmethod + def getImageBoundaries(image: QImage): + # Look at the resulting image to get a good crop. + # Get the pixels as byte array + pixel_array = image.bits().asarray(image.byteCount()) + width, height = image.width(), image.height() + # Convert to numpy array, assume it's 32 bit (it should always be) + pixels = numpy.frombuffer(pixel_array, dtype=numpy.uint8).reshape([height, width, 4]) + # Find indices of non zero pixels + nonzero_pixels = numpy.nonzero(pixels) + min_y, min_x, min_a_ = numpy.amin(nonzero_pixels, axis=1) + max_y, max_x, max_a_ = numpy.amax(nonzero_pixels, axis=1) + + return min_x, max_x, min_y, max_y + ## Return a QImage of the scene # Uses PreviewPass that leaves out some elements # Aspect ratio assumes a square @@ -27,6 +43,10 @@ class Snapshot: render_width, render_height = active_camera.getWindowSize() render_width = int(render_width) render_height = int(render_height) + # Result should have enough resolution; it is cropped and then scaled down. + while (render_width < 1000) or (render_height < 1000): + render_width *= 2 + render_height *= 2 preview_pass = PreviewPass(render_width, render_height) root = scene.getRoot() @@ -50,12 +70,6 @@ class Snapshot: # guessed size so the objects are hopefully big size = max(bbox.width, bbox.height, bbox.depth * 0.5) - # Somehow the aspect ratio is also influenced in reverse by the screen width/height - # So you have to set it to render_width/render_height to get 1 - projection_matrix = Matrix() - projection_matrix.setPerspective(30, render_width / render_height, 1, 500) - camera.setProjectionMatrix(projection_matrix) - # Looking from this direction (x, y, z) in OGL coordinates looking_from_offset = Vector(1, 1, 2) if size > 0: @@ -64,19 +78,30 @@ class Snapshot: camera.setPosition(look_at + looking_from_offset) camera.lookAt(look_at) - preview_pass.setCamera(camera) - preview_pass.render() - pixel_output = preview_pass.getOutput() + satisfied = False + size = None + fovy = 30 - # Look at the resulting image to get a good crop. - # Get the pixels as byte array - pixel_array = pixel_output.bits().asarray(pixel_output.byteCount()) - # Convert to numpy array, assume it's 32 bit (it should always be) - pixels = numpy.frombuffer(pixel_array, dtype=numpy.uint8).reshape([render_height, render_width, 4]) - # Find indices of non zero pixels - nonzero_pixels = numpy.nonzero(pixels) - min_y, min_x, min_a_ = numpy.amin(nonzero_pixels, axis=1) - max_y, max_x, max_a_ = numpy.amax(nonzero_pixels, axis=1) + while not satisfied: + if size is not None: + satisfied = True # always be satisfied after second try + projection_matrix = Matrix() + # Somehow the aspect ratio is also influenced in reverse by the screen width/height + # So you have to set it to render_width/render_height to get 1 + projection_matrix.setPerspective(fovy, render_width / render_height, 1, 500) + camera.setProjectionMatrix(projection_matrix) + preview_pass.setCamera(camera) + preview_pass.render() + pixel_output = preview_pass.getOutput() + + min_x, max_x, min_y, max_y = Snapshot.getImageBoundaries(pixel_output) + + size = max((max_x - min_x) / render_width, (max_y - min_y) / render_height) + if size > 0.5 or satisfied: + satisfied = True + else: + # make it big and allow for some empty space around + fovy *= 0.5 # strangely enough this messes up the aspect ratio: fovy *= size * 1.1 # make it a square if max_x - min_x >= max_y - min_y: From e02cb78d5758e5e89c687893cd277e1ad7b70073 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 5 Feb 2018 16:39:45 +0100 Subject: [PATCH 526/551] CURA-4578 Manually installed plugins handled correctly 3rd-party plugins which were manually installed were listed as uninstall-able instead of disable-able. The distinction between plugins which could be installed or disabled was previously made by whether or not it was 3rd party, but is now made by determining the install location. --- plugins/PluginBrowser/PluginEntry.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PluginBrowser/PluginEntry.qml b/plugins/PluginBrowser/PluginEntry.qml index 85fc0b91b8..eff9eb8943 100644 --- a/plugins/PluginBrowser/PluginEntry.qml +++ b/plugins/PluginBrowser/PluginEntry.qml @@ -164,7 +164,7 @@ Component { Button { id: removeButton text: "Uninstall" - visible: model.external && model.status == "installed" + visible: model.can_uninstall && model.status == "installed" enabled: !manager.isDownloading style: ButtonStyle { background: Rectangle { From 7b9bec28912dae98bcef3ca3331811311c8a0108 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 5 Feb 2018 17:05:27 +0100 Subject: [PATCH 527/551] Fix: Wrong print jobs queued number CURA-4888 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 8f9a4d1d8f..26b445ef90 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -203,11 +203,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): @pyqtProperty("QVariantList", notify=printJobsChanged) def queuedPrintJobs(self): - return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is None] + return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is None or print_job.state == "queued"] @pyqtProperty("QVariantList", notify=printJobsChanged) def activePrintJobs(self): - return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is not None] + return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is not None and print_job.state != "queued"] @pyqtProperty("QVariantList", notify=clusterPrintersChanged) def connectedPrintersTypeCount(self): From a85a720184ab3d7f8cd7097375d00ff73dd4a805 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 5 Feb 2018 17:17:46 +0100 Subject: [PATCH 528/551] CURA-4895 Close the splash screen when the early crash dialog appears. Increase the size of 'show detailed crash report button' --- cura/CrashHandler.py | 8 +++++--- cura_app.py | 7 +++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index e90619aee5..a6b2373031 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -72,8 +72,10 @@ class CrashHandler: if has_started and exception_type not in fatal_exception_types: return - self._send_report_checkbox = None - self.early_crash_dialog = self._createEarlyCrashDialog() + if not has_started: + self._send_report_checkbox = None + self.early_crash_dialog = self._createEarlyCrashDialog() + self.dialog = QDialog() self._createDialog() @@ -99,7 +101,7 @@ class CrashHandler: self._send_report_checkbox.setChecked(True) show_details_button = QPushButton(catalog.i18nc("@action:button", "Show detailed crash report"), dialog) - show_details_button.setMaximumWidth(180) + show_details_button.setMaximumWidth(200) show_details_button.clicked.connect(self._showDetailedReport) layout.addWidget(self._send_report_checkbox) diff --git a/cura_app.py b/cura_app.py index d0170e5972..6c2d1c2937 100755 --- a/cura_app.py +++ b/cura_app.py @@ -99,18 +99,21 @@ def exceptHook(hook_type, value, traceback): from PyQt5.Qt import QApplication if CuraApplication.Created: _crash_handler = CrashHandler(hook_type, value, traceback, has_started) + if CuraApplication.splash is not None: + CuraApplication.splash.close() if not has_started: CuraApplication.getInstance().removePostedEvents(None) _crash_handler.early_crash_dialog.show() sys.exit(CuraApplication.getInstance().exec_()) else: _crash_handler.show() - sys.exit(1) else: application = QApplication(sys.argv) application.removePostedEvents(None) _crash_handler = CrashHandler(hook_type, value, traceback, has_started) - CuraApplication.getInstance().closeSplash() + # This means the QtApplication could be created and so the splash screen. Then Cura closes it + if CuraApplication.splash is not None: + CuraApplication.splash.close() _crash_handler.early_crash_dialog.show() sys.exit(application.exec_()) From 4438e064160c67ce4696d005353ed7be330eb5f3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 5 Feb 2018 17:21:51 +0100 Subject: [PATCH 529/551] Remove TODO CURA-4895 --- cura/CrashHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index a6b2373031..5796375897 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -124,7 +124,7 @@ class CrashHandler: os._exit(1) def _backupAndStartClean(self): - # TODO: backup the current cura directories and create clean ones + # backup the current cura directories and create clean ones from cura.CuraVersion import CuraVersion from UM.Resources import Resources # The early crash may happen before those information is set in Resources, so we need to set them here to From ab9c415e261a9d8f4ca678c8ea4d6d2600f517a6 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 5 Feb 2018 18:30:25 +0100 Subject: [PATCH 530/551] Gracefully handle missing libCharon --- plugins/UFPWriter/__init__.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/plugins/UFPWriter/__init__.py b/plugins/UFPWriter/__init__.py index 77f8e81222..9db6b042f8 100644 --- a/plugins/UFPWriter/__init__.py +++ b/plugins/UFPWriter/__init__.py @@ -1,13 +1,23 @@ #Copyright (c) 2018 Ultimaker B.V. #Cura is released under the terms of the LGPLv3 or higher. -from . import UFPWriter +import sys + +from UM.Logger import Logger +try: + from . import UFPWriter +except ImportError: + Logger.log("w", "Could not import UFPWriter; libCharon may be missing") + from UM.i18n import i18nCatalog #To translate the file format description. from UM.Mesh.MeshWriter import MeshWriter #For the binary mode flag. i18n_catalog = i18nCatalog("cura") def getMetaData(): + if "UFPWriter.UFPWriter" not in sys.modules: + return {} + return { "mesh_writer": { "output": [ @@ -22,4 +32,7 @@ def getMetaData(): } def register(app): + if "UFPWriter.UFPWriter" not in sys.modules: + return {} + return { "mesh_writer": UFPWriter.UFPWriter() } From 8ffd5442e7caf0bf873676cd913d57c7f4785490 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 6 Feb 2018 10:53:12 +0100 Subject: [PATCH 531/551] Fix indexing error in CrashHandler CURA-4895 --- cura/CrashHandler.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index 5796375897..fa09db3e50 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -262,8 +262,8 @@ class CrashHandler: layout = QVBoxLayout() text_area = QTextEdit() - trace_dict = traceback.format_exception(self.exception_type, self.value, self.traceback) - trace = "".join(trace_dict) + trace_list = traceback.format_exception(self.exception_type, self.value, self.traceback) + trace = "".join(trace_list) text_area.setText(trace) text_area.setReadOnly(True) @@ -271,14 +271,28 @@ class CrashHandler: group.setLayout(layout) # Parsing all the information to fill the dictionary - summary = trace_dict[len(trace_dict)-1].rstrip("\n") - module = trace_dict[len(trace_dict)-2].rstrip("\n").split("\n") + summary = "" + if len(trace_list) >= 1: + summary = trace_list[len(trace_list)-1].rstrip("\n") + module = [""] + if len(trace_list) >= 2: + module = trace_list[len(trace_list)-2].rstrip("\n").split("\n") module_split = module[0].split(", ") - filepath = module_split[0].split("\"")[1] + + filepath_directory_split = module_split[0].split("\"") + filepath = "" + if len(filepath_directory_split) > 1: + filepath = filepath_directory_split[1] directory, filename = os.path.split(filepath) - line = int(module_split[1].lstrip("line ")) - function = module_split[2].lstrip("in ") - code = module[1].lstrip(" ") + line = "" + if len(module_split) > 1: + line = int(module_split[1].lstrip("line ")) + function = "" + if len(module_split) > 2: + function = module_split[2].lstrip("in ") + code = "" + if len(module) > 1: + code = module[1].lstrip(" ") # Using this workaround for a cross-platform path splitting split_path = [] From fdfeeb5496dbc13988e5b68093ee5e703d903a0d Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 6 Feb 2018 13:38:14 +0100 Subject: [PATCH 532/551] Renamed: In Postprocessing plugin the "Tweak" script is renamed to "Change" CURA-4615 --- .../PostProcessingPlugin/scripts/TweakAtZ.py | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/TweakAtZ.py b/plugins/PostProcessingPlugin/scripts/TweakAtZ.py index 7b714f6ee0..aca91f907a 100644 --- a/plugins/PostProcessingPlugin/scripts/TweakAtZ.py +++ b/plugins/PostProcessingPlugin/scripts/TweakAtZ.py @@ -53,7 +53,7 @@ class TweakAtZ(Script): def getSettingDataString(self): return """{ - "name":"TweakAtZ """ + self.version + """ (Experimental)", + "name":"ChangeAtZ """ + self.version + """ (Experimental)", "key":"TweakAtZ", "metadata": {}, "version": 2, @@ -69,8 +69,8 @@ class TweakAtZ(Script): }, "b_targetZ": { - "label": "Tweak Height", - "description": "Z height to tweak at", + "label": "Change Height", + "description": "Z height to change at", "unit": "mm", "type": "float", "default_value": 5.0, @@ -81,8 +81,8 @@ class TweakAtZ(Script): }, "b_targetL": { - "label": "Tweak Layer", - "description": "Layer no. to tweak at", + "label": "Change Layer", + "description": "Layer no. to change at", "unit": "", "type": "int", "default_value": 1, @@ -93,7 +93,7 @@ class TweakAtZ(Script): "c_behavior": { "label": "Behavior", - "description": "Select behavior: Tweak value and keep it for the rest, Tweak value for single layer only", + "description": "Select behavior: Change value and keep it for the rest, Change value for single layer only", "type": "enum", "options": {"keep_value":"Keep value","single_layer":"Single Layer"}, "default_value": "keep_value" @@ -101,7 +101,7 @@ class TweakAtZ(Script): "d_twLayers": { "label": "No. Layers", - "description": "No. of layers used to tweak", + "description": "No. of layers used to change", "unit": "", "type": "int", "default_value": 1, @@ -111,8 +111,8 @@ class TweakAtZ(Script): }, "e1_Tweak_speed": { - "label": "Tweak Speed", - "description": "Select if total speed (print and travel) has to be tweaked", + "label": "Change Speed", + "description": "Select if total speed (print and travel) has to be cahnged", "type": "bool", "default_value": false }, @@ -130,8 +130,8 @@ class TweakAtZ(Script): }, "f1_Tweak_printspeed": { - "label": "Tweak Print Speed", - "description": "Select if print speed has to be tweaked", + "label": "Change Print Speed", + "description": "Select if print speed has to be changed", "type": "bool", "default_value": false }, @@ -149,8 +149,8 @@ class TweakAtZ(Script): }, "g1_Tweak_flowrate": { - "label": "Tweak Flow Rate", - "description": "Select if flow rate has to be tweaked", + "label": "Change Flow Rate", + "description": "Select if flow rate has to be changed", "type": "bool", "default_value": false }, @@ -168,8 +168,8 @@ class TweakAtZ(Script): }, "g3_Tweak_flowrateOne": { - "label": "Tweak Flow Rate 1", - "description": "Select if first extruder flow rate has to be tweaked", + "label": "Change Flow Rate 1", + "description": "Select if first extruder flow rate has to be changed", "type": "bool", "default_value": false }, @@ -187,8 +187,8 @@ class TweakAtZ(Script): }, "g5_Tweak_flowrateTwo": { - "label": "Tweak Flow Rate 2", - "description": "Select if second extruder flow rate has to be tweaked", + "label": "Change Flow Rate 2", + "description": "Select if second extruder flow rate has to be changed", "type": "bool", "default_value": false }, @@ -206,8 +206,8 @@ class TweakAtZ(Script): }, "h1_Tweak_bedTemp": { - "label": "Tweak Bed Temp", - "description": "Select if Bed Temperature has to be tweaked", + "label": "Change Bed Temp", + "description": "Select if Bed Temperature has to be changed", "type": "bool", "default_value": false }, @@ -225,8 +225,8 @@ class TweakAtZ(Script): }, "i1_Tweak_extruderOne": { - "label": "Tweak Extruder 1 Temp", - "description": "Select if First Extruder Temperature has to be tweaked", + "label": "Change Extruder 1 Temp", + "description": "Select if First Extruder Temperature has to be changed", "type": "bool", "default_value": false }, @@ -244,8 +244,8 @@ class TweakAtZ(Script): }, "i3_Tweak_extruderTwo": { - "label": "Tweak Extruder 2 Temp", - "description": "Select if Second Extruder Temperature has to be tweaked", + "label": "Change Extruder 2 Temp", + "description": "Select if Second Extruder Temperature has to be changed", "type": "bool", "default_value": false }, @@ -263,8 +263,8 @@ class TweakAtZ(Script): }, "j1_Tweak_fanSpeed": { - "label": "Tweak Fan Speed", - "description": "Select if Fan Speed has to be tweaked", + "label": "Change Fan Speed", + "description": "Select if Fan Speed has to be changed", "type": "bool", "default_value": false }, From 08394c99d32d13ad70fb5b19eba26b8e83aff04e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 6 Feb 2018 14:27:54 +0100 Subject: [PATCH 533/551] PossibleDefinitionIds from name only returns distinct names It would sometimes return 3x the same id. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 39cbe5669c..f5e9a2c2b1 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -916,11 +916,11 @@ class XmlMaterialProfile(InstanceContainer): else: merged_name_parts.append(part) - id_list = [name.lower().replace(" ", ""), # simply removing all spaces + id_list = {name.lower().replace(" ", ""), # simply removing all spaces name.lower().replace(" ", "_"), # simply replacing all spaces with underscores "_".join(merged_name_parts), - ] - + } + id_list = list(id_list) return id_list ## Gets a mapping from product names in the XML files to their definition From b4a1b97eda62dcbcf6da02ed44ac07e4973daa84 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 6 Feb 2018 14:37:39 +0100 Subject: [PATCH 534/551] Removed warning that caused massive spam --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index f5e9a2c2b1..f0d016025e 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -544,7 +544,6 @@ class XmlMaterialProfile(InstanceContainer): for machine_id in machine_id_list: definitions = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = machine_id) if not definitions: - Logger.log("w", "No definition found for machine ID %s", machine_id) continue definition = definitions[0] @@ -777,7 +776,6 @@ class XmlMaterialProfile(InstanceContainer): for machine_id in machine_id_list: definition_metadata = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = machine_id) if not definition_metadata: - Logger.log("w", "No definition found for machine ID %s", machine_id) continue definition_metadata = definition_metadata[0] From 8541ce25bb7d6525b067103c6c174c3b4c29ab18 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 6 Feb 2018 15:43:29 +0100 Subject: [PATCH 535/551] CURA-4425 Remove print out messages --- cura/Snapshot.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cura/Snapshot.py b/cura/Snapshot.py index fbbee29d1b..394241cfa8 100644 --- a/cura/Snapshot.py +++ b/cura/Snapshot.py @@ -55,8 +55,6 @@ class Snapshot: # determine zoom and look at bbox = None for node in DepthFirstIterator(root): - if type(node) == ConvexHullNode: - print(node) if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible(): if bbox is None: bbox = node.getBoundingBox() From 399a63912e063a9c18517bf552da7e381ef4d175 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 6 Feb 2018 16:10:58 +0100 Subject: [PATCH 536/551] Improve error message with the trigger early crash option This way our logs are a bit more clear. --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c39ce1d079..06bcdbfe05 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -225,7 +225,7 @@ class CuraApplication(QtApplication): # FOR TESTING ONLY if kwargs["parsed_command_line"].get("trigger_early_crash", False): - 1/0 + assert not "This crash is triggered by the trigger_early_crash command line argument." self.default_theme = "cura-light" From 45a4c569155494214d6353ce91b582f1bf15434a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 6 Feb 2018 16:25:15 +0100 Subject: [PATCH 537/551] Fix brackets in Korean translation So that it won't crash. --- resources/i18n/ko_KR/cura.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index 1cabac3628..f63d7ba64f 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -1343,7 +1343,7 @@ msgstr "인터페이스로드 중 ..." #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" -msgstr "% (너비) .1f x % (깊이) .1f x % (높이) .1f mm" +msgstr "%(width).1f x %(depth).1f x %(height).1f mm" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 #, python-brace-format From 1ab7eb64a1b022c978e4cc77585e51dd964cc80f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 6 Feb 2018 16:50:03 +0100 Subject: [PATCH 538/551] Create message before connecting to stack changed signal Because if the stack changed signal gets fired while the __init__ function is still running then you get a critical error. --- cura/BuildVolume.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 2567641cc9..672e01360a 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from cura.Settings.ExtruderManager import ExtruderManager @@ -73,6 +73,11 @@ class BuildVolume(SceneNode): self._adhesion_type = None self._platform = Platform(self) + self._build_volume_message = Message(catalog.i18nc("@info:status", + "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."), title = catalog.i18nc("@info:title", "Build Volume")) + self._global_container_stack = None Application.getInstance().globalContainerStackChanged.connect(self._onStackChanged) self._onStackChanged() @@ -96,11 +101,6 @@ class BuildVolume(SceneNode): self._setting_change_timer.setSingleShot(True) self._setting_change_timer.timeout.connect(self._onSettingChangeTimerFinished) - self._build_volume_message = Message(catalog.i18nc("@info:status", - "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."), title = catalog.i18nc("@info:title","Build Volume")) - # Must be after setting _build_volume_message, apparently that is used in getMachineManager. # activeQualityChanged is always emitted after setActiveVariant, setActiveMaterial and setActiveQuality. # Therefore this works. From 47925ec3bc2d2d3c156b8f87a750be98f0205600 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 6 Feb 2018 18:51:11 +0100 Subject: [PATCH 539/551] PyTest fix: The extruder stack test is failed --- tests/Settings/TestExtruderStack.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/Settings/TestExtruderStack.py b/tests/Settings/TestExtruderStack.py index 2a8d19b80f..e1538cd3fc 100644 --- a/tests/Settings/TestExtruderStack.py +++ b/tests/Settings/TestExtruderStack.py @@ -15,6 +15,7 @@ from cura.Settings.Exceptions import InvalidContainerError, InvalidOperationErro from cura.Settings.ExtruderManager import ExtruderManager from UM.Settings.ContainerRegistry import ContainerRegistry +from cura.Settings.GlobalStack import GlobalStack ## Fake container registry that always provides all containers you ask of. @pytest.yield_fixture() @@ -252,7 +253,7 @@ def test_deserializeMoveInstanceContainer(extruder_stack): assert extruder_stack.quality.getId() == "empty" assert extruder_stack.material.getId() != "empty" - +from UM.Settings.Validator import Validator ## Tests whether a definition container in the wrong spot is moved into the # correct spot by deserialising. @pytest.mark.skip #The test currently fails because the definition container doesn't have a category, which is wrong but we don't have time to refactor that right now. @@ -279,8 +280,8 @@ def test_getPropertyFallThrough(extruder_stack): container_indices = cura.Settings.CuraContainerStack._ContainerIndexes #Cache. for type_id, type_name in container_indices.IndexTypeMap.items(): container = unittest.mock.MagicMock() - # Return type_id when asking for value and -1 when asking for limit_to_extruder - container.getProperty = lambda key, property, context = None, type_id = type_id: type_id if (key == "layer_height" and property == "value") else (None if property != "limit_to_extruder" else "-1") #Returns the container type ID as layer height, in order to identify it. + # Return type_id when asking for value and -1 when asking for settable_per_extruder + container.getProperty = lambda key, property, context = None, type_id = type_id: type_id if (key == "layer_height" and property == "value") else (None if property != "settable_per_extruder" else "-1") #Returns the container type ID as layer height, in order to identify it. container.hasProperty = lambda key, property: key == "layer_height" container.getMetaDataEntry = unittest.mock.MagicMock(return_value = type_name) mock_layer_heights[type_id] = container @@ -298,7 +299,9 @@ def test_getPropertyFallThrough(extruder_stack): extruder_stack.variant = mock_no_settings[container_indices.Variant] with unittest.mock.patch("cura.Settings.CuraContainerStack.DefinitionContainer", unittest.mock.MagicMock): #To guard against the type checking. extruder_stack.definition = mock_layer_heights[container_indices.Definition] #There's a layer height in here! - extruder_stack.setNextStack(unittest.mock.MagicMock()) + + stack = GlobalStack("PyTest GlobalStack") + extruder_stack.setNextStack(stack) assert extruder_stack.getProperty("layer_height", "value") == container_indices.Definition extruder_stack.variant = mock_layer_heights[container_indices.Variant] From cb6b465ce7a1b4f3744aaa204a37746fa2a9947b Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 7 Feb 2018 09:55:22 +0100 Subject: [PATCH 540/551] CURA-4924 fix loading profiles with % in it --- 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 0b328cebda..dda78fc52f 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -711,7 +711,7 @@ class CuraContainerRegistry(ContainerRegistry): if not os.path.isfile(file_path): continue - parser = configparser.ConfigParser() + parser = configparser.ConfigParser(interpolation=None) try: parser.read([file_path]) except: From 98f925d50cc6e804470bb8c93a2a17940d9a3ce7 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 7 Feb 2018 10:00:02 +0100 Subject: [PATCH 541/551] CURA-4924 now creating the extruder container with metadata extruder --- cura/Settings/CuraContainerRegistry.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index dda78fc52f..148ed6fe59 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -606,6 +606,7 @@ class CuraContainerRegistry(ContainerRegistry): extruder_quality_changes_container = self._findQualityChangesContainerInCuraFolder(machine_quality_changes.getName()) if extruder_quality_changes_container: quality_changes_id = extruder_quality_changes_container.getId() + extruder_quality_changes_container.addMetaDataEntry("extruder", extruder_stack.definition.getId()) extruder_stack.setQualityChangesById(quality_changes_id) else: # if we still cannot find a quality changes container for the extruder, create a new one From a460804bbe4d59fdae192d13fba052ee01adeb96 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 7 Feb 2018 10:21:40 +0100 Subject: [PATCH 542/551] CURA-4924 always use interpolation = None for configparser, preventive --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 10 +++++----- plugins/3MFWriter/ThreeMFWorkspaceWriter.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 01de4cc2c5..589ac6b845 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -122,7 +122,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # The default ContainerStack.deserialize() will connect signals, which is not desired in this case. # Since we know that the stack files are INI files, so we directly use the ConfigParser to parse them. serialized = archive.open(file_name).read().decode("utf-8") - stack_config = ConfigParser() + stack_config = ConfigParser(interpolation = None) stack_config.read_string(serialized) # sanity check @@ -303,7 +303,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if containers_found_dict["machine"] and not machine_conflict: for extruder_stack_file in extruder_stack_files: serialized = archive.open(extruder_stack_file).read().decode("utf-8") - parser = configparser.ConfigParser() + parser = configparser.ConfigParser(interpolation = None) parser.read_string(serialized) # The check should be done for the extruder stack that's associated with the existing global stack, @@ -407,7 +407,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): ## Overrides an ExtruderStack in the given GlobalStack and returns the new ExtruderStack. def _overrideExtruderStack(self, global_stack, extruder_file_content, extruder_stack_file): # Get extruder position first - extruder_config = configparser.ConfigParser() + extruder_config = configparser.ConfigParser(interpolation = None) extruder_config.read_string(extruder_file_content) if not extruder_config.has_option("metadata", "position"): msg = "Could not find 'metadata/position' in extruder stack file" @@ -564,7 +564,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): serialized = archive.open(instance_container_file).read().decode("utf-8") # HACK! we ignore "quality" and "variant" instance containers! - parser = configparser.ConfigParser() + parser = configparser.ConfigParser(interpolation = None) parser.read_string(serialized) if not parser.has_option("metadata", "type"): Logger.log("w", "Cannot find metadata/type in %s, ignoring it", instance_container_file) @@ -762,7 +762,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # 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 = configparser.ConfigParser(interpolation = None) extruder_config.read_string(extruder_file_content) extruder_config.set("metadata", "machine", global_stack_id_new) tmp_string_io = io.StringIO() diff --git a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py index 825259ad58..507274d355 100644 --- a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py +++ b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py @@ -57,7 +57,7 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): # Save Cura version version_file = zipfile.ZipInfo("Cura/version.ini") - version_config_parser = configparser.ConfigParser() + version_config_parser = configparser.ConfigParser(interpolation = None) version_config_parser.add_section("versions") version_config_parser.set("versions", "cura_version", Application.getInstance().getVersion()) version_config_parser.set("versions", "build_type", Application.getInstance().getBuildType()) From c890472641fc2f5e833ee70221760344d73ccdad Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 7 Feb 2018 10:53:17 +0100 Subject: [PATCH 543/551] Fix: save Custom setting visibility preset CURA-3710 --- resources/qml/Preferences/SettingVisibilityPage.qml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index 561c1f8f9d..c0a6d42b65 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -79,7 +79,13 @@ UM.PreferencesPage } // After change set "Custom" option - visibilityPreset.currentIndex = visibilityPreset.model.count - 1 + + // If already "Custom" then don't do nothing + if (visibilityPreset.currentIndex != visibilityPreset.model.count - 1) + { + visibilityPreset.currentIndex = visibilityPreset.model.count - 1 + UM.Preferences.setValue("general/preset_setting_visibility_choice", visibilityPreset.model.get(visibilityPreset.currentIndex).text) + } } } } @@ -260,6 +266,8 @@ UM.PreferencesPage if (visibilityPreset.currentIndex != visibilityPreset.model.count - 1) { visibilityPreset.currentIndex = visibilityPreset.model.count - 1 + UM.Preferences.setValue("general/preset_setting_visibility_choice", visibilityPreset.model.get(visibilityPreset.currentIndex).text) + } } } From 3a88c1ee887271dc29026ea2520203b3b57867f6 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 7 Feb 2018 11:27:02 +0100 Subject: [PATCH 544/551] CURA-4923 fix handle setting function in material_diameter --- cura/Settings/ExtruderManager.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index f9f0fbb401..35b5b1320b 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -519,13 +519,19 @@ class ExtruderManager(QObject): material_diameter = 0 material_approximate_diameter = str(round(material_diameter)) - machine_diameter = extruder_stack.definitionChanges.getProperty("material_diameter", "value") - if not machine_diameter: + material_diameter = extruder_stack.definitionChanges.getProperty("material_diameter", "value") + setting_provider = extruder_stack + if not material_diameter: if extruder_stack.definition.hasProperty("material_diameter", "value"): - machine_diameter = extruder_stack.definition.getProperty("material_diameter", "value") + material_diameter = extruder_stack.definition.getProperty("material_diameter", "value") else: - machine_diameter = global_stack.definition.getProperty("material_diameter", "value") - machine_approximate_diameter = str(round(machine_diameter)) + material_diameter = global_stack.definition.getProperty("material_diameter", "value") + setting_provider = global_stack + + if isinstance(material_diameter, SettingFunction): + material_diameter = material_diameter(setting_provider) + + machine_approximate_diameter = str(round(material_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.") From f29d07ce40c0b15b0b07630cb02dc1f832135bd3 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 7 Feb 2018 11:42:15 +0100 Subject: [PATCH 545/551] CURA-4923 corrected the material diameter of malyan_m200 --- resources/definitions/malyan_m200.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/malyan_m200.def.json b/resources/definitions/malyan_m200.def.json index 9aae3a5244..365b031c43 100644 --- a/resources/definitions/malyan_m200.def.json +++ b/resources/definitions/malyan_m200.def.json @@ -51,7 +51,7 @@ "machine_height": { "default_value": 120 }, "machine_heated_bed": { "default_value": true }, "machine_center_is_zero": { "default_value": false }, - "material_diameter": { "value": 1.75 }, + "material_diameter": { "default_value": 1.75 }, "machine_nozzle_size": { "default_value": 0.4, "minimum_value": 0.15 From 7bbe42eb42ab19b437dd248213bf03ab6ae199f2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 7 Feb 2018 13:25:27 +0100 Subject: [PATCH 546/551] Remove unnecessary usage of value instead of default This is not really a formula. --- resources/definitions/peopoly_moai.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/peopoly_moai.def.json b/resources/definitions/peopoly_moai.def.json index 78aca31dae..5a3cbddd14 100644 --- a/resources/definitions/peopoly_moai.def.json +++ b/resources/definitions/peopoly_moai.def.json @@ -136,7 +136,7 @@ }, "material_diameter": { "enabled": false, - "value": "1.75" + "default_value": 1.75 }, "cool_fan_enabled": { "enabled": false, From 47826595694cce97b4f0edfb443b4e106252b462 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 7 Feb 2018 13:48:23 +0100 Subject: [PATCH 547/551] CURA-4425 remove resolution optimization, it does not work as expected and leaves a cropped image --- cura/Snapshot.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cura/Snapshot.py b/cura/Snapshot.py index 394241cfa8..50bbf99008 100644 --- a/cura/Snapshot.py +++ b/cura/Snapshot.py @@ -43,10 +43,6 @@ class Snapshot: render_width, render_height = active_camera.getWindowSize() render_width = int(render_width) render_height = int(render_height) - # Result should have enough resolution; it is cropped and then scaled down. - while (render_width < 1000) or (render_height < 1000): - render_width *= 2 - render_height *= 2 preview_pass = PreviewPass(render_width, render_height) root = scene.getRoot() From f655b0e03322b7c51a923837c52b6eac3ce7c259 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 7 Feb 2018 16:22:13 +0100 Subject: [PATCH 548/551] Set Custom in visible setting preset CURA-3710 --- resources/qml/Preferences/SettingVisibilityPage.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index c0a6d42b65..0e3069d194 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -179,8 +179,10 @@ UM.PreferencesPage onActivated: { // TODO What to do if user is selected "Custom from Combobox" ? - if (model.get(index).text == "Custom") + if (model.get(index).text == "Custom"){ + UM.Preferences.setValue("general/preset_setting_visibility_choice", model.get(index).text) return + } var newVisibleSettings = CuraApplication.getVisibilitySettingPreset(model.get(index).text) UM.Preferences.setValue("general/visible_settings", newVisibleSettings) @@ -267,7 +269,6 @@ UM.PreferencesPage { visibilityPreset.currentIndex = visibilityPreset.model.count - 1 UM.Preferences.setValue("general/preset_setting_visibility_choice", visibilityPreset.model.get(visibilityPreset.currentIndex).text) - } } } From 22e0c80b3de23a8dba54a1c1115aa1c625803a2d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 8 Feb 2018 10:27:54 +0100 Subject: [PATCH 549/551] Removed unneeded extra error check This caused an extra 1.5 second delay on changing machine configurations for dual extrusion machines. --- cura/Settings/MachineManager.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 26b3d3d7ec..8f315c4b3e 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -369,7 +369,6 @@ class MachineManager(QObject): self.activeQualityChanged.emit() self.activeVariantChanged.emit() self.activeMaterialChanged.emit() - self._updateStacksHaveErrors() # Prevents unwanted re-slices after changing machine self._error_check_timer.start() def _onProfilesModelChanged(self, *args): From b36d3c759ffba95ab5de6c5fe7701833cc312883 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 8 Feb 2018 11:40:23 +0100 Subject: [PATCH 550/551] Codestyle & typing fixes --- cura/Settings/MachineManager.py | 48 ++++++++++++++++----------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 8f315c4b3e..7e0e67a7e0 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -4,12 +4,13 @@ import collections import time #Type hinting. -from typing import Union, List, Dict +from typing import Union, List, Dict, TYPE_CHECKING, Optional from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Signal import Signal from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal, QTimer +import UM.FlameProfiler from UM.FlameProfiler import pyqtSlot from PyQt5.QtWidgets import QMessageBox from UM import Util @@ -25,7 +26,7 @@ from UM.Settings.ContainerStack import ContainerStack from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.SettingFunction import SettingFunction from UM.Signal import postponeSignals, CompressTechnique -import UM.FlameProfiler + from cura.QualityManager import QualityManager from cura.PrinterOutputDevice import PrinterOutputDevice @@ -37,7 +38,6 @@ from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") from cura.Settings.ProfilesModel import ProfilesModel -from typing import TYPE_CHECKING, Optional if TYPE_CHECKING: from UM.Settings.DefinitionContainer import DefinitionContainer @@ -55,10 +55,10 @@ class MachineManager(QObject): self.machine_extruder_material_update_dict = collections.defaultdict(list) # Used to store the new containers until after confirming the dialog - self._new_variant_container = None - self._new_buildplate_container = None - self._new_material_container = None - self._new_quality_containers = [] + self._new_variant_container = None # type: Optional[InstanceContainer] + self._new_buildplate_container = None # type: Optional[InstanceContainer] + self._new_material_container = None # type: Optional[InstanceContainer] + self._new_quality_containers = [] # type: List[Dict] self._error_check_timer = QTimer() self._error_check_timer.setInterval(250) @@ -79,7 +79,7 @@ class MachineManager(QObject): self.globalContainerChanged.connect(self.activeVariantChanged) self.globalContainerChanged.connect(self.activeQualityChanged) - self._stacks_have_errors = None + self._stacks_have_errors = None # type:Optional[bool] self._empty_definition_changes_container = ContainerRegistry.getInstance().findContainers(id = "empty_definition_changes")[0] self._empty_variant_container = ContainerRegistry.getInstance().findContainers(id = "empty_variant")[0] @@ -181,7 +181,7 @@ class MachineManager(QObject): def totalNumberOfSettings(self) -> int: return len(ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0].getAllKeys()) - def _onHotendIdChanged(self): + def _onHotendIdChanged(self) -> None: if not self._global_container_stack or not self._printer_output_devices: return @@ -209,7 +209,7 @@ class MachineManager(QObject): # A change was found, let the output device handle this. self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) - def _onMaterialIdChanged(self): + def _onMaterialIdChanged(self) -> None: if not self._global_container_stack or not self._printer_output_devices: return @@ -246,7 +246,7 @@ class MachineManager(QObject): # A change was found, let the output device handle this. self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) - def _materialHotendChangedCallback(self, button): + def _materialHotendChangedCallback(self, button) -> None: if button == QMessageBox.No: self._auto_materials_changed = {} self._auto_hotends_changed = {} @@ -254,7 +254,7 @@ class MachineManager(QObject): self._autoUpdateMaterials() self._autoUpdateHotends() - def _autoUpdateMaterials(self): + def _autoUpdateMaterials(self) -> None: extruder_manager = ExtruderManager.getInstance() for position in self._auto_materials_changed: material_id = self._auto_materials_changed[position] @@ -270,9 +270,9 @@ class MachineManager(QObject): if old_index is not None: extruder_manager.setActiveExtruderIndex(old_index) - self._auto_materials_changed = {} #Processed all of them now. + self._auto_materials_changed = {} # Processed all of them now. - def _autoUpdateHotends(self): + def _autoUpdateHotends(self) -> None: extruder_manager = ExtruderManager.getInstance() for position in self._auto_hotends_changed: hotend_id = self._auto_hotends_changed[position] @@ -289,7 +289,7 @@ class MachineManager(QObject): extruder_manager.setActiveExtruderIndex(old_index) self._auto_hotends_changed = {} # Processed all of them now. - def _onGlobalContainerChanged(self): + def _onGlobalContainerChanged(self) -> None: if self._global_container_stack: try: self._global_container_stack.nameChanged.disconnect(self._onMachineNameChanged) @@ -308,7 +308,7 @@ class MachineManager(QObject): extruder_stack.propertyChanged.disconnect(self._onPropertyChanged) extruder_stack.containersChanged.disconnect(self._onInstanceContainersChanged) - # update the local global container stack reference + # Update the local global container stack reference self._global_container_stack = Application.getInstance().getGlobalContainerStack() self.globalContainerChanged.emit() @@ -345,14 +345,14 @@ class MachineManager(QObject): self._error_check_timer.start() ## Update self._stacks_valid according to _checkStacksForErrors and emit if change. - def _updateStacksHaveErrors(self): + def _updateStacksHaveErrors(self) -> None: old_stacks_have_errors = self._stacks_have_errors self._stacks_have_errors = self._checkStacksHaveErrors() if old_stacks_have_errors != self._stacks_have_errors: self.stacksValidationChanged.emit() Application.getInstance().stacksValidationFinished.emit() - def _onActiveExtruderStackChanged(self): + def _onActiveExtruderStackChanged(self) -> None: self.blurSettings.emit() # Ensure no-one has focus. old_active_container_stack = self._active_container_stack @@ -365,16 +365,16 @@ class MachineManager(QObject): # on _active_container_stack. If it changes, then the properties change. self.activeQualityChanged.emit() - def __emitChangedSignals(self): + def __emitChangedSignals(self) -> None: self.activeQualityChanged.emit() self.activeVariantChanged.emit() self.activeMaterialChanged.emit() self._error_check_timer.start() - def _onProfilesModelChanged(self, *args): + def _onProfilesModelChanged(self, *args) -> None: self.__emitChangedSignals() - def _onInstanceContainersChanged(self, container): + def _onInstanceContainersChanged(self, container) -> None: # This should not trigger the ProfilesModel to be created, or there will be an infinite recursion if not self._connected_to_profiles_model and ProfilesModel.hasInstance(): # This triggers updating the qualityModel in SidebarSimple whenever ProfilesModel is updated @@ -384,7 +384,7 @@ class MachineManager(QObject): self._instance_container_timer.start() - def _onPropertyChanged(self, key: str, property_name: str): + def _onPropertyChanged(self, key: str, property_name: str) -> None: if property_name == "value": # Notify UI items, such as the "changed" star in profile pull down menu. self.activeStackValueChanged.emit() @@ -441,7 +441,7 @@ class MachineManager(QObject): ## Remove all instances from the top instanceContainer (effectively removing all user-changed settings) @pyqtSlot() - def clearUserSettings(self): + def clearUserSettings(self) -> None: if not self._active_container_stack: return @@ -479,7 +479,7 @@ class MachineManager(QObject): ## Delete a user setting from the global stack and all extruder stacks. # \param key \type{str} the name of the key to delete @pyqtSlot(str) - def clearUserSettingAllCurrentStacks(self, key: str): + def clearUserSettingAllCurrentStacks(self, key: str) -> None: if not self._global_container_stack: return From e157d8e0455143cdb52afad430563352e0464a12 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 8 Feb 2018 15:02:34 +0100 Subject: [PATCH 551/551] Fix position of additional components This fixes the position when disabling auto-slice. The position of additional components was wrong, such as the post-processing button. --- 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 bf44a29cf5..df91790511 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ultimaker B.V. +// Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -131,7 +131,7 @@ Item { Row { id: additionalComponentsRow anchors.top: parent.top - anchors.right: saveToButton.visible ? saveToButton.left : parent.right + anchors.right: saveToButton.visible ? saveToButton.left : (prepareButton.visible ? prepareButton.left : parent.right) anchors.rightMargin: UM.Theme.getSize("default_margin").width spacing: UM.Theme.getSize("default_margin").width

    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%0A>0hOM)N{Hiq*Cs-aM9vLi}?f^JFe;Ob)sG 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 b%6p*e49UK=9{Q?%WT%|XND^KDrcUR7;Z8EB From 39aec54a56b566e4f08fa5ccd0fc476d8d1ceb79 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 16 Jan 2018 09:27:56 +0100 Subject: [PATCH 307/551] Fix reference to Tevo Black Widow model Also fix some whitespace mistakes according to code style. Lots of tabs in there, whitespace at the end of a line, brackets on the same line, etc. --- .../definitions/anycubic_i3_mega.def.json | 92 +++++++++++-------- .../definitions/tevo_blackwidow.def.json | 47 ++++++---- 2 files changed, 83 insertions(+), 56 deletions(-) diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json index a373872de8..cba868900c 100644 --- a/resources/definitions/anycubic_i3_mega.def.json +++ b/resources/definitions/anycubic_i3_mega.def.json @@ -1,55 +1,69 @@ { - "version":2, - "name":"Anycubic i3 Mega", - "inherits":"fdmprinter", - "metadata":{ - "visible":true, - "author":"TheTobby", - "manufacturer":"Anycubic", - "file_formats":"text/x-gcode", - "icon":"icon_ultimaker2", - "platform":"anycubic_i3_mega_platform.stl", - "has_materials": false, - "has_machine_quality": true, - "preferred_quality": "*normal*" + "version": 2, + "name": "Anycubic i3 Mega", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "TheTobby", + "manufacturer": "Anycubic", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2", + "platform": "anycubic_i3_mega_platform.stl", + "has_materials": false, + "has_machine_quality": true, + "preferred_quality": "*normal*" }, - - "overrides":{ - "machine_name":{ - "default_value":"Anycubic i3 Mega" + + "overrides": + { + "machine_name": + { + "default_value": "Anycubic i3 Mega" }, - "machine_heated_bed":{ - "default_value":true + "machine_heated_bed": + { + "default_value": true }, - "machine_width":{ - "default_value":210 + "machine_width": + { + "default_value": 210 }, - "machine_height":{ - "default_value":205 + "machine_height": + { + "default_value": 205 }, - "machine_depth":{ - "default_value":210 + "machine_depth": + { + "default_value": 210 }, - "machine_center_is_zero":{ - "default_value":false + "machine_center_is_zero": + { + "default_value": false }, - "machine_nozzle_size":{ - "default_value":0.4 + "machine_nozzle_size": + { + "default_value": 0.4 }, - "material_diameter":{ - "default_value":1.75 + "material_diameter": + { + "default_value": 1.75 }, - "gantry_height":{ - "default_value":0 + "gantry_height": + { + "default_value": 0 }, - "machine_gcode_flavor":{ - "default_value":"RepRap (Marlin/Sprinter)" + "machine_gcode_flavor": + { + "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_start_gcode":{ - "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\nG5" + "machine_start_gcode": + { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\nG5" }, - "machine_end_gcode":{ - "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" + "machine_end_gcode": + { + "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" } } } diff --git a/resources/definitions/tevo_blackwidow.def.json b/resources/definitions/tevo_blackwidow.def.json index 9d7166f4a2..04cadfb160 100644 --- a/resources/definitions/tevo_blackwidow.def.json +++ b/resources/definitions/tevo_blackwidow.def.json @@ -8,46 +8,59 @@ "manufacturer": "Tevo", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", - "has_materials": false, + "has_materials": false, "has_machine_quality": true, - "platform": "prusai3_platform.stl", - "preferred_quality": "*normal*" + "platform": "tevo_blackwidow.stl", + "preferred_quality": "*normal*" }, - "overrides": { - "machine_name": { + "overrides": + { + "machine_name": + { "default_value": "Tevo Black Widow" }, - "machine_heated_bed": { + "machine_heated_bed": + { "default_value": true }, - "machine_width": { + "machine_width": + { "default_value": 350 }, - "machine_height": { + "machine_height": + { "default_value": 250 }, - "machine_depth": { + "machine_depth": + { "default_value": 250 }, - "machine_center_is_zero": { + "machine_center_is_zero": + { "default_value": false }, - "machine_nozzle_size": { + "machine_nozzle_size": + { "default_value": 0.4 }, - "material_diameter": { - "default_value": 1.75 + "material_diameter": + { + "default_value": 1.75 }, - "gantry_height": { + "gantry_height": + { "default_value": 0 }, - "machine_gcode_flavor": { + "machine_gcode_flavor": + { "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_start_gcode": { + "machine_start_gcode": + { "default_value": "M280 P0 S160 ; release BLTouch alarm (OK to send for Non BLTouch)\nM420 Z2 ; set fade leveling at 2mm for BLTouch (OK to send for Non BLTouch)\nG28 ; home all\nG29 ; probe bed\nG92 E0 ;zero the extruded length\nG1 X0.0 Y50.0 Z10.0 F3600\n; perform wipe and prime\nG1 Z0.0 F1000\nG1 Z0.2 Y70.0 E9.0 F1000.0 ; prime\nG1 Y100.0 E12.5 F1000.0 ; prime\nG92 E0 ; zero extruder again\nM117 Printing..." }, - "machine_end_gcode": { + "machine_end_gcode": + { "default_value": "G92 E0 ; zero the extruded length again\nG1 E-1.5 F500 ; retract the filament to release some of the pressure\nM104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nG28 X0 ; home X axis\nG1 Y245 ; move Y axis to end position\nM84 ; disable motors\nM107 ; turn off fan" } } From 6225c12a9e06a1c218bae5d6d1240c18a6a16b46 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 16 Jan 2018 09:44:18 +0100 Subject: [PATCH 308/551] Fixed crash on complete message In some cases a job won't have an assigned printer when it's done. CL-716 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 6c0cc554e7..b5cbc33d51 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -248,7 +248,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): newly_finished_jobs = [job for job in finished_jobs if job not in self._finished_jobs and job.owner == username] for job in newly_finished_jobs: - job_completed_text = i18n_catalog.i18nc("@info:status", "Printer '{printer_name}' has finished printing '{job_name}'.".format(printer_name=job.assignedPrinter.name, job_name = job.name)) + if job.assignedPrinter: + job_completed_text = i18n_catalog.i18nc("@info:status", "Printer '{printer_name}' has finished printing '{job_name}'.".format(printer_name=job.assignedPrinter.name, job_name = job.name)) + else: + job_completed_text = i18n_catalog.i18nc("@info:status", "The print job '{job_name}' was finished.".format(job_name = job.name)) job_completed_message = Message(text=job_completed_text, title = i18n_catalog.i18nc("@info:status", "Print finished")) job_completed_message.show() From cd4b162b86d0d249d864986fa8894811486dbafd Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 16 Jan 2018 09:47:33 +0100 Subject: [PATCH 309/551] CURA-4461 Change sizes and theme colors for the separator --- resources/qml/SidebarHeader.qml | 4 ++-- resources/themes/cura-dark/theme.json | 1 + resources/themes/cura-light/theme.json | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 432f920b93..bc45d9ddac 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -323,8 +323,8 @@ Column anchors.horizontalCenter: parent.horizontalCenter visible: buildplateRow.visible width: parent.width - UM.Theme.getSize("sidebar_margin").width * 2 - height: visible ? UM.Theme.getSize("sidebar_lining").height / 2 : 0 - color: UM.Theme.getColor("sidebar_lining") + height: visible ? UM.Theme.getSize("sidebar_lining_thin").height / 2 : 0 + color: UM.Theme.getColor("sidebar_lining_thin") } //Buildplate row diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json index 9e99945d3d..80a5eec09c 100644 --- a/resources/themes/cura-dark/theme.json +++ b/resources/themes/cura-dark/theme.json @@ -43,6 +43,7 @@ "sidebar_header_text_hover": [255, 255, 255, 255], "sidebar_header_text_inactive": [255, 255, 255, 127], "sidebar_lining": [31, 36, 39, 255], + "sidebar_lining_thin": [255, 255, 255, 30], "button": [39, 44, 48, 255], "button_hover": [39, 44, 48, 255], diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 53bef1e7d9..51c96a5f82 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -91,6 +91,7 @@ "sidebar_header_text_active": [255, 255, 255, 255], "sidebar_header_text_hover": [255, 255, 255, 255], "sidebar_lining": [245, 245, 245, 255], + "sidebar_lining_thin": [127, 127, 127, 255], "button": [31, 36, 39, 255], "button_hover": [68, 72, 75, 255], From 71e4d424095f0dcd27367bdb52ccf0ae5214f154 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 16 Jan 2018 10:47:30 +0100 Subject: [PATCH 310/551] CURA-4795 set build plate of newly loaded 3mf files to active build plate --- plugins/3MFReader/ThreeMFReader.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 727bce2112..09ed1e126d 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -81,8 +81,10 @@ class ThreeMFReader(MeshReader): self._object_count += 1 node_name = "Object %s" % self._object_count + active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate + um_node = CuraSceneNode() - um_node.addDecorator(BuildPlateDecorator(0)) + um_node.addDecorator(BuildPlateDecorator(active_build_plate)) um_node.setName(node_name) transformation = self._createMatrixFromTransformationString(savitar_node.getTransformation()) um_node.setTransformation(transformation) From 063eb8e5cdc23399c1c23603cafe0f997b2d78a4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 16 Jan 2018 10:32:37 +0100 Subject: [PATCH 311/551] Don't give an error when reading normal 3MF files We have a signalling return value for this case. Let's use it. Contributes to issue CURA-4810. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 5c62c361c3..65896b3ec7 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -168,11 +168,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): Logger.log("w", "Unknown definition container type %s for %s", definition_container_type, each_definition_container_file) Job.yieldThread() - # sanity check + if machine_definition_container_count != 1: - msg = "Expecting one machine definition container but got %s" % machine_definition_container_count - Logger.log("e", msg) - raise RuntimeError(msg) + return WorkspaceReader.PreReadResult.failed #Not a workspace file but ordinary 3MF. material_labels = [] material_conflict = False From 1e892dc45c24fff0bae8a117c8507e8e828674a3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 16 Jan 2018 10:38:11 +0100 Subject: [PATCH 312/551] Remove unused variables Contributes to issue CURA-4810. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 65896b3ec7..77a7da8b6a 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -269,7 +269,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # 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) @@ -301,7 +300,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): break num_visible_settings = 0 - has_visible_settings_string = False try: temp_preferences = Preferences() serialized = archive.open("Cura/preferences.cfg").read().decode("utf-8") From 27c0ca4dea6205f8360c4e2253c0c1adb8755473 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 16 Jan 2018 10:39:08 +0100 Subject: [PATCH 313/551] Move some things outside of try-catch clause Only the pre-read should really be in there. Otherwise we'd hide some mistakes in our code. Contributes to issue CURA-4810. --- cura/CuraApplication.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 099c71c708..402917d748 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1518,12 +1518,11 @@ class CuraApplication(QtApplication): """ Checks if the given file URL is a valid project file. """ + file_path = QUrl(file_url).toLocalFile() + workspace_reader = self.getWorkspaceFileHandler().getReaderForFile(file_path) + if workspace_reader is None: + return False # non-project files won't get a reader try: - file_path = QUrl(file_url).toLocalFile() - workspace_reader = self.getWorkspaceFileHandler().getReaderForFile(file_path) - if workspace_reader is None: - return False # non-project files won't get a reader - result = workspace_reader.preRead(file_path, show_dialog=False) return result == WorkspaceReader.PreReadResult.accepted except Exception as e: From a0738c29770a4283fa7b1526cc2207e84e221de7 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 16 Jan 2018 11:49:45 +0100 Subject: [PATCH 314/551] CURA-4808 fix extruder setting change trigger slice. re-introduce extrudersAdded signal, probably needed because of timing issues (extruder added after loading global container). it's the inversion of 225b03e98ee1d92467176a1fd1ef3605ce0999c7 --- cura/Settings/ExtruderManager.py | 4 ++++ plugins/CuraEngineBackend/CuraEngineBackend.py | 1 + 2 files changed, 5 insertions(+) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 351843ae14..b5f9a35914 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -49,6 +49,9 @@ class ExtruderManager(QObject): ## Notify when the user switches the currently active extruder. activeExtruderChanged = pyqtSignal() + ## The signal notifies subscribers if extruders are added + extrudersAdded = pyqtSignal() + ## Gets the unique identifier of the currently active extruder stack. # # The currently active extruder stack is the stack that is currently being @@ -406,6 +409,7 @@ class ExtruderManager(QObject): if extruders_changed: self.extrudersChanged.emit(global_stack_id) + self.extrudersAdded.emit() self.setActiveExtruderIndex(0) ## Get all extruder values for a certain setting. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 97463e07da..9713211ad3 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -88,6 +88,7 @@ class CuraEngineBackend(QObject, Backend): # self._global_container_stack = None Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) + Application.getInstance().getExtruderManager().extrudersAdded.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() Application.getInstance().stacksValidationFinished.connect(self._onStackErrorCheckFinished) From abece3c415c792c424d499387070e0a10a6a77b5 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 16 Jan 2018 11:54:25 +0100 Subject: [PATCH 315/551] Add quality_type = not_supported to empty_quality_changes CURA-4807 --- cura/CuraApplication.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 402917d748..b453504f08 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -299,6 +299,7 @@ class CuraApplication(QtApplication): empty_quality_changes_container = copy.deepcopy(empty_container) empty_quality_changes_container.setMetaDataEntry("id", "empty_quality_changes") empty_quality_changes_container.addMetaDataEntry("type", "quality_changes") + empty_quality_changes_container.addMetaDataEntry("quality_type", "not_supported") ContainerRegistry.getInstance().addContainer(empty_quality_changes_container) with ContainerRegistry.getInstance().lockFile(): From 8a570c4b01981dfae96f7feeeeeed2a69f0d8728 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 16 Jan 2018 11:55:54 +0100 Subject: [PATCH 316/551] Show user profiles based on Not Supported CURA-4807 --- cura/Settings/QualityAndUserProfilesModel.py | 8 +++++++- cura/Settings/QualitySettingsModel.py | 2 +- cura/Settings/UserProfilesModel.py | 5 +++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index 8396e62417..645e63acdb 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -1,17 +1,21 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from UM.Application import Application +from UM.Settings.ContainerRegistry import ContainerRegistry from cura.QualityManager import QualityManager from cura.Settings.ProfilesModel import ProfilesModel from cura.Settings.ExtruderManager import ExtruderManager + ## QML Model for listing the current list of valid quality and quality changes profiles. # class QualityAndUserProfilesModel(ProfilesModel): def __init__(self, parent = None): super().__init__(parent) + self._empty_quality = ContainerRegistry.getInstance().findInstanceContainers(id = "empty_quality")[0] + ## Fetch the list of containers to display. # # See UM.Settings.Models.InstanceContainersModel._fetchInstanceContainers(). @@ -35,7 +39,9 @@ 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.getId():qc for qc in quality_changes_list if + # Also show custom profiles based on "Not Supported" quality profile + quality_type_set.add(self._empty_quality.getMetaDataEntry("quality_type")) + filtered_quality_changes = {qc.getId(): qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and qc.getMetaDataEntry("extruder") is not None and (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or diff --git a/cura/Settings/QualitySettingsModel.py b/cura/Settings/QualitySettingsModel.py index 0e17237ff7..fb1aa9a6b2 100644 --- a/cura/Settings/QualitySettingsModel.py +++ b/cura/Settings/QualitySettingsModel.py @@ -107,7 +107,7 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): else: quality_changes_container = containers[0] - if quality_changes_container.getMetaDataEntry("quality_type") == "not_supported": + if quality_changes_container.getMetaDataEntry("quality_type") == self._empty_quality.getMetaDataEntry("quality_type"): quality_container = self._empty_quality else: criteria = { diff --git a/cura/Settings/UserProfilesModel.py b/cura/Settings/UserProfilesModel.py index e093c6c132..6605f52f8a 100644 --- a/cura/Settings/UserProfilesModel.py +++ b/cura/Settings/UserProfilesModel.py @@ -2,6 +2,8 @@ # Cura is released under the terms of the LGPLv3 or higher. from UM.Application import Application +from UM.Settings.ContainerRegistry import ContainerRegistry + from cura.QualityManager import QualityManager from cura.Settings.ProfilesModel import ProfilesModel from cura.Settings.ExtruderManager import ExtruderManager @@ -22,6 +24,8 @@ class UserProfilesModel(ProfilesModel): for material in self.__current_materials: material.metaDataChanged.connect(self._onContainerChanged) + self._empty_quality = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] + ## Fetch the list of containers to display. # # See UM.Settings.Models.InstanceContainersModel._fetchInstanceContainers(). @@ -45,6 +49,7 @@ class UserProfilesModel(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]) + quality_type_set.add(self._empty_quality.getMetaDataEntry("quality_type")) filtered_quality_changes = {qc.getId():qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and From aa8057e80c609ded20c58a813f5df5d04b58a2a8 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 16 Jan 2018 11:57:39 +0100 Subject: [PATCH 317/551] Change style of Add/Remove printers link in Monitor tab --- plugins/UM3NetworkPrinting/ClusterMonitorItem.qml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml index df102915ff..86bdaae0a5 100644 --- a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml @@ -52,13 +52,19 @@ Component { id: addRemovePrintersLabel anchors.right: parent.right - text: "Add / remove printers" + text: catalog.i18nc("@label link to connect manager", "Add/Remove printers") + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + linkColor: UM.Theme.getColor("text_link") } MouseArea { anchors.fill: addRemovePrintersLabel + hoverEnabled: true onClicked: Cura.MachineManager.printerOutputDevices[0].openPrinterControlPanel() + onEntered: addRemovePrintersLabel.font.underline = true + onExited: addRemovePrintersLabel.font.underline = false } } From 0a4c30603faa66844edd777a65f1ae8148aa2097 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 16 Jan 2018 11:57:39 +0100 Subject: [PATCH 318/551] Change style of Add/Remove printers link in Monitor tab --- plugins/UM3NetworkPrinting/ClusterMonitorItem.qml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml index e78c7d1cc9..ef82ac7638 100644 --- a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml @@ -52,13 +52,19 @@ Component { id: addRemovePrintersLabel anchors.right: parent.right - text: "Add / remove printers" + text: catalog.i18nc("@label link to connect manager", "Add/Remove printers") + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + linkColor: UM.Theme.getColor("text_link") } MouseArea { anchors.fill: addRemovePrintersLabel + hoverEnabled: true onClicked: Cura.MachineManager.printerOutputDevices[0].openPrinterControlPanel() + onEntered: addRemovePrintersLabel.font.underline = true + onExited: addRemovePrintersLabel.font.underline = false } } From 51b49c89f4ddf6a1fca225ef1a527ff7ab381818 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 16 Jan 2018 12:43:56 +0100 Subject: [PATCH 319/551] Switch to LayerView after GCode has been fully loaded CURA-4805 --- cura/CuraApplication.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index b453504f08..f4f121eda8 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1461,11 +1461,7 @@ class CuraApplication(QtApplication): extension = os.path.splitext(filename)[1] if extension.lower() in self._non_sliceable_extensions: - self.getController().setActiveView("SimulationView") - view = self.getController().getActiveView() - view.resetLayerData() - view.setLayer(9999999) - view.calculateMaxLayers() + self.callLater(lambda: self.getController().setActiveView("SimulationView")) block_slicing_decorator = BlockSlicingDecorator() node.addDecorator(block_slicing_decorator) From f948203a63fc246abb7d6e3c62dac63616d4fecf Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 16 Jan 2018 13:43:28 +0100 Subject: [PATCH 320/551] Fix crash when clearing build plate We shouldn't delete the singleton PrintInformation object. We should rather just zero out the print information. And instead of doing that explicitly in deleteAll, listen to scene changes from PrintInformation in order to keep the logic related to the print information contained within its class. Contributes to issue CURA-4810. --- cura/CuraApplication.py | 3 --- cura/PrintInformation.py | 5 +++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index f4f121eda8..37952a42ac 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1061,9 +1061,6 @@ class CuraApplication(QtApplication): op.push() Selection.clear() - Logger.log("i", "Reseting print information") - self._print_information = PrintInformation.PrintInformation() - # stay on the same build plate #self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 838628e37c..5d5d59ed3b 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty @@ -65,6 +65,7 @@ class PrintInformation(QObject): self._backend = Application.getInstance().getBackend() if self._backend: self._backend.printDurationMessage.connect(self._onPrintDurationMessage) + Application.getInstance().getController().getScene().sceneChanged.connect(self.setToZeroPrintInformation) self._base_name = "" self._abbr_machine = "" @@ -171,7 +172,7 @@ class PrintInformation(QObject): def printTimes(self): return self._print_time_message_values[self._active_build_plate] - def _onPrintDurationMessage(self, build_plate_number, print_time, material_amounts): + def _onPrintDurationMessage(self, build_plate_number, print_time: Dict[str, int], material_amounts: list): self._updateTotalPrintTimePerFeature(build_plate_number, print_time) self.currentPrintTimeChanged.emit() From b0d2ef0f72e590054e0db36a246c778c30b2bed4 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 16 Jan 2018 13:48:12 +0100 Subject: [PATCH 321/551] Correct default material diameter value for single-extrusion machines CURA-4812 --- .../MachineSettingsAction.py | 5 ++++- resources/definitions/fdmextruder.def.json | 21 ------------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index a939d033fc..101ba54ed0 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -225,7 +225,10 @@ class MachineSettingsAction(MachineAction): material_approximate_diameter = str(round(material_diameter)) machine_diameter = extruder_stack.definitionChanges.getProperty("material_diameter", "value") if not machine_diameter: - machine_diameter = extruder_stack.definition.getProperty("material_diameter", "value") + if extruder_stack.definition.hasProperty("material_diameter", "value"): + machine_diameter = extruder_stack.definition.getProperty("material_diameter", "value") + else: + 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: diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json index 3a59e7df1e..2b314cd6a5 100644 --- a/resources/definitions/fdmextruder.def.json +++ b/resources/definitions/fdmextruder.def.json @@ -181,27 +181,6 @@ } } }, - "material": { - "label": "Material", - "icon": "category_material", - "description": "Material", - "type": "category", - "children": { - "material_diameter": { - "label": "Diameter", - "description": "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament.", - "unit": "mm", - "type": "float", - "default_value": 2.85, - "minimum_value": "0.0001", - "minimum_value_warning": "0.4", - "maximum_value_warning": "3.5", - "enabled": "machine_gcode_flavor != \"UltiGCode\"", - "settable_per_mesh": false, - "settable_per_extruder": true - } - } - }, "platform_adhesion": { "label": "Build Plate Adhesion", From 02b681a8f27f8fc2d1ab5109f80ceaffe132b45f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 16 Jan 2018 15:10:16 +0100 Subject: [PATCH 322/551] Fixes for slicing --- cura/Arranging/ArrangeObjectsJob.py | 2 ++ cura/CuraApplication.py | 12 ++++++------ cura/Scene/CuraSceneNode.py | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cura/Arranging/ArrangeObjectsJob.py b/cura/Arranging/ArrangeObjectsJob.py index f529543779..765c3333cb 100644 --- a/cura/Arranging/ArrangeObjectsJob.py +++ b/cura/Arranging/ArrangeObjectsJob.py @@ -88,3 +88,5 @@ class ArrangeObjectsJob(Job): no_full_solution_message = Message(i18n_catalog.i18nc("@info:status", "Unable to find a location within the build volume for all objects"), title = i18n_catalog.i18nc("@info:title", "Can't Find Location")) no_full_solution_message.show() + + self.finished.emit(self) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ff38a24cc6..99fc13265a 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -23,6 +23,7 @@ from UM.Settings.ContainerStack import ContainerStack from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.Validator import Validator from UM.Message import Message +from UM.Signal import Signal from UM.i18n import i18nCatalog from UM.Workspace.WorkspaceReader import WorkspaceReader from UM.Decorators import deprecated @@ -805,10 +806,13 @@ class CuraApplication(QtApplication): # \param engine The QML engine. def registerObjects(self, engine): super().registerObjects(engine) + engine.rootContext().setContextProperty("Printer", self) engine.rootContext().setContextProperty("CuraApplication", self) + self._print_information = PrintInformation.PrintInformation() engine.rootContext().setContextProperty("PrintInformation", self._print_information) + self._cura_actions = CuraActions.CuraActions(self) engine.rootContext().setContextProperty("CuraActions", self._cura_actions) @@ -1369,10 +1373,6 @@ class CuraApplication(QtApplication): else: Logger.log("w", "Could not find a mesh in reloaded node.") - ## Import a file from disk - def openFile(self, filename): - self._openFile(filename) - def _openFile(self, filename): self.readLocalFile(QUrl.fromLocalFile(filename)) @@ -1521,8 +1521,8 @@ class CuraApplication(QtApplication): # Step is for skipping tests to make it a lot faster. it also makes the outcome somewhat rougher node, _ = arranger.findNodePlacement(node, offset_shape_arr, hull_shape_arr, step = 10) - # This node is deepcopied from some other node which already has a BuildPlateDecorator, but the deepcopy - # of BuildPlateDecorator produces one that's assoicated with build plate -1. So, here we need to check if + # This node is deep copied from some other node which already has a BuildPlateDecorator, but the deepcopy + # of BuildPlateDecorator produces one that's associated with build plate -1. So, here we need to check if # the BuildPlateDecorator exists or not and always set the correct build plate number. build_plate_decorator = node.getDecorator(BuildPlateDecorator) if build_plate_decorator is None: diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py index 9df2931f0b..1bffe4392b 100644 --- a/cura/Scene/CuraSceneNode.py +++ b/cura/Scene/CuraSceneNode.py @@ -9,7 +9,7 @@ from copy import deepcopy class CuraSceneNode(SceneNode): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self._outside_buildarea = True + self._outside_buildarea = False def setOutsideBuildArea(self, new_value): self._outside_buildarea = new_value From cbd6a996fad8ff6e0526d95cae62db50dc02b61f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 16 Jan 2018 15:10:46 +0100 Subject: [PATCH 323/551] Remove unused Signal import --- cura/CuraApplication.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 99fc13265a..b21a5bcf26 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -23,7 +23,6 @@ from UM.Settings.ContainerStack import ContainerStack from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.Validator import Validator from UM.Message import Message -from UM.Signal import Signal from UM.i18n import i18nCatalog from UM.Workspace.WorkspaceReader import WorkspaceReader from UM.Decorators import deprecated From 54698ada7f6563d3b0c5b22b1d80e604e8848212 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 16 Jan 2018 15:36:57 +0100 Subject: [PATCH 324/551] CURA-4807 fix not choosing 'not supported' if there are valid options after changing variant; partly undoing 4abbd4b9887fc3e3d98ebf06481d2b21a9e9be0e --- cura/QualityManager.py | 3 --- cura/Settings/ProfilesModel.py | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index d984bd17a1..76a0c86a5f 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -136,9 +136,6 @@ class QualityManager: if basic_materials: result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) - empty_quality = ContainerRegistry.getInstance().findInstanceContainers(id = "empty_quality")[0] - result.append(empty_quality) - return result ## Find all quality changes for a machine. diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 15b123d12f..77cd407457 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -87,7 +87,7 @@ class ProfilesModel(InstanceContainersModel): if quality.getMetaDataEntry("quality_type") not in quality_type_set: result.append(quality) - if len(result) > 1: + if len(result) > 1 and self._empty_quality in result: result.remove(self._empty_quality) return {item.getId(): item for item in result}, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. From cffeff0299b4593c403b8640a21037ed6575ad20 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 16 Jan 2018 15:58:14 +0100 Subject: [PATCH 325/551] CURA-4805 remove modifiable settings when loading non sliceable file (gcode) --- resources/qml/Sidebar.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index e1c0a07f89..d12515c004 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -96,7 +96,7 @@ Rectangle SidebarHeader { id: header width: parent.width - visible: (machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariants) && !monitoringPrint + visible: !hideSettings && (machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariants) && !monitoringPrint anchors.top: machineSelection.bottom onShowTooltip: base.showTooltip(item, location, text) @@ -128,7 +128,7 @@ Rectangle text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox", "Print Setup disabled\nG-code files cannot be modified") anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width - anchors.top: headerSeparator.bottom + anchors.top: hideSettings ? machineSelection.bottom : headerSeparator.bottom anchors.topMargin: UM.Theme.getSize("sidebar_margin").height width: Math.floor(parent.width * 0.45) font: UM.Theme.getFont("large") From ba1f915633a0ac455cd36981d9f710d3966ee9fa Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Tue, 16 Jan 2018 16:30:10 +0100 Subject: [PATCH 326/551] Fix for CURA-4789 `deleteAll()` within `CuraApplication.py` now resets the print information by calling its `setToZeroPrintInformation()` method, rather than by reinstatiating the `PrintInformation` class. --- cura/CuraApplication.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 37952a42ac..3c5eca2f21 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1061,6 +1061,9 @@ class CuraApplication(QtApplication): op.push() Selection.clear() + # Reset the print information: + self._print_information.setToZeroPrintInformation(self.getBuildPlateModel().activeBuildPlate) + # stay on the same build plate #self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate From fad43be23b80aa82628722a9ad1e2dbecb4e132a Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Tue, 16 Jan 2018 17:03:52 +0100 Subject: [PATCH 327/551] Fixes CURA-4789 Emits `sceneChanged` which `PrintInformation` listens for and then resets with. Same result re: print time, but also will update anythign else which is listening for `sceneChanged`. --- cura/CuraApplication.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 3c5eca2f21..0ac50c9e5e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1062,7 +1062,8 @@ class CuraApplication(QtApplication): Selection.clear() # Reset the print information: - self._print_information.setToZeroPrintInformation(self.getBuildPlateModel().activeBuildPlate) + self.getController().getScene().sceneChanged.emit(node) + # self._print_information.setToZeroPrintInformation(self.getBuildPlateModel().activeBuildPlate) # stay on the same build plate #self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate From 4bc488ca790f688b76de874656a22e93c07f0a15 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 17 Jan 2018 10:50:48 +0100 Subject: [PATCH 328/551] Change wording to "Aluminium" CURA-4461 --- 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 a24d21b1ad..c7f80666ff 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -163,7 +163,7 @@ "options": { "glass": "Glass", - "aluminum": "Aluminum" + "aluminium": "Aluminium" }, "settable_per_mesh": false, "settable_per_extruder": false, From 746fd3ddcbe91385fdc595b1576649d6d288e6d1 Mon Sep 17 00:00:00 2001 From: Brecht Nuyttens Date: Wed, 17 Jan 2018 10:54:04 +0100 Subject: [PATCH 329/551] Updated definition and added qualities Updated the definition and added qualities for the 4 filaments. --- .../definitions/vertex_delta_k8800.def.json | 104 +++++++++++++++++- .../k8800_ABS_Extreme_Quality.inst.cfg | 22 ++++ .../k8800_ABS_High_Quality.inst.cfg | 22 ++++ .../k8800_ABS_Normal_Quality.inst.cfg | 22 ++++ .../k8800_PET_Extreme_Quality.inst.cfg | 22 ++++ .../k8800_PET_High_Quality.inst.cfg | 22 ++++ .../k8800_PET_Normal_Quality.inst.cfg | 22 ++++ .../k8800_PLA_Extreme_Quality.inst.cfg | 22 ++++ .../k8800_PLA_High_Quality.inst.cfg | 22 ++++ .../k8800_PLA_Normal_Quality.inst.cfg | 22 ++++ .../k8800_TPU_Extreme_Quality.inst.cfg | 22 ++++ .../k8800_TPU_High_Quality.inst.cfg | 22 ++++ .../k8800_TPU_Normal_Quality.inst.cfg | 22 ++++ 13 files changed, 364 insertions(+), 4 deletions(-) create mode 100644 resources/quality/vertex_delta_k8800/k8800_ABS_Extreme_Quality.inst.cfg create mode 100644 resources/quality/vertex_delta_k8800/k8800_ABS_High_Quality.inst.cfg create mode 100644 resources/quality/vertex_delta_k8800/k8800_ABS_Normal_Quality.inst.cfg create mode 100644 resources/quality/vertex_delta_k8800/k8800_PET_Extreme_Quality.inst.cfg create mode 100644 resources/quality/vertex_delta_k8800/k8800_PET_High_Quality.inst.cfg create mode 100644 resources/quality/vertex_delta_k8800/k8800_PET_Normal_Quality.inst.cfg create mode 100644 resources/quality/vertex_delta_k8800/k8800_PLA_Extreme_Quality.inst.cfg create mode 100644 resources/quality/vertex_delta_k8800/k8800_PLA_High_Quality.inst.cfg create mode 100644 resources/quality/vertex_delta_k8800/k8800_PLA_Normal_Quality.inst.cfg create mode 100644 resources/quality/vertex_delta_k8800/k8800_TPU_Extreme_Quality.inst.cfg create mode 100644 resources/quality/vertex_delta_k8800/k8800_TPU_High_Quality.inst.cfg create mode 100644 resources/quality/vertex_delta_k8800/k8800_TPU_Normal_Quality.inst.cfg diff --git a/resources/definitions/vertex_delta_k8800.def.json b/resources/definitions/vertex_delta_k8800.def.json index ee7b4e5089..c6ea7db628 100644 --- a/resources/definitions/vertex_delta_k8800.def.json +++ b/resources/definitions/vertex_delta_k8800.def.json @@ -1,4 +1,5 @@ { + "id": "K8800", "name": "Vertex Delta K8800", "version": 2, "inherits": "fdmprinter", @@ -6,9 +7,14 @@ "manufacturer": "Velleman nv", "file_formats": "text/x-gcode", "visible": true, - "author": "Velleman" + "author": "Velleman", + "has_machine_quality": true, + "has_materials": true }, "overrides": { + "material_diameter": { + "default_value": 1.75 + }, "machine_width": { "default_value": 200 }, @@ -42,9 +48,6 @@ "gantry_height": { "default_value": 0 }, - "material_diameter": { - "default_value": 1.75 - }, "machine_nozzle_offset_x_1": { "default_value": 0 }, @@ -59,6 +62,99 @@ }, "machine_end_gcode": { "default_value": "; Vertex Delta end code\nM107 ; Turn off fan\nG91 ; Relative positioning\nT0\nG1 E-1 F1500; Reduce filament pressure\nM104 T0 S0\nG90 ; Absolute positioning\nG92 E0 ; Reset extruder position\nM300 S4000 P500\nM300 S3000 P500\nM300 S2000 P800\nG28\nM84 ; Turn steppers off" + }, + "line_width": { + "value": 0.35 + }, + "infill_line_width": { + "value": 0.35 + }, + "wall_thickness": { + "value": 0.7 + }, + "top_bottom_thickness": { + "value": 0.6 + }, + "infill_sparse_density": { + "value": 40 + }, + "infill_overlap": { + "value": 5 + }, + "min_infill_area": { + "value": 0.1 + }, + "retract_at_layer_change": { + "value": true + }, + "retraction_min_travel": { + "value": 1 + }, + "retraction_count_max": { + "value": 15 + }, + "retraction_extrusion_window": { + "value": 1 + }, + "speed_print": { + "value": 35 + }, + "speed_infill": { + "value": 40 + }, + "speed_wall": { + "value": 35 + }, + "speed_wall_x": { + "value": 35 + }, + "speed_topbottom": { + "value": 35 + }, + "speed_travel": { + "value": 190 + }, + "speed_layer_0": { + "value": 20 + }, + "speed_print_layer_0": { + "value": 20 + }, + "skirt_brim_speed": { + "value": 20 + }, + "travel_retract_before_outer_wall": { + "value": true + }, + "retraction_hop_enabled": { + "value": true + }, + "retraction_hop": { + "value": 0.1 + }, + "cool_fan_full_at_height": { + "value": 2 + }, + "cool_fan_full_layer": { + "value": 11 + }, + "cool_min_layer_time": { + "value": 8 + }, + "support_z_distance": { + "value": 0.4 + }, + "support_xy_distance": { + "value": 1 + }, + "brim_width": { + "value": 6 + }, + "skirt_line_count": { + "value": 2 + }, + "skirt_brim_minimal_length": { + "value": 50 } } } \ No newline at end of file diff --git a/resources/quality/vertex_delta_k8800/k8800_ABS_Extreme_Quality.inst.cfg b/resources/quality/vertex_delta_k8800/k8800_ABS_Extreme_Quality.inst.cfg new file mode 100644 index 0000000000..2c42bd82b6 --- /dev/null +++ b/resources/quality/vertex_delta_k8800/k8800_ABS_Extreme_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = Extreme +definition = vertex_delta_k8800 + +[metadata] +type = quality +quality_type = extreme +material = Vertex_Delta_ABS +weight = 2 +setting_version = 4 + +[values] +layer_height = 0.05 +layer_height_0 = 0.2 + +material_final_print_temperature = 250 +material_initial_print_temperature = 250 +material_print_temperature = 250 +retraction_amount = 3 +material_standby_temperature = 225 +cool_fan_speed = 0 \ No newline at end of file diff --git a/resources/quality/vertex_delta_k8800/k8800_ABS_High_Quality.inst.cfg b/resources/quality/vertex_delta_k8800/k8800_ABS_High_Quality.inst.cfg new file mode 100644 index 0000000000..a770131adb --- /dev/null +++ b/resources/quality/vertex_delta_k8800/k8800_ABS_High_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = High +definition = vertex_delta_k8800 + +[metadata] +type = quality +quality_type = high +material = Vertex_Delta_ABS +weight = 1 +setting_version = 4 + +[values] +layer_height = 0.1 +layer_height_0 = 0.2 + +material_final_print_temperature = 250 +material_initial_print_temperature = 250 +material_print_temperature = 250 +retraction_amount = 3 +material_standby_temperature = 225 +cool_fan_speed = 0 \ No newline at end of file diff --git a/resources/quality/vertex_delta_k8800/k8800_ABS_Normal_Quality.inst.cfg b/resources/quality/vertex_delta_k8800/k8800_ABS_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..7c7e635149 --- /dev/null +++ b/resources/quality/vertex_delta_k8800/k8800_ABS_Normal_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = Normal +definition = vertex_delta_k8800 + +[metadata] +type = quality +quality_type = normal +material = Vertex_Delta_ABS +weight = 0 +setting_version = 4 + +[values] +layer_height = 0.2 +layer_height_0 = 0.2 + +material_final_print_temperature = 250 +material_initial_print_temperature = 250 +material_print_temperature = 250 +retraction_amount = 3 +material_standby_temperature = 225 +cool_fan_speed = 00 \ No newline at end of file diff --git a/resources/quality/vertex_delta_k8800/k8800_PET_Extreme_Quality.inst.cfg b/resources/quality/vertex_delta_k8800/k8800_PET_Extreme_Quality.inst.cfg new file mode 100644 index 0000000000..836d900247 --- /dev/null +++ b/resources/quality/vertex_delta_k8800/k8800_PET_Extreme_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = Extreme +definition = vertex_delta_k8800 + +[metadata] +type = quality +quality_type = extreme +material = Vertex_Delta_PET +weight = 2 +setting_version = 4 + +[values] +layer_height = 0.05 +layer_height_0 = 0.2 + +material_final_print_temperature = 240 +material_initial_print_temperature = 240 +material_print_temperature = 240 +retraction_amount = 3 +material_standby_temperature = 215 +cool_fan_speed = 10 \ No newline at end of file diff --git a/resources/quality/vertex_delta_k8800/k8800_PET_High_Quality.inst.cfg b/resources/quality/vertex_delta_k8800/k8800_PET_High_Quality.inst.cfg new file mode 100644 index 0000000000..b0cae312b2 --- /dev/null +++ b/resources/quality/vertex_delta_k8800/k8800_PET_High_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = High +definition = vertex_delta_k8800 + +[metadata] +type = quality +quality_type = high +material = Vertex_Delta_PET +weight = 1 +setting_version = 4 + +[values] +layer_height = 0.1 +layer_height_0 = 0.2 + +material_final_print_temperature = 240 +material_initial_print_temperature = 240 +material_print_temperature = 240 +retraction_amount = 3 +material_standby_temperature = 215 +cool_fan_speed = 10 \ No newline at end of file diff --git a/resources/quality/vertex_delta_k8800/k8800_PET_Normal_Quality.inst.cfg b/resources/quality/vertex_delta_k8800/k8800_PET_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..ebec26d04a --- /dev/null +++ b/resources/quality/vertex_delta_k8800/k8800_PET_Normal_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = Normal +definition = vertex_delta_k8800 + +[metadata] +type = quality +quality_type = normal +material = Vertex_Delta_PET +weight = 0 +setting_version = 4 + +[values] +layer_height = 0.2 +layer_height_0 = 0.2 + +material_final_print_temperature = 240 +material_initial_print_temperature = 240 +material_print_temperature = 240 +retraction_amount = 3 +material_standby_temperature = 215 +cool_fan_speed = 10 \ No newline at end of file diff --git a/resources/quality/vertex_delta_k8800/k8800_PLA_Extreme_Quality.inst.cfg b/resources/quality/vertex_delta_k8800/k8800_PLA_Extreme_Quality.inst.cfg new file mode 100644 index 0000000000..13ad6455c9 --- /dev/null +++ b/resources/quality/vertex_delta_k8800/k8800_PLA_Extreme_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = Extreme +definition = vertex_delta_k8800 + +[metadata] +type = quality +quality_type = extreme +material = Vertex_Delta_PLA +weight = 2 +setting_version = 4 + +[values] +layer_height = 0.05 +layer_height_0 = 0.2 + +material_final_print_temperature = 200 +material_initial_print_temperature = 200 +material_print_temperature = 200 +retraction_amount = 3 +material_standby_temperature = 175 +cool_fan_speed = 40 \ No newline at end of file diff --git a/resources/quality/vertex_delta_k8800/k8800_PLA_High_Quality.inst.cfg b/resources/quality/vertex_delta_k8800/k8800_PLA_High_Quality.inst.cfg new file mode 100644 index 0000000000..e8c7e893cb --- /dev/null +++ b/resources/quality/vertex_delta_k8800/k8800_PLA_High_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = High +definition = vertex_delta_k8800 + +[metadata] +type = quality +quality_type = high +material = Vertex_Delta_PLA +weight = 1 +setting_version = 4 + +[values] +layer_height = 0.1 +layer_height_0 = 0.2 + +material_final_print_temperature = 200 +material_initial_print_temperature = 200 +material_print_temperature = 200 +retraction_amount = 3 +material_standby_temperature = 175 +cool_fan_speed = 40 \ No newline at end of file diff --git a/resources/quality/vertex_delta_k8800/k8800_PLA_Normal_Quality.inst.cfg b/resources/quality/vertex_delta_k8800/k8800_PLA_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..27002caea2 --- /dev/null +++ b/resources/quality/vertex_delta_k8800/k8800_PLA_Normal_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = Normal +definition = vertex_delta_k8800 + +[metadata] +type = quality +quality_type = normal +material = Vertex_Delta_PLA +weight = 0 +setting_version = 4 + +[values] +layer_height = 0.2 +layer_height_0 = 0.2 + +material_final_print_temperature = 200 +material_initial_print_temperature = 200 +material_print_temperature = 200 +retraction_amount = 3 +material_standby_temperature = 175 +cool_fan_speed = 40 \ No newline at end of file diff --git a/resources/quality/vertex_delta_k8800/k8800_TPU_Extreme_Quality.inst.cfg b/resources/quality/vertex_delta_k8800/k8800_TPU_Extreme_Quality.inst.cfg new file mode 100644 index 0000000000..8a0a01fb0b --- /dev/null +++ b/resources/quality/vertex_delta_k8800/k8800_TPU_Extreme_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = Extreme +definition = vertex_delta_k8800 + +[metadata] +type = quality +quality_type = extreme +material = Vertex_Delta_TPU +weight = 2 +setting_version = 4 + +[values] +layer_height = 0.05 +layer_height_0 = 0.2 + +material_final_print_temperature = 220 +material_initial_print_temperature = 220 +material_print_temperature = 220 +retraction_amount = 3 +material_standby_temperature = 195 +cool_fan_speed = 20 \ No newline at end of file diff --git a/resources/quality/vertex_delta_k8800/k8800_TPU_High_Quality.inst.cfg b/resources/quality/vertex_delta_k8800/k8800_TPU_High_Quality.inst.cfg new file mode 100644 index 0000000000..7e23947f39 --- /dev/null +++ b/resources/quality/vertex_delta_k8800/k8800_TPU_High_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = High +definition = vertex_delta_k8800 + +[metadata] +type = quality +quality_type = high +material = Vertex_Delta_TPU +weight = 1 +setting_version = 4 + +[values] +layer_height = 0.1 +layer_height_0 = 0.2 + +material_final_print_temperature = 220 +material_initial_print_temperature = 220 +material_print_temperature = 220 +retraction_amount = 3 +material_standby_temperature = 195 +cool_fan_speed = 20 \ No newline at end of file diff --git a/resources/quality/vertex_delta_k8800/k8800_TPU_Normal_Quality.inst.cfg b/resources/quality/vertex_delta_k8800/k8800_TPU_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..5fb46e1ea6 --- /dev/null +++ b/resources/quality/vertex_delta_k8800/k8800_TPU_Normal_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = Normal +definition = vertex_delta_k8800 + +[metadata] +type = quality +quality_type = normal +material = Vertex_Delta_TPU +weight = 0 +setting_version = 4 + +[values] +layer_height = 0.2 +layer_height_0 = 0.2 + +material_final_print_temperature = 220 +material_initial_print_temperature = 220 +material_print_temperature = 220 +retraction_amount = 3 +material_standby_temperature = 195 +cool_fan_speed = 20 From 26371c9c3a58578c7f1b5bf4ac91a5311812d1b8 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 17 Jan 2018 10:57:11 +0100 Subject: [PATCH 330/551] CURA-4815 When creating the unique name for a machine, don't look at the definition instance container for the id, just look at the container stack ids. --- 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 9202e57285..b945ec0609 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -94,7 +94,7 @@ class CuraContainerRegistry(ContainerRegistry): def _containerExists(self, container_type, container_name): container_class = ContainerStack if container_type == "machine" else InstanceContainer - return self.findContainersMetadata(id = container_name, type = container_type, ignore_case = True) or \ + return self.findContainersMetadata(container_type = container_class, id = container_name, type = container_type, ignore_case = True) or \ self.findContainersMetadata(container_type = container_class, name = container_name, type = container_type) ## Exports an profile to a file From 4680996a491f47d42b5fa790a68a0f282d22db2d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 17 Jan 2018 11:32:43 +0100 Subject: [PATCH 331/551] Print window no longer gets an ever increasing list of print targets CL-720 --- plugins/UM3NetworkPrinting/PrintWindow.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/UM3NetworkPrinting/PrintWindow.qml b/plugins/UM3NetworkPrinting/PrintWindow.qml index 13d087f930..d84b0f30ec 100644 --- a/plugins/UM3NetworkPrinting/PrintWindow.qml +++ b/plugins/UM3NetworkPrinting/PrintWindow.qml @@ -31,6 +31,7 @@ UM.Dialog property var printersModel: ListModel{} function resetPrintersModel() { + printersModel.clear() printersModel.append({ name: "Automatic", key: ""}) for (var index in OutputDevice.printers) From 8dd21892d33277bec88895393f992b612b7af526 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 17 Jan 2018 11:34:25 +0100 Subject: [PATCH 332/551] Avoid zero thickness to be shown in layer view. Also fix some typos. --- plugins/SimulationView/SimulationView.py | 4 ++-- plugins/SimulationView/SimulationViewProxy.py | 4 ++-- plugins/SimulationView/__init__.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index f667aff998..9249cd4a54 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import sys @@ -344,7 +344,7 @@ class SimulationView(View): self._max_feedrate = max(float(p.lineFeedrates.max()), self._max_feedrate) self._min_feedrate = min(float(p.lineFeedrates.min()), self._min_feedrate) self._max_thickness = max(float(p.lineThicknesses.max()), self._max_thickness) - self._min_thickness = min(float(p.lineThicknesses.min()), self._min_thickness) + self._min_thickness = min(float(p.lineThicknesses[numpy.nonzero(p.lineThicknesses)].min()), self._min_thickness) if max_layer_number < layer_id: max_layer_number = layer_id if min_layer_number > layer_id: diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py index e144b841e6..a84b151983 100644 --- a/plugins/SimulationView/SimulationViewProxy.py +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty @@ -117,7 +117,7 @@ class SimulationViewProxy(QObject): def setSimulationViewType(self, layer_view_type): active_view = self._controller.getActiveView() if isinstance(active_view, SimulationView.SimulationView.SimulationView): - active_view.setSimulationViewisinstance(layer_view_type) + active_view.setSimulationViewType(layer_view_type) @pyqtSlot(result=int) def getSimulationViewType(self): diff --git a/plugins/SimulationView/__init__.py b/plugins/SimulationView/__init__.py index 15e113bd8e..360fdc1de9 100644 --- a/plugins/SimulationView/__init__.py +++ b/plugins/SimulationView/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtQml import qmlRegisterSingletonType @@ -18,7 +18,7 @@ def getMetaData(): } def createSimulationViewProxy(engine, script_engine): - return SimulationViewProxy.SimulatorViewProxy() + return SimulationViewProxy.SimulationViewProxy() def register(app): simulation_view = SimulationView.SimulationView() From cc89ddf5f76433f2a9b363018cfe43f6e910034c Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 17 Jan 2018 11:39:38 +0100 Subject: [PATCH 333/551] Revert "Avoid zero thickness to be shown in layer view." I saw that with these changes, Cura crashes when loading a GCode. This reverts commit 8dd21892d33277bec88895393f992b612b7af526. --- plugins/SimulationView/SimulationView.py | 4 ++-- plugins/SimulationView/SimulationViewProxy.py | 4 ++-- plugins/SimulationView/__init__.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 9249cd4a54..f667aff998 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import sys @@ -344,7 +344,7 @@ class SimulationView(View): self._max_feedrate = max(float(p.lineFeedrates.max()), self._max_feedrate) self._min_feedrate = min(float(p.lineFeedrates.min()), self._min_feedrate) self._max_thickness = max(float(p.lineThicknesses.max()), self._max_thickness) - self._min_thickness = min(float(p.lineThicknesses[numpy.nonzero(p.lineThicknesses)].min()), self._min_thickness) + self._min_thickness = min(float(p.lineThicknesses.min()), self._min_thickness) if max_layer_number < layer_id: max_layer_number = layer_id if min_layer_number > layer_id: diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py index a84b151983..e144b841e6 100644 --- a/plugins/SimulationView/SimulationViewProxy.py +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty @@ -117,7 +117,7 @@ class SimulationViewProxy(QObject): def setSimulationViewType(self, layer_view_type): active_view = self._controller.getActiveView() if isinstance(active_view, SimulationView.SimulationView.SimulationView): - active_view.setSimulationViewType(layer_view_type) + active_view.setSimulationViewisinstance(layer_view_type) @pyqtSlot(result=int) def getSimulationViewType(self): diff --git a/plugins/SimulationView/__init__.py b/plugins/SimulationView/__init__.py index 360fdc1de9..15e113bd8e 100644 --- a/plugins/SimulationView/__init__.py +++ b/plugins/SimulationView/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtQml import qmlRegisterSingletonType @@ -18,7 +18,7 @@ def getMetaData(): } def createSimulationViewProxy(engine, script_engine): - return SimulationViewProxy.SimulationViewProxy() + return SimulationViewProxy.SimulatorViewProxy() def register(app): simulation_view = SimulationView.SimulationView() From e6169a7c618ecfd0aa3fc3360a3cd6e9e26b6bfb Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 17 Jan 2018 11:53:31 +0100 Subject: [PATCH 334/551] Fix some typos --- plugins/SimulationView/SimulationViewProxy.py | 4 ++-- plugins/SimulationView/__init__.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py index e144b841e6..a84b151983 100644 --- a/plugins/SimulationView/SimulationViewProxy.py +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty @@ -117,7 +117,7 @@ class SimulationViewProxy(QObject): def setSimulationViewType(self, layer_view_type): active_view = self._controller.getActiveView() if isinstance(active_view, SimulationView.SimulationView.SimulationView): - active_view.setSimulationViewisinstance(layer_view_type) + active_view.setSimulationViewType(layer_view_type) @pyqtSlot(result=int) def getSimulationViewType(self): diff --git a/plugins/SimulationView/__init__.py b/plugins/SimulationView/__init__.py index 15e113bd8e..360fdc1de9 100644 --- a/plugins/SimulationView/__init__.py +++ b/plugins/SimulationView/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtQml import qmlRegisterSingletonType @@ -18,7 +18,7 @@ def getMetaData(): } def createSimulationViewProxy(engine, script_engine): - return SimulationViewProxy.SimulatorViewProxy() + return SimulationViewProxy.SimulationViewProxy() def register(app): simulation_view = SimulationView.SimulationView() From 5c0e2d39a366d2daf78262f16826c27bf853a406 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 17 Jan 2018 11:54:22 +0100 Subject: [PATCH 335/551] Avoid zero thickness to be shown in layer view. --- plugins/SimulationView/SimulationView.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index f667aff998..dfecda06bb 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import sys @@ -344,7 +344,12 @@ class SimulationView(View): self._max_feedrate = max(float(p.lineFeedrates.max()), self._max_feedrate) self._min_feedrate = min(float(p.lineFeedrates.min()), self._min_feedrate) self._max_thickness = max(float(p.lineThicknesses.max()), self._max_thickness) - self._min_thickness = min(float(p.lineThicknesses.min()), self._min_thickness) + try: + self._min_thickness = min(float(p.lineThicknesses[numpy.nonzero(p.lineThicknesses)].min()), self._min_thickness) + except: + # Sometimes, when importing a GCode the line thicknesses are zero and so the minimum (avoiding + # the zero) can't be calculated + Logger.log("i", "Min thickness can't be calculated because all the values are zero") if max_layer_number < layer_id: max_layer_number = layer_id if min_layer_number > layer_id: From 8a53549bce61ec6df04297574ee21a09c3983d6d Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 17 Jan 2018 17:01:03 +0100 Subject: [PATCH 336/551] CURA-4033 split update bounds for a single node in buildvolume and also call it from readMeshFinished --- cura/BuildVolume.py | 68 +++++++++++++++++++++++-------------- cura/CuraApplication.py | 1 + cura/Scene/CuraSceneNode.py | 1 + 3 files changed, 44 insertions(+), 26 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 2567641cc9..7a495b2064 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1,6 +1,7 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from cura.Scene.CuraSceneNode import CuraSceneNode from cura.Settings.ExtruderManager import ExtruderManager from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog @@ -25,7 +26,7 @@ catalog = i18nCatalog("cura") import numpy import math -from typing import List +from typing import List, Optional # Setting for clearance around the prime PRIME_CLEARANCE = 6.5 @@ -194,8 +195,7 @@ class BuildVolume(SceneNode): return True - ## For every sliceable node, update node._outside_buildarea - # + ## For every sliceable node, update outsideBuildArea def updateNodeBoundaryCheck(self): root = Application.getInstance().getController().getScene().getRoot() nodes = list(BreadthFirstIterator(root)) @@ -212,35 +212,51 @@ class BuildVolume(SceneNode): for node in nodes: # Need to check group nodes later - if node.callDecoration("isGroup"): - group_nodes.append(node) # Keep list of affected group_nodes - - if node.callDecoration("isSliceable") or node.callDecoration("isGroup"): - node._outside_buildarea = False - bbox = node.getBoundingBox() - - # Mark the node as outside the build volume if the bounding box test fails. - if build_volume_bounding_box.intersectsBox(bbox) != AxisAlignedBox.IntersectionResult.FullIntersection: - node._outside_buildarea = True - continue - - convex_hull = node.callDecoration("getConvexHull") - if convex_hull: - if not convex_hull.isValid(): - return - # Check for collisions between disallowed areas and the object - for area in self.getDisallowedAreas(): - overlap = convex_hull.intersectsPolygon(area) - if overlap is None: - continue - node._outside_buildarea = True - continue + self.checkBoundsAndUpdate(node, bounds = build_volume_bounding_box) # Group nodes should override the _outside_buildarea property of their children. for group_node in group_nodes: for child_node in group_node.getAllChildren(): child_node._outside_buildarea = group_node._outside_buildarea + ## Update the outsideBuildArea of a single node, given bounds or current build volume + def checkBoundsAndUpdate(self, node: CuraSceneNode, bounds: Optional[AxisAlignedBox] = None): + if not isinstance(node, CuraSceneNode): + return + + if bounds is None: + build_volume_bounding_box = self.getBoundingBox() + if build_volume_bounding_box: + # It's over 9000! + build_volume_bounding_box = build_volume_bounding_box.set(bottom=-9001) + else: + # No bounding box. This is triggered when running Cura from command line with a model for the first time + # In that situation there is a model, but no machine (and therefore no build volume. + return + else: + build_volume_bounding_box = bounds + + if node.callDecoration("isSliceable") or node.callDecoration("isGroup"): + bbox = node.getBoundingBox() + + # Mark the node as outside the build volume if the bounding box test fails. + if build_volume_bounding_box.intersectsBox(bbox) != AxisAlignedBox.IntersectionResult.FullIntersection: + node.setOutsideBuildArea(True) + return + + convex_hull = self.callDecoration("getConvexHull") + if convex_hull: + if not convex_hull.isValid(): + return + # Check for collisions between disallowed areas and the object + for area in self.getDisallowedAreas(): + overlap = convex_hull.intersectsPolygon(area) + if overlap is None: + continue + node.setOutsideBuildArea(True) + return + node.setOutsideBuildArea(False) + ## Recalculates the build volume & disallowed areas. def rebuild(self): if not self._width or not self._height or not self._depth: diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ff38a24cc6..0b10ce8735 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1481,6 +1481,7 @@ class CuraApplication(QtApplication): node.setSelectable(True) node.setName(os.path.basename(filename)) + self.getBuildVolume().checkBoundsAndUpdate(node) extension = os.path.splitext(filename)[1] if extension.lower() in self._non_sliceable_extensions: diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py index 9df2931f0b..c5dcffd2c2 100644 --- a/cura/Scene/CuraSceneNode.py +++ b/cura/Scene/CuraSceneNode.py @@ -1,5 +1,6 @@ from UM.Application import Application from UM.Logger import Logger +from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Scene.SceneNode import SceneNode from copy import deepcopy From 013f020a4a9c807f26431b2e54cac445f6126e99 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Wed, 17 Jan 2018 17:02:02 +0100 Subject: [PATCH 337/551] Initial styling changes - Dual-button layout - Blue buttons in line with Cura styles - Contact info --- plugins/PluginBrowser/PluginBrowser.qml | 315 ++++++++++++++++++------ 1 file changed, 235 insertions(+), 80 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index 13000d23ad..b30fba7fc4 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -3,13 +3,14 @@ import QtQuick 2.2 import QtQuick.Dialogs 1.1 import QtQuick.Window 2.2 import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.4 UM.Dialog { id: base title: catalog.i18nc("@title:window", "Find & Update plugins") - width: 600 * screenScaleFactor + width: 800 * screenScaleFactor height: 450 * screenScaleFactor minimumWidth: 350 * screenScaleFactor minimumHeight: 350 * screenScaleFactor @@ -62,17 +63,7 @@ UM.Dialog height: closeButton.height anchors.bottom: parent.bottom anchors.left: parent.left - ProgressBar - { - id: progressbar - anchors.bottom: parent.bottom - minimumValue: 0; - maximumValue: 100 - anchors.left:parent.left - anchors.right: closeButton.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width - value: manager.isDownloading ? manager.downloadProgress : 0 - } + Button { @@ -92,91 +83,255 @@ UM.Dialog } } - Item - { - SystemPalette { id: palette } - Component - { + Item { + Component { id: pluginDelegate - Rectangle - { + + Rectangle { width: pluginList.width; - height: texts.height; - color: index % 2 ? palette.base : palette.alternateBase - Column - { - id: texts - width: parent.width - height: childrenRect.height + height: 96 + color: index % 2 ? UM.Theme.getColor("secondary") : "white" + + // Plugin info + Column { + id: pluginInfo + height: parent.height anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.right: downloadButton.left + anchors.top: parent.top + anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.right: authorInfo.left anchors.rightMargin: UM.Theme.getSize("default_margin").width - Label - { - text: "" + model.name + "" + ((model.author !== "") ? (" - " + model.author) : "") - width: contentWidth - height: contentHeight + UM.Theme.getSize("default_margin").height - verticalAlignment: Text.AlignVCenter - } - Label - { - text: model.short_description + Label { + text: model.name width: parent.width - height: contentHeight + UM.Theme.getSize("default_margin").height + height: 24 wrapMode: Text.WordWrap verticalAlignment: Text.AlignVCenter + font { + pixelSize: 15 + bold: true + } + } + + Label { + text: model.short_description + width: parent.width + height: 72 + wrapMode: Text.WordWrap } } - Button - { - id: downloadButton - text: - { - if (manager.isDownloading && pluginList.activePlugin == model) - { - return catalog.i18nc("@action:button", "Cancel"); - } - else 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: - { - if(!manager.isDownloading) - { - pluginList.activePlugin = model; - manager.downloadAndInstallPlugin(model.file_location); - } - else - { - manager.cancelDownload(); - } - } - anchors.right: parent.right + + // Author info + Column { + id: authorInfo + width: 192 + height: parent.height + + + anchors.top: parent.top + anchors.topMargin: UM.Theme.getSize("default_margin").height + + anchors.right: pluginActions.left anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: parent.verticalCenter - enabled: - { - if (manager.isDownloading) - { - return (pluginList.activePlugin == model); + + Label { + text: model.author + width: parent.width + height: 24 + wrapMode: Text.WordWrap + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignRight + } + + Label { + text: "author@ultimaker.com" + width: parent.width + height: 72 + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignRight + } + } + + // Plugin actions + Row { + id: pluginActions + width: 180 + UM.Theme.getSize("default_margin").width + height: parent.height + anchors { + top: parent.top + right: parent.right + topMargin: UM.Theme.getSize("default_margin").height + rightMargin: UM.Theme.getSize("default_margin").width + } + layoutDirection: Qt.RightToLeft + spacing: UM.Theme.getSize("default_margin").width + + Rectangle { + visible: model.already_installed + width: 108 + height: 30 + color: "transparent" + Button { + id: removeButton + text: "Remove" + enabled: { + if ( manager.isDownloading && pluginList.activePlugin == model ) { + return false; + } else { + return true; + } + } + style: ButtonStyle { + background: Rectangle { + color: white + implicitWidth: 108 + implicitHeight: 30 + radius: 4 + border { + width: 1 + color: "grey" + } + } + label: Text { + verticalAlignment: Text.AlignVCenter + color: "grey" + text: control.text + horizontalAlignment: Text.AlignLeft + } + } } - else - { - return (!model.already_installed || model.can_upgrade); + Button { + id: removeDropDown + UM.RecolorImage { + anchors.centerIn: parent + height: 10 + width: 10 + source: UM.Theme.getIcon("arrow_bottom") + color: "grey" + } + enabled: { + if ( model.required || ( manager.isDownloading && pluginList.activePlugin == model )) { + return false; + } else { + return true; + } + } + anchors.right: parent.right + style: ButtonStyle { + background: Rectangle { + color: "transparent" + implicitWidth: 30 + implicitHeight: 30 + radius: 4 + } + label: Text { + verticalAlignment: Text.AlignVCenter + color: "grey" + text: control.text + horizontalAlignment: Text.AlignHCenter + } + } + + // For the disable option: + onClicked: pluginList.model.setEnabled(model.id, checked) + } + Rectangle { + id: divider + width: 1 + height: parent.height + anchors.right: removeDropDown.left + color: "grey" } } + + + + Button { + id: updateButton + // visible: model.already_installed && model.can_upgrade + visible: model.already_installed + text: { + // If currently downloading: + if ( manager.isDownloading && pluginList.activePlugin == model ) { + return catalog.i18nc( "@action:button", "Cancel" ); + } else { + return catalog.i18nc("@action:button", "Update"); + } + } + style: ButtonStyle { + background: Rectangle { + color: UM.Theme.getColor("primary") + implicitWidth: 72 + implicitHeight: 30 + radius: 4 + } + label: Text { + verticalAlignment: Text.AlignVCenter + color: "white" + text: control.text + horizontalAlignment: Text.AlignHCenter + } + } + } + Button { + id: installButton + visible: !model.already_installed + text: { + // If currently downloading: + if ( manager.isDownloading && pluginList.activePlugin == model ) { + return catalog.i18nc( "@action:button", "Cancel" ); + } else { + return catalog.i18nc("@action:button", "Install"); + } + } + onClicked: { + if ( manager.isDownloading && pluginList.activePlugin == model ) { + manager.cancelDownload(); + } else { + pluginList.activePlugin = model; + manager.downloadAndInstallPlugin( model.file_location ); + } + } + style: ButtonStyle { + background: Rectangle { + color: UM.Theme.getColor("primary") + implicitWidth: 72 + implicitHeight: 30 + radius: 4 + } + label: Text { + verticalAlignment: Text.AlignVCenter + color: "white" + text: control.text + horizontalAlignment: Text.AlignHCenter + } + } + } + ProgressBar { + id: progressbar + minimumValue: 0; + maximumValue: 100 + anchors.left: installButton.left + anchors.right: installButton.right + anchors.top: installButton.bottom + anchors.topMargin: 4 + value: manager.isDownloading ? manager.downloadProgress : 0 + visible: manager.isDownloading && pluginList.activePlugin == model + style: ProgressBarStyle { + background: Rectangle { + color: "lightgray" + implicitHeight: 6 + } + progress: Rectangle { + color: UM.Theme.getColor("primary") + } + } + } + } } - } } UM.I18nCatalog { id: catalog; name: "cura" } From 259b1091f66b64aa7c65868f5d3e1886ef967ae0 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 17 Jan 2018 19:36:20 +0100 Subject: [PATCH 338/551] Fix QML errors building the material and nozzle menus Since the network rewrite, outputdevices no longer have hotends and materials. This functionality may return, but until that time this does a better job at checking if the properties exist, preventing QML errors. --- resources/qml/Menus/MaterialMenu.qml | 4 ++-- resources/qml/Menus/NozzleMenu.qml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml index 983d2f1b92..3d04649f11 100644 --- a/resources/qml/Menus/MaterialMenu.qml +++ b/resources/qml/Menus/MaterialMenu.qml @@ -44,14 +44,14 @@ Menu id: automaticMaterial text: { - if(printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex && !isClusterPrinter) + if(visible) { var materialName = Cura.MachineManager.printerOutputDevices[0].materialNames[extruderIndex]; return catalog.i18nc("@title:menuitem %1 is the automatically selected material", "Automatic: %1").arg(materialName); } return ""; } - visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex && !isClusterPrinter + visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames != undefined && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex && !isClusterPrinter onTriggered: { var materialId = Cura.MachineManager.printerOutputDevices[0].materialIds[extruderIndex]; diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml index cc3ea66b07..81db20a79d 100644 --- a/resources/qml/Menus/NozzleMenu.qml +++ b/resources/qml/Menus/NozzleMenu.qml @@ -34,14 +34,14 @@ Menu id: automaticNozzle text: { - if(printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex && !isClusterPrinter) + if(visible) { var nozzleName = Cura.MachineManager.printerOutputDevices[0].hotendIds[extruderIndex]; return catalog.i18nc("@title:menuitem %1 is the nozzle currently loaded in the printer", "Automatic: %1").arg(nozzleName); } return ""; } - visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex && !isClusterPrinter + visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds != undefined && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex && !isClusterPrinter onTriggered: { var activeExtruderIndex = Cura.ExtruderManager.activeExtruderIndex; From 64a7d1bbdabcb392d67dab3115062b11472d1e07 Mon Sep 17 00:00:00 2001 From: Brecht Nuyttens Date: Thu, 18 Jan 2018 08:34:10 +0100 Subject: [PATCH 339/551] Removed ID + minor change --- resources/definitions/vertex_delta_k8800.def.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/definitions/vertex_delta_k8800.def.json b/resources/definitions/vertex_delta_k8800.def.json index c6ea7db628..495fd5a5bc 100644 --- a/resources/definitions/vertex_delta_k8800.def.json +++ b/resources/definitions/vertex_delta_k8800.def.json @@ -1,5 +1,4 @@ { - "id": "K8800", "name": "Vertex Delta K8800", "version": 2, "inherits": "fdmprinter", @@ -124,7 +123,7 @@ "value": 20 }, "travel_retract_before_outer_wall": { - "value": true + "value": false }, "retraction_hop_enabled": { "value": true From 66805f83fdbf304a64b6469525b28159f45f6423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Thu, 18 Jan 2018 08:46:27 +0100 Subject: [PATCH 340/551] Small tweaks for default quality To better match printers after some testing --- .../anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg | 8 ++++---- .../anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg | 4 ++-- .../anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg | 4 ++-- .../tevo_blackwidow/tevo_blackwidow_draft.inst.cfg | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg index ee77117a6b..5c9a9c4769 100644 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg @@ -25,11 +25,11 @@ initial_layer_line_width_factor = 140 jerk_enabled = True jerk_print = 13 jerk_travel = 13 -layer_height = 0.4 -layer_height_0 = 0.4 -material_bed_temperature = 60 +layer_height = 0.3 +layer_height_0 = 0.3 +material_bed_temperature = 55 material_diameter = 1.75 -material_print_temperature = 200 +material_print_temperature = 205 material_print_temperature_layer_0 = 0 retract_at_layer_change = False retraction_amount = 7 diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg index 884ed5b3f9..c4485c34aa 100644 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg @@ -27,9 +27,9 @@ jerk_print = 13 jerk_travel = 13 layer_height = 0.1 layer_height_0 = 0.1 -material_bed_temperature = 60 +material_bed_temperature = 55 material_diameter = 1.75 -material_print_temperature = 200 +material_print_temperature = 205 material_print_temperature_layer_0 = 0 retract_at_layer_change = False retraction_amount = 7 diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg index 1ecfe49c71..2cc6ee69a4 100644 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg @@ -27,9 +27,9 @@ jerk_print = 13 jerk_travel = 13 layer_height = 0.2 layer_height_0 = 0.2 -material_bed_temperature = 60 +material_bed_temperature = 55 material_diameter = 1.75 -material_print_temperature = 200 +material_print_temperature = 205 material_print_temperature_layer_0 = 0 retract_at_layer_change = False retraction_amount = 7 diff --git a/resources/quality/tevo_blackwidow/tevo_blackwidow_draft.inst.cfg b/resources/quality/tevo_blackwidow/tevo_blackwidow_draft.inst.cfg index 88805021eb..082b7dded7 100644 --- a/resources/quality/tevo_blackwidow/tevo_blackwidow_draft.inst.cfg +++ b/resources/quality/tevo_blackwidow/tevo_blackwidow_draft.inst.cfg @@ -12,7 +12,7 @@ setting_version = 4 [values] brim_width = 4.0 infill_pattern = zigzag -layer_height = 0.4 +layer_height = 0.3 material_diameter = 1.75 speed_infill = 50 speed_print = 50 From 5e99fd6c1e2022989cf38d421789c06aeea66f72 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 18 Jan 2018 09:05:40 +0100 Subject: [PATCH 341/551] Fixes for print information when running in headless mode --- cura/CuraApplication.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 603ffb8bd4..bfaeb26d8d 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -673,6 +673,10 @@ class CuraApplication(QtApplication): for file_name in self._open_file_queue: # Open all the files that were queued up while plug-ins were loading. self._openFile(file_name) + # initialize info objects + self._print_information = PrintInformation.PrintInformation() + self._cura_actions = CuraActions.CuraActions(self) + self._started = True self.exec_() @@ -807,13 +811,10 @@ class CuraApplication(QtApplication): def registerObjects(self, engine): super().registerObjects(engine) + # global contexts engine.rootContext().setContextProperty("Printer", self) engine.rootContext().setContextProperty("CuraApplication", self) - - self._print_information = PrintInformation.PrintInformation() engine.rootContext().setContextProperty("PrintInformation", self._print_information) - - self._cura_actions = CuraActions.CuraActions(self) engine.rootContext().setContextProperty("CuraActions", self._cura_actions) qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type") From 53cc4efb23a3bea0a1ee478c85a9b6b86df5e171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Thu, 18 Jan 2018 09:42:36 +0100 Subject: [PATCH 342/551] last minute tweaks Decreased jerk and acceleration --- .../anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg | 10 +++++----- .../anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg | 10 +++++----- .../anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg index 5c9a9c4769..355d9ee971 100644 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg @@ -11,8 +11,8 @@ setting_version = 4 [values] acceleration_enabled = True -acceleration_print = 2000 -acceleration_travel = 3500 +acceleration_print = 1800 +acceleration_travel = 3000 adhesion_type = skirt brim_width = 4.0 cool_fan_full_at_height = 0.5 @@ -23,11 +23,11 @@ infill_pattern = zigzag infill_sparse_density = 25 initial_layer_line_width_factor = 140 jerk_enabled = True -jerk_print = 13 -jerk_travel = 13 +jerk_print = 8 +jerk_travel = 10 layer_height = 0.3 layer_height_0 = 0.3 -material_bed_temperature = 55 +material_bed_temperature = 60 material_diameter = 1.75 material_print_temperature = 205 material_print_temperature_layer_0 = 0 diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg index c4485c34aa..9965d9f763 100644 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg @@ -11,8 +11,8 @@ setting_version = 4 [values] acceleration_enabled = True -acceleration_print = 2000 -acceleration_travel = 3500 +acceleration_print = 1800 +acceleration_travel = 3000 adhesion_type = skirt brim_width = 4.0 cool_fan_full_at_height = 0.5 @@ -23,11 +23,11 @@ infill_pattern = zigzag infill_sparse_density = 25 initial_layer_line_width_factor = 140 jerk_enabled = True -jerk_print = 13 -jerk_travel = 13 +jerk_print = 8 +jerk_travel = 10 layer_height = 0.1 layer_height_0 = 0.1 -material_bed_temperature = 55 +material_bed_temperature = 60 material_diameter = 1.75 material_print_temperature = 205 material_print_temperature_layer_0 = 0 diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg index 2cc6ee69a4..12773190dd 100644 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg @@ -11,8 +11,8 @@ setting_version = 4 [values] acceleration_enabled = True -acceleration_print = 2000 -acceleration_travel = 3500 +acceleration_print = 1800 +acceleration_travel = 3000 adhesion_type = skirt brim_width = 4.0 cool_fan_full_at_height = 0.5 @@ -23,11 +23,11 @@ infill_pattern = zigzag infill_sparse_density = 25 initial_layer_line_width_factor = 140 jerk_enabled = True -jerk_print = 13 -jerk_travel = 13 +jerk_print = 8 +jerk_travel = 10 layer_height = 0.2 layer_height_0 = 0.2 -material_bed_temperature = 55 +material_bed_temperature = 60 material_diameter = 1.75 material_print_temperature = 205 material_print_temperature_layer_0 = 0 From 1796a182fac58692ef52c4bb3082dfd80fe61c9f Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 18 Jan 2018 11:54:30 +0100 Subject: [PATCH 343/551] CURA-4525 fix crashing cura due to empty build plate --- .../UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index 9289981d64..548a350a57 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -286,7 +286,10 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte gcode_list = getattr(Application.getInstance().getController().getScene(), "gcode_dict")[output_build_plate_number] if not gcode_list: # Empty build plate Logger.log("d", "Skipping empty job (build plate number %d).", output_build_plate_number) - return self.sendPrintJob() + if self._job_list: + return self.sendPrintJob() + else: + return self._send_gcode_start = time.time() Logger.log("d", "Sending print job [%s] to host, build plate [%s]..." % (file_name, output_build_plate_number)) From 322420092dabd3cc0cdb59cebac20f31c96ff809 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 18 Jan 2018 13:47:50 +0100 Subject: [PATCH 344/551] Fix extruder handling in project loading CURA-4824 When a machine is getting overriden, it should not try to create the ExtruderStack for the single-extrusion machine loaded from the project file, otherwise that ExtruderStack will become an extra one. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 77a7da8b6a..913cea4f26 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -24,6 +24,7 @@ from cura.Settings.ExtruderStack import ExtruderStack from cura.Settings.GlobalStack import GlobalStack from cura.Settings.CuraContainerStack import _ContainerIndexes from cura.QualityManager import QualityManager +from cura.CuraApplication import CuraApplication from configparser import ConfigParser import zipfile @@ -750,8 +751,16 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # If not extruder stacks were saved in the project file (pre 3.1) create one manually # We re-use the container registry's addExtruderStackForSingleExtrusionMachine method for this if not extruder_stacks: - stack = self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder") + if self._resolve_strategies["machine"] == "new": + stack = self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder") + else: + stack = global_stack.extruders.get("0") + if not stack: + # this should not happen + Logger.log("e", "Cannot find any extruder in an existing global stack [%s].", global_stack.getId()) if stack: + if global_stack.quality.getId() in ("empty", "empty_quality"): + stack.quality = empty_quality_container if self._resolve_strategies["machine"] == "override": # in case the extruder is newly created (for a single-extrusion machine), we need to override # the existing extruder stack. @@ -991,6 +1000,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): for stack in extruder_stacks: stack.setNextStack(global_stack) stack.containersChanged.emit(stack.getTop()) + else: + if quality_has_been_changed: + CuraApplication.getInstance().getMachineManager().activeQualityChanged.emit() # Actually change the active machine. Application.getInstance().setGlobalContainerStack(global_stack) @@ -1040,13 +1052,13 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # find the old material ID old_material_id_in_stack = stack.material.getId() best_matching_old_material_id = None - best_matching_old_meterial_prefix_length = -1 + best_matching_old_material_prefix_length = -1 for old_parent_material_id in old_new_material_dict: - if len(old_parent_material_id) < best_matching_old_meterial_prefix_length: + if len(old_parent_material_id) < best_matching_old_material_prefix_length: continue if len(old_parent_material_id) <= len(old_material_id_in_stack): if old_parent_material_id == old_material_id_in_stack[0:len(old_parent_material_id)]: - best_matching_old_meterial_prefix_length = len(old_parent_material_id) + best_matching_old_material_prefix_length = len(old_parent_material_id) best_matching_old_material_id = old_parent_material_id if best_matching_old_material_id is None: From 68347afc480b39b44efb56adc065e0f8da78ee20 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 18 Jan 2018 14:40:15 +0100 Subject: [PATCH 345/551] CURA-4033 fix init order of print information --- cura/CuraApplication.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index bfaeb26d8d..b825e456c2 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -661,6 +661,10 @@ class CuraApplication(QtApplication): self._volume = BuildVolume.BuildVolume(self.getController().getScene().getRoot()) Arrange.build_volume = self._volume + # initialize info objects + self._print_information = PrintInformation.PrintInformation() + self._cura_actions = CuraActions.CuraActions(self) + # Detect in which mode to run and execute that mode if self.getCommandLineOption("headless", False): self.runWithoutGUI() @@ -673,10 +677,6 @@ class CuraApplication(QtApplication): for file_name in self._open_file_queue: # Open all the files that were queued up while plug-ins were loading. self._openFile(file_name) - # initialize info objects - self._print_information = PrintInformation.PrintInformation() - self._cura_actions = CuraActions.CuraActions(self) - self._started = True self.exec_() From ece63bfea8231411ef63e64623f3b666df42f66c Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 18 Jan 2018 15:47:01 +0100 Subject: [PATCH 346/551] CURA-4821 The previous cached layer data is removed when a GCode is loaded. Temporary solution for one buildplate. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 9713211ad3..85699ea0f5 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -426,6 +426,13 @@ class CuraEngineBackend(QObject, Backend): if not isinstance(source, SceneNode): return + # This case checks if the source node is a node that contains a GCode. In this case the + # cached layer data is removed so the previous data is not rendered - CURA-4821 + if source.callDecoration("isBlockSlicing") and source.callDecoration("getLayerData"): + if self._stored_optimized_layer_data: + print(self._stored_optimized_layer_data) + del self._stored_optimized_layer_data[source.callDecoration("getBuildPlateNumber")] + build_plate_changed = set() source_build_plate_number = source.callDecoration("getBuildPlateNumber") if source == self._scene.getRoot(): From a774012bd2659815f5fe752f5696bfe1561673dc Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 18 Jan 2018 16:28:46 +0100 Subject: [PATCH 347/551] Default objectlist to collapsed CURA-4525 --- resources/qml/ObjectsList.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index 489e38e8d7..9fd2ab1ca7 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -31,7 +31,7 @@ Rectangle border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") - property bool collapsed: false; + property bool collapsed: true; SystemPalette { id: palette } From 8b00bafb8b10d0b28f85b5dc7c6bb12d983bac5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Fri, 19 Jan 2018 06:57:39 +0100 Subject: [PATCH 348/551] . --- .../quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg | 4 ++-- .../quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg | 4 ++-- .../quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg index 355d9ee971..c6281767f9 100644 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg @@ -29,10 +29,10 @@ layer_height = 0.3 layer_height_0 = 0.3 material_bed_temperature = 60 material_diameter = 1.75 -material_print_temperature = 205 +material_print_temperature = 200 material_print_temperature_layer_0 = 0 retract_at_layer_change = False -retraction_amount = 7 +retraction_amount = 6 retraction_hop = 0.075 retraction_hop_enabled = True retraction_hop_only_when_collides = True diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg index 9965d9f763..839054a4df 100644 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg @@ -29,10 +29,10 @@ layer_height = 0.1 layer_height_0 = 0.1 material_bed_temperature = 60 material_diameter = 1.75 -material_print_temperature = 205 +material_print_temperature = 200 material_print_temperature_layer_0 = 0 retract_at_layer_change = False -retraction_amount = 7 +retraction_amount = 6 retraction_hop = 0.075 retraction_hop_enabled = True retraction_hop_only_when_collides = True diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg index 12773190dd..241a8b2e2c 100644 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg @@ -29,10 +29,10 @@ layer_height = 0.2 layer_height_0 = 0.2 material_bed_temperature = 60 material_diameter = 1.75 -material_print_temperature = 205 +material_print_temperature = 200 material_print_temperature_layer_0 = 0 retract_at_layer_change = False -retraction_amount = 7 +retraction_amount = 6 retraction_hop = 0.075 retraction_hop_enabled = True retraction_hop_only_when_collides = True From d03ecf3cba84d1551d6cb979ef0fb094da92a3e2 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 19 Jan 2018 09:16:22 +0100 Subject: [PATCH 349/551] CURA-4821 Remove debug info --- 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 85699ea0f5..26731337dd 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -430,7 +430,6 @@ class CuraEngineBackend(QObject, Backend): # cached layer data is removed so the previous data is not rendered - CURA-4821 if source.callDecoration("isBlockSlicing") and source.callDecoration("getLayerData"): if self._stored_optimized_layer_data: - print(self._stored_optimized_layer_data) del self._stored_optimized_layer_data[source.callDecoration("getBuildPlateNumber")] build_plate_changed = set() @@ -698,6 +697,7 @@ class CuraEngineBackend(QObject, Backend): self._process_layers_job.setBuildPlate(build_plate_number) self._process_layers_job.finished.connect(self._onProcessLayersFinished) self._process_layers_job.start() + del self._stored_optimized_layer_data[build_plate_number] ## Called when the user changes the active view mode. def _onActiveViewChanged(self): From 81b2f0f7cd36f040257f9460e2c0ec0b25507c20 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 19 Jan 2018 09:56:19 +0100 Subject: [PATCH 350/551] Added drop-down buttons --- plugins/PluginBrowser/PluginBrowser.qml | 54 ++++++++++++++++++++----- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.qml b/plugins/PluginBrowser/PluginBrowser.qml index b30fba7fc4..7c58f96b03 100644 --- a/plugins/PluginBrowser/PluginBrowser.qml +++ b/plugins/PluginBrowser/PluginBrowser.qml @@ -5,11 +5,10 @@ import QtQuick.Window 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.4 -UM.Dialog -{ +UM.Dialog { id: base - title: catalog.i18nc("@title:window", "Find & Update plugins") + title: catalog.i18nc("@title:tab", "Plugins"); width: 800 * screenScaleFactor height: 450 * screenScaleFactor minimumWidth: 350 * screenScaleFactor @@ -46,8 +45,7 @@ UM.Dialog anchors.bottom: bottomBar.top anchors.bottomMargin: UM.Theme.getSize("default_margin").height frameVisible: true - ListView - { + ListView { id: pluginList model: manager.pluginsModel anchors.fill: parent @@ -113,6 +111,7 @@ UM.Dialog pixelSize: 15 bold: true } + color: model.enabled ? UM.Theme.getColor("text") : "grey" } Label { @@ -169,6 +168,7 @@ UM.Dialog spacing: UM.Theme.getSize("default_margin").width Rectangle { + id: removeControls visible: model.already_installed width: 108 height: 30 @@ -188,7 +188,7 @@ UM.Dialog color: white implicitWidth: 108 implicitHeight: 30 - radius: 4 + // radius: 4 border { width: 1 color: "grey" @@ -204,6 +204,7 @@ UM.Dialog } Button { id: removeDropDown + property bool open: false UM.RecolorImage { anchors.centerIn: parent height: 10 @@ -224,7 +225,7 @@ UM.Dialog color: "transparent" implicitWidth: 30 implicitHeight: 30 - radius: 4 + // radius: 4 } label: Text { verticalAlignment: Text.AlignVCenter @@ -234,8 +235,21 @@ UM.Dialog } } + + // For the disable option: - onClicked: pluginList.model.setEnabled(model.id, checked) + // onClicked: pluginList.model.setEnabled(model.id, checked) + + onClicked: { + if ( !removeDropDown.open ) { + removeDropDown.open = true + } + else { + removeDropDown.open = false + } + + } + } Rectangle { id: divider @@ -244,6 +258,26 @@ UM.Dialog anchors.right: removeDropDown.left color: "grey" } + Column { + id: options + anchors { + top: removeButton.bottom + left: parent.left + right: parent.right + } + height: childrenRect.height + visible: removeDropDown.open + + Button { + text: "Disable" + height: 30 + width: parent.width + onClicked: { + removeDropDown.open = false + model.setEnabled(model.id, checked) + } + } + } } @@ -265,7 +299,7 @@ UM.Dialog color: UM.Theme.getColor("primary") implicitWidth: 72 implicitHeight: 30 - radius: 4 + // radius: 4 } label: Text { verticalAlignment: Text.AlignVCenter @@ -299,7 +333,7 @@ UM.Dialog color: UM.Theme.getColor("primary") implicitWidth: 72 implicitHeight: 30 - radius: 4 + // radius: 4 } label: Text { verticalAlignment: Text.AlignVCenter From a6acf4a4af1dfd6bd6f4537891754d3b9612482b Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 19 Jan 2018 10:34:04 +0100 Subject: [PATCH 351/551] CURA-4829 Do not save the quality changes profile in the GCode if the containers are empty. Change the message when trying to import a GCode as a profile, but not profile was stored. --- cura/Settings/CuraContainerRegistry.py | 4 ++++ plugins/GCodeWriter/GCodeWriter.py | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index b945ec0609..b73bec11a7 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -205,6 +205,7 @@ class CuraContainerRegistry(ContainerRegistry): profile_reader = plugin_registry.getPluginObject(plugin_id) try: profile_or_list = profile_reader.read(file_name) # Try to open the file with the profile reader. + print except Exception as e: # Note that this will fail quickly. That is, if any profile reader throws an exception, it will stop reading. It will only continue reading if the reader returned None. Logger.log("e", "Failed to import profile from %s: %s while using profile reader. Got exception %s", file_name,profile_reader.getPluginId(), str(e)) @@ -245,6 +246,9 @@ class CuraContainerRegistry(ContainerRegistry): return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())} + # This message is throw when the profile reader doesn't find any profile in the file + return {"status": "error", "message": catalog.i18nc("@info:status", "File {0} does not contain any valid profile.", file_name)} + # If it hasn't returned by now, none of the plugins loaded the profile successfully. return {"status": "error", "message": catalog.i18nc("@info:status", "Profile {0} has an unknown file type or is corrupted.", file_name)} diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index 95c48c4d9e..2dfaf5aef7 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -107,7 +107,7 @@ class GCodeWriter(MeshWriter): prefix_length = len(prefix) container_with_profile = stack.qualityChanges - if not container_with_profile: + if container_with_profile.getId() == "empty_quality_changes": Logger.log("e", "No valid quality profile found, not writing settings to GCode!") return "" @@ -123,9 +123,9 @@ class GCodeWriter(MeshWriter): serialized = flat_global_container.serialize() data = {"global_quality": serialized} - for extruder in sorted(ExtruderManager.getInstance().getMachineExtruders(stack.getId()), key = lambda k: k.getMetaDataEntry("position")): + for extruder in sorted(stack.extruders.values(), key = lambda k: k.getMetaDataEntry("position")): extruder_quality = extruder.qualityChanges - if not extruder_quality: + if extruder_quality.getId() == "empty_quality_changes": Logger.log("w", "No extruder quality profile found, not writing quality for extruder %s to file!", extruder.getId()) continue flat_extruder_quality = self._createFlattenedContainerInstance(extruder.getTop(), extruder_quality) From e4a111dd2ee758af58049e5253c3c77d2f1ad3ad Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 19 Jan 2018 10:36:25 +0100 Subject: [PATCH 352/551] Delay adding global stack when creating new machine until after extruder stacks are created - CURA-4828 --- cura/Settings/CuraStackBuilder.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 8d2d66ea87..608a13c600 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -63,6 +63,7 @@ class CuraStackBuilder: next_stack = new_global_stack ) new_global_stack.addExtruder(new_extruder) + registry.addContainer(new_extruder) else: # create extruder stack for each found extruder definition for extruder_definition in registry.findDefinitionContainers(machine = machine_definition.id): @@ -81,6 +82,11 @@ class CuraStackBuilder: next_stack = new_global_stack ) new_global_stack.addExtruder(new_extruder) + registry.addContainer(new_extruder) + + # Register the global stack after the extruder stacks are created. This prevents the registry from adding another + # extruder stack because the global stack didn't have one yet (which is enforced since Cura 3.1). + registry.addContainer(new_global_stack) return new_global_stack @@ -135,9 +141,7 @@ class CuraStackBuilder: # Only add the created containers to the registry after we have set all the other # properties. This makes the create operation more transactional, since any problems # setting properties will not result in incomplete containers being added. - registry = ContainerRegistry.getInstance() - registry.addContainer(stack) - registry.addContainer(user_container) + ContainerRegistry.getInstance().addContainer(user_container) return stack @@ -181,9 +185,7 @@ class CuraStackBuilder: if "quality_changes" in kwargs: stack.setQualityChangesById(kwargs["quality_changes"]) - registry = ContainerRegistry.getInstance() - registry.addContainer(stack) - registry.addContainer(user_container) + ContainerRegistry.getInstance().addContainer(user_container) return stack From a76c84ca30b2f31713bcd9596c7e1c0188381a3d Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 19 Jan 2018 10:42:04 +0100 Subject: [PATCH 353/551] Finally remove annoying firmware check log line for non-UM3 printers --- plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py | 1 - plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index 458aca5787..8e4c70517f 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -49,7 +49,6 @@ class FirmwareUpdateChecker(Extension): def _onContainerAdded(self, container): # Only take care when a new GlobalStack was added if isinstance(container, GlobalStack): - Logger.log("i", "You have a '%s' in printer list. Let's check the firmware!", container.getId()) self.checkFirmwareVersion(container, True) ## Connect with software.ultimaker.com, load latest.version and check version info. diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 6dd7338cfd..fd6c4680e8 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -44,6 +44,8 @@ class FirmwareUpdateCheckerJob(Job): # Now we just do that if the active printer is Ultimaker 3 or Ultimaker 3 Extended or any # other Ultimaker 3 that will come in the future if len(machine_name_parts) >= 2 and machine_name_parts[:2] == ["ultimaker", "3"]: + Logger.log("i", "You have a UM3 in printer list. Let's check the firmware!") + # Nothing to parse, just get the string # TODO: In the future may be done by parsing a JSON file with diferent version for each printer model current_version = reader(current_version_file).readline().rstrip() From ce709bf24a507f6855b1f8e8cee2bf0d58e17445 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 19 Jan 2018 10:48:45 +0100 Subject: [PATCH 354/551] Remove debug print - CURA-4829 --- cura/Settings/CuraContainerRegistry.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index b73bec11a7..4567226060 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -205,7 +205,6 @@ class CuraContainerRegistry(ContainerRegistry): profile_reader = plugin_registry.getPluginObject(plugin_id) try: profile_or_list = profile_reader.read(file_name) # Try to open the file with the profile reader. - print except Exception as e: # Note that this will fail quickly. That is, if any profile reader throws an exception, it will stop reading. It will only continue reading if the reader returned None. Logger.log("e", "Failed to import profile from %s: %s while using profile reader. Got exception %s", file_name,profile_reader.getPluginId(), str(e)) From 02291bb6a319a7410344aa1dcbcaff697f38084b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 19 Jan 2018 11:14:40 +0100 Subject: [PATCH 355/551] better name: "Compatible material diameter" in Machine Settings CURA-4832 --- 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 b815d71acc..536c6c30d6 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -390,7 +390,7 @@ Cura.MachineAction visible: Cura.MachineManager.hasMaterials sourceComponent: numericTextFieldWithUnit property string settingKey: "material_diameter" - property string label: catalog.i18nc("@label", "Material diameter") + property string label: catalog.i18nc("@label", "Compatible 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.") function afterOnEditingFinished() From 1f4e7421c1e776c68f309f3caf46db53aa1f275d Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 19 Jan 2018 11:17:42 +0100 Subject: [PATCH 356/551] Revert "CURA-4821 Remove debug info" This reverts commit d03ecf3cba84d1551d6cb979ef0fb094da92a3e2. --- 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 26731337dd..85699ea0f5 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -430,6 +430,7 @@ class CuraEngineBackend(QObject, Backend): # cached layer data is removed so the previous data is not rendered - CURA-4821 if source.callDecoration("isBlockSlicing") and source.callDecoration("getLayerData"): if self._stored_optimized_layer_data: + print(self._stored_optimized_layer_data) del self._stored_optimized_layer_data[source.callDecoration("getBuildPlateNumber")] build_plate_changed = set() @@ -697,7 +698,6 @@ class CuraEngineBackend(QObject, Backend): self._process_layers_job.setBuildPlate(build_plate_number) self._process_layers_job.finished.connect(self._onProcessLayersFinished) self._process_layers_job.start() - del self._stored_optimized_layer_data[build_plate_number] ## Called when the user changes the active view mode. def _onActiveViewChanged(self): From f25aad8091b9eb651d958bbb5e4a9e8960dc9ec5 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 19 Jan 2018 11:18:46 +0100 Subject: [PATCH 357/551] CURA-4821 Remove debug output --- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 85699ea0f5..47f7a07b94 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -430,7 +430,6 @@ class CuraEngineBackend(QObject, Backend): # cached layer data is removed so the previous data is not rendered - CURA-4821 if source.callDecoration("isBlockSlicing") and source.callDecoration("getLayerData"): if self._stored_optimized_layer_data: - print(self._stored_optimized_layer_data) del self._stored_optimized_layer_data[source.callDecoration("getBuildPlateNumber")] build_plate_changed = set() From 99c40d09e937859070f3386f7b27e0afab5b53d6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 19 Jan 2018 11:32:55 +0100 Subject: [PATCH 358/551] Hitting enter on project loading dialog now loads the project instead of just closing the dialog - CURA-4735 --- .../qml/AskOpenAsProjectOrModelsDialog.qml | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/resources/qml/AskOpenAsProjectOrModelsDialog.qml b/resources/qml/AskOpenAsProjectOrModelsDialog.qml index a53c711f9d..bd37d1acdb 100644 --- a/resources/qml/AskOpenAsProjectOrModelsDialog.qml +++ b/resources/qml/AskOpenAsProjectOrModelsDialog.qml @@ -26,33 +26,54 @@ UM.Dialog minimumHeight: maximumHeight minimumWidth: maximumWidth - modality: UM.Application.platform == "linux" ? Qt.NonModal : Qt.WindowModal; + modality: UM.Application.platform == "linux" ? Qt.NonModal : Qt.WindowModal property var fileUrl - function loadProjectFile(projectFile) - { - UM.WorkspaceFileHandler.readLocalFile(projectFile); + // load the entire project + function loadProjectFile() { - var meshName = backgroundItem.getMeshName(projectFile.toString()); - backgroundItem.hasMesh(decodeURIComponent(meshName)); - } - - function loadModelFiles(fileUrls) - { - for (var i in fileUrls) - { - CuraApplication.readLocalFile(fileUrls[i]); + // update preference + if (rememberChoiceCheckBox.checked) { + UM.Preferences.setValue("cura/choice_on_open_project", "open_as_project") } - var meshName = backgroundItem.getMeshName(fileUrls[0].toString()); - backgroundItem.hasMesh(decodeURIComponent(meshName)); + UM.WorkspaceFileHandler.readLocalFile(base.fileUrl) + var meshName = backgroundItem.getMeshName(base.fileUrl.toString()) + backgroundItem.hasMesh(decodeURIComponent(meshName)) + + base.hide() } - onVisibleChanged: - { - if (visible) - { + // load the project file as separated models + function loadModelFiles() { + + // update preference + if (rememberChoiceCheckBox.checked) { + UM.Preferences.setValue("cura/choice_on_open_project", "open_as_model") + } + + CuraApplication.readLocalFile(base.fileUrl) + var meshName = backgroundItem.getMeshName(base.fileUrl.toString()) + backgroundItem.hasMesh(decodeURIComponent(meshName)) + + base.hide() + } + + // override UM.Dialog accept + function accept () { + var openAsPreference = UM.Preferences.getValue("cura/choice_on_open_project") + + // when hitting 'enter', we always open as project unless open_as_model was explicitly stored as preference + if (openAsPreference == "open_as_model") { + loadModelFiles() + } else { + loadProjectFile() + } + } + + onVisibleChanged: { + if (visible) { var rememberMyChoice = UM.Preferences.getValue("cura/choice_on_open_project") != "always_ask"; rememberChoiceCheckBox.checked = rememberMyChoice; } @@ -90,47 +111,26 @@ UM.Dialog } // Buttons - Item - { + Item { id: buttonBar anchors.right: parent.right anchors.left: parent.left height: childrenRect.height - Button - { + Button { id: openAsProjectButton - text: catalog.i18nc("@action:button", "Open as project"); + text: catalog.i18nc("@action:button", "Open as project") anchors.right: importModelsButton.left anchors.rightMargin: UM.Theme.getSize("default_margin").width isDefault: true - onClicked: - { - // update preference - if (rememberChoiceCheckBox.checked) - UM.Preferences.setValue("cura/choice_on_open_project", "open_as_project"); - - // load this file as project - base.hide(); - loadProjectFile(base.fileUrl); - } + onClicked: loadProjectFile() } - Button - { + Button { id: importModelsButton - text: catalog.i18nc("@action:button", "Import models"); + text: catalog.i18nc("@action:button", "Import models") anchors.right: parent.right - onClicked: - { - // update preference - if (rememberChoiceCheckBox.checked) - UM.Preferences.setValue("cura/choice_on_open_project", "open_as_model"); - - // load models from this project file - base.hide(); - loadModelFiles([base.fileUrl]); - } + onClicked: loadModelFiles() } } } From 7c85db4a180230137f4410f6762e601ceb3649d9 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 19 Jan 2018 12:30:04 +0100 Subject: [PATCH 359/551] Fix material_diameter copy over for Extruders CURA-4835 --- cura/Settings/ExtruderManager.py | 6 +++++ cura/Settings/ExtruderStack.py | 44 +++++++++++++++++++++----------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index b5f9a35914..6d52ce87fd 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -407,6 +407,12 @@ class ExtruderManager(QObject): extruder_train.setNextStack(global_stack) extruders_changed = True + # FIX: We have to remove those settings here because we know that those values have been copied to all + # the extruders at this point. + for key in ("material_diameter", "machine_nozzle_size"): + if global_stack.definitionChanges.hasProperty(key, "value"): + global_stack.definitionChanges.removeInstance(key, postpone_emit = True) + if extruders_changed: self.extrudersChanged.emit(global_stack_id) self.extrudersAdded.emit() diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index 6dffeda6c2..dd03ce7b3b 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -18,10 +18,6 @@ if TYPE_CHECKING: from cura.Settings.GlobalStack import GlobalStack -_EXTRUDER_SPECIFIC_DEFINITION_CHANGES_SETTINGS = ["machine_nozzle_size", - "material_diameter"] - - ## Represents an Extruder and its related containers. # # @@ -53,20 +49,38 @@ class ExtruderStack(CuraContainerStack): # when we are upgrading a definition_changes container file, there is NO guarantee that other files such as # machine an extruder stack files are upgraded before this, so we cannot read those files assuming they are in # the latest format. + # + # MORE: + # For single-extrusion machines, nozzle size is saved in the global stack, so the nozzle size value should be + # carried to the first extruder. + # For material diameter, it was supposed to be applied to all extruders, so its value should be copied to all + # extruders. + # + keys_to_copy = ["material_diameter"] # material diameter will be copied to all extruders if self.getMetaDataEntry("position") == "0": - for key in _EXTRUDER_SPECIFIC_DEFINITION_CHANGES_SETTINGS: - setting_value = stack.definitionChanges.getProperty(key, "value") - if setting_value is None: - continue + keys_to_copy.append("machine_nozzle_size") - setting_definition = stack.getSettingDefinition(key) - new_instance = SettingInstance(setting_definition, self.definitionChanges) - new_instance.setProperty("value", setting_value) - new_instance.resetState() # Ensure that the state is not seen as a user state. - self.definitionChanges.addInstance(new_instance) - self.definitionChanges.setDirty(True) + for key in keys_to_copy: + # Only copy the value when this extruder doesn't have the value. + if self.definitionChanges.hasProperty(key, "value"): + continue + setting_value = stack.definitionChanges.getProperty(key, "value") + if setting_value is None: + continue - stack.definitionChanges.removeInstance(key, postpone_emit = True) + setting_definition = stack.getSettingDefinition(key) + new_instance = SettingInstance(setting_definition, self.definitionChanges) + new_instance.setProperty("value", setting_value) + new_instance.resetState() # Ensure that the state is not seen as a user state. + self.definitionChanges.addInstance(new_instance) + self.definitionChanges.setDirty(True) + + # NOTE: We cannot remove the setting from the global stack's definition changes container because for + # material diameter, it needs to be applied to all extruders, but here we don't know how many extruders + # a machine actually has and how many extruders has already been loaded for that machine, so we have to + # keep this setting for any remaining extruders that haven't been loaded yet. + # + # Those settings will be removed in ExtruderManager which knows all those info. @override(ContainerStack) def getNextStack(self) -> Optional["GlobalStack"]: From e0c69eb67511b6f675906e38c66e7eca2ac7bb47 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 19 Jan 2018 12:51:09 +0100 Subject: [PATCH 360/551] Pressing enter on project overview will load the project file CURA-4735 --- plugins/3MFReader/WorkspaceDialog.qml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/3MFReader/WorkspaceDialog.qml b/plugins/3MFReader/WorkspaceDialog.qml index 826b488e02..5418dcef6d 100644 --- a/plugins/3MFReader/WorkspaceDialog.qml +++ b/plugins/3MFReader/WorkspaceDialog.qml @@ -390,6 +390,13 @@ UM.Dialog } } + function accept() { + manager.closeBackend(); + manager.onOkButtonClicked(); + base.visible = false; + base.accept(); + } + function reject() { manager.onCancelButtonClicked(); base.visible = false; From d035ace40dc73a2c3109381fadde778c42ed2e67 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 19 Jan 2018 13:32:25 +0100 Subject: [PATCH 361/551] Add method to set active extruder count to machine manager so other plugins can use it, add empty definitions container template --- cura/CuraApplication.py | 5 ++ cura/Settings/MachineManager.py | 65 +++++++++++++++++++ .../MachineSettingsAction.py | 57 +--------------- 3 files changed, 73 insertions(+), 54 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 0ac50c9e5e..342f6cb91d 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -278,6 +278,11 @@ class CuraApplication(QtApplication): # We need them to simplify the switching between materials. empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() + empty_definition_changes_container = copy.deepcopy(empty_container) + empty_definition_changes_container.setMetaDataEntry("id", "empty_definition_changes") + empty_definition_changes_container.addMetaDataEntry("type", "definition_changes") + ContainerRegistry.getInstance().addContainer(empty_definition_changes_container) + empty_variant_container = copy.deepcopy(empty_container) empty_variant_container.setMetaDataEntry("id", "empty_variant") empty_variant_container.addMetaDataEntry("type", "variant") diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 05aed1f5e2..23799e34b1 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -3,6 +3,8 @@ #Type hinting. from typing import Union, List, Dict + +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Signal import Signal from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal, QTimer @@ -74,6 +76,7 @@ class MachineManager(QObject): self._stacks_have_errors = None + self._empty_definition_changes_container = ContainerRegistry.getInstance().findContainers(id = "empty_definition_changes")[0] self._empty_variant_container = ContainerRegistry.getInstance().findContainers(id = "empty_variant")[0] self._empty_material_container = ContainerRegistry.getInstance().findContainers(id = "empty_material")[0] self._empty_quality_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] @@ -1236,6 +1239,68 @@ class MachineManager(QObject): if containers: return containers[0].definition.getId() + ## Set the amount of extruders on the active machine (global stack) + # \param extruder_count int the number of extruders to set + def setActiveMachineExtruderCount(self, extruder_count): + extruder_manager = Application.getInstance().getExtruderManager() + + definition_changes_container = self._global_container_stack.definitionChanges + if not self._global_container_stack or definition_changes_container == self._empty_definition_changes_container: + return + + previous_extruder_count = self._global_container_stack.getProperty("machine_extruder_count", "value") + if extruder_count == previous_extruder_count: + return + + # reset all extruder number settings whose value is no longer valid + for setting_instance in self._global_container_stack.userChanges.findInstances(): + setting_key = setting_instance.definition.key + if not self._global_container_stack.getProperty(setting_key, "type") in ("extruder", "optional_extruder"): + continue + + old_value = int(self._global_container_stack.userChanges.getProperty(setting_key, "value")) + if old_value >= extruder_count: + self._global_container_stack.userChanges.removeInstance(setting_key) + Logger.log("d", "Reset [%s] because its old value [%s] is no longer valid ", setting_key, old_value) + + # Check to see if any objects are set to print with an extruder that will no longer exist + root_node = Application.getInstance().getController().getScene().getRoot() + for node in DepthFirstIterator(root_node): + if node.getMeshData(): + extruder_nr = node.callDecoration("getActiveExtruderPosition") + + if extruder_nr is not None and int(extruder_nr) > extruder_count - 1: + node.callDecoration("setActiveExtruder", extruder_manager.getExtruderStack(extruder_count - 1).getId()) + + definition_changes_container.setProperty("machine_extruder_count", "value", extruder_count) + + # Make sure one of the extruder stacks is active + extruder_manager.setActiveExtruderIndex(0) + + # Move settable_per_extruder values out of the global container + # After CURA-4482 this should not be the case anymore, but we still want to support older project files. + global_user_container = self._global_container_stack.getTop() + + # Make sure extruder_stacks exists + extruder_stacks = [] + + if previous_extruder_count == 1: + extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() + global_user_container = self._global_container_stack.getTop() + + for setting_instance in global_user_container.findInstances(): + setting_key = setting_instance.definition.key + settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") + + if settable_per_extruder: + limit_to_extruder = int(self._global_container_stack.getProperty(setting_key, "limit_to_extruder")) + extruder_stack = extruder_stacks[max(0, limit_to_extruder)] + extruder_stack.getTop().setProperty(setting_key, "value", global_user_container.getProperty(setting_key, "value")) + global_user_container.removeInstance(setting_key) + + # Signal that the global stack has changed + Application.getInstance().globalContainerStackChanged.emit() + @staticmethod def createMachineManager(): return MachineManager() diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 101ba54ed0..ae1c1663dd 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -105,60 +105,9 @@ class MachineSettingsAction(MachineAction): @pyqtSlot(int) def setMachineExtruderCount(self, extruder_count): - extruder_manager = Application.getInstance().getExtruderManager() - - definition_changes_container = self._global_container_stack.definitionChanges - 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") - if extruder_count == previous_extruder_count: - return - - # reset all extruder number settings whose value is no longer valid - for setting_instance in self._global_container_stack.userChanges.findInstances(): - setting_key = setting_instance.definition.key - if not self._global_container_stack.getProperty(setting_key, "type") in ("extruder", "optional_extruder"): - continue - - old_value = int(self._global_container_stack.userChanges.getProperty(setting_key, "value")) - if old_value >= extruder_count: - self._global_container_stack.userChanges.removeInstance(setting_key) - Logger.log("d", "Reset [%s] because its old value [%s] is no longer valid ", setting_key, old_value) - - # Check to see if any objects are set to print with an extruder that will no longer exist - root_node = Application.getInstance().getController().getScene().getRoot() - for node in DepthFirstIterator(root_node): - if node.getMeshData(): - extruder_nr = node.callDecoration("getActiveExtruderPosition") - - if extruder_nr is not None and int(extruder_nr) > extruder_count - 1: - node.callDecoration("setActiveExtruder", extruder_manager.getExtruderStack(extruder_count - 1).getId()) - - definition_changes_container.setProperty("machine_extruder_count", "value", extruder_count) - - # Make sure one of the extruder stacks is active - extruder_manager.setActiveExtruderIndex(0) - - # Move settable_per_extruder values out of the global container - # After CURA-4482 this should not be the case anymore, but we still want to support older project files. - global_user_container = self._global_container_stack.getTop() - - if previous_extruder_count == 1: - extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - global_user_container = self._global_container_stack.getTop() - - for setting_instance in global_user_container.findInstances(): - setting_key = setting_instance.definition.key - settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") - - if settable_per_extruder: - limit_to_extruder = int(self._global_container_stack.getProperty(setting_key, "limit_to_extruder")) - extruder_stack = extruder_stacks[max(0, limit_to_extruder)] - extruder_stack.getTop().setProperty(setting_key, "value", global_user_container.getProperty(setting_key, "value")) - global_user_container.removeInstance(setting_key) - - self.forceUpdate() + # Note: this method was in this class before, but since it's quite generic and other plugins also need it + # it was moved to the machine manager instead. Now this method just calls the machine manager. + Application.getInstance().getMachineManager().setActiveMachineExtruderCount(extruder_count) @pyqtSlot() def forceUpdate(self): From 79e79dd84ced4d20ad86957b1fd659704d9d4063 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 19 Jan 2018 14:07:59 +0100 Subject: [PATCH 362/551] Only import profiles that match with the active machine CURA-4837 --- cura/Settings/CuraContainerRegistry.py | 28 ++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 4567226060..21ab8e16aa 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -211,6 +211,34 @@ class CuraContainerRegistry(ContainerRegistry): return { "status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "Failed to import profile from {0}: {1}", file_name, str(e))} if profile_or_list: + # Ensure it is always a list of profiles + if not isinstance(profile_or_list, list): + profile_or_list = [profile_or_list] + + # First check if this profile is suitable for this machine + global_profile = None + if len(profile_or_list) == 1: + global_profile = profile_or_list[0] + else: + for profile in profile_or_list: + if not profile.getMetaDataEntry("extruder"): + global_profile = profile + break + if not global_profile: + Logger.log("e", "Incorrect profile [%s]. Could not find global profile", file_name) + return { "status": "error", + "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "This profile {0} contains incorrect data, could not import it.", file_name)} + profile_definition = global_profile.getMetaDataEntry("definition") + expected_machine_definition = "fdmprinter" + if global_container_stack.getMetaDataEntry("has_machine_quality"): + expected_machine_definition = global_container_stack.getMetaDataEntry("quality_definition") + if not expected_machine_definition: + expected_machine_definition = global_container_stack.definition.getId() + if expected_machine_definition is not None and profile_definition is not None and profile_definition != expected_machine_definition: + Logger.log("e", "Profile [%s] is for machine [%s] but the current active machine is [%s]. Will not import the profile", file_name) + return { "status": "error", + "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "The machine defined in profile {0} doesn't match with your current machine, could not import it.", file_name)} + name_seed = os.path.splitext(os.path.basename(file_name))[0] new_name = self.uniqueName(name_seed) From e7a19bcce597f30bc0f569036f35fbc2063e0d3d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 19 Jan 2018 14:34:06 +0100 Subject: [PATCH 363/551] Fix has_machine_quality value parsing CURA-4837 --- 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 21ab8e16aa..add2512a2d 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -230,7 +230,7 @@ class CuraContainerRegistry(ContainerRegistry): "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "This profile {0} contains incorrect data, could not import it.", file_name)} profile_definition = global_profile.getMetaDataEntry("definition") expected_machine_definition = "fdmprinter" - if global_container_stack.getMetaDataEntry("has_machine_quality"): + if parseBool(global_container_stack.getMetaDataEntry("has_machine_quality", "False")): expected_machine_definition = global_container_stack.getMetaDataEntry("quality_definition") if not expected_machine_definition: expected_machine_definition = global_container_stack.definition.getId() From b92ebadfd03848b3071f7f7aa5bf4c867e85b7e2 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 19 Jan 2018 15:05:05 +0100 Subject: [PATCH 364/551] Fix quality_changes for single-extrusion machines CURA-4839 - Add newly created quality_changes container to ContainerRegistry - If an extruder is created by CuraContainerRegistry, in project loading, do not try to override extruder's quality changes. --- cura/Settings/CuraContainerRegistry.py | 5 ++- plugins/3MFReader/ThreeMFWorkspaceReader.py | 39 +++++++++++---------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index add2512a2d..7231fa1f72 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -562,8 +562,8 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.setQualityChangesById(quality_changes_id) else: # if we still cannot find a quality changes container for the extruder, create a new one - container_id = self.uniqueName(extruder_stack.getId() + "_user") container_name = machine.qualityChanges.getName() + container_id = self.uniqueName(extruder_stack.getId() + "_qc_" + container_name) extruder_quality_changes_container = InstanceContainer(container_id) extruder_quality_changes_container.setName(container_name) extruder_quality_changes_container.addMetaDataEntry("type", "quality_changes") @@ -572,6 +572,9 @@ class CuraContainerRegistry(ContainerRegistry): extruder_quality_changes_container.addMetaDataEntry("quality_type", machine.qualityChanges.getMetaDataEntry("quality_type")) extruder_quality_changes_container.setDefinition(machine.qualityChanges.getDefinition().getId()) + self.addContainer(extruder_quality_changes_container) + extruder_stack.qualityChanges = extruder_quality_changes_container + if not extruder_quality_changes_container: Logger.log("w", "Could not find quality_changes named [%s] for extruder [%s]", machine.qualityChanges.getName(), extruder_stack.getId()) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 913cea4f26..7c9d31c47a 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -703,6 +703,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): return # load extruder stack files + has_extruder_stack_files = len(extruder_stack_files) > 0 try: for extruder_stack_file in extruder_stack_files: container_id = self._stripFileToId(extruder_stack_file) @@ -946,26 +947,28 @@ class ThreeMFWorkspaceReader(WorkspaceReader): continue # Replace the quality/definition changes container if it's in one of the ExtruderStacks - for each_extruder_stack in extruder_stacks: - changes_container = None - if changes_container_type == "quality_changes": - changes_container = each_extruder_stack.qualityChanges - elif changes_container_type == "definition_changes": - changes_container = each_extruder_stack.definitionChanges - - # sanity checks - # NOTE: The following cases SHOULD NOT happen!!!! - if not changes_container: - Logger.log("e", "We try to get [%s] from the extruder stack [%s] but we got None instead!", - changes_container_type, each_extruder_stack.getId()) - - # NOTE: we can get an empty container here, but the IDs will not match, - # so this comparison is fine. - if self._id_mapping.get(changes_container.getId()) == new_id: + # Only apply the change if we have loaded extruder stacks from the project + if has_extruder_stack_files: + for each_extruder_stack in extruder_stacks: + changes_container = None if changes_container_type == "quality_changes": - each_extruder_stack.qualityChanges = each_changes_container + changes_container = each_extruder_stack.qualityChanges elif changes_container_type == "definition_changes": - each_extruder_stack.definitionChanges = each_changes_container + changes_container = each_extruder_stack.definitionChanges + + # sanity checks + # NOTE: The following cases SHOULD NOT happen!!!! + if not changes_container: + Logger.log("e", "We try to get [%s] from the extruder stack [%s] but we got None instead!", + changes_container_type, each_extruder_stack.getId()) + + # NOTE: we can get an empty container here, but the IDs will not match, + # so this comparison is fine. + if self._id_mapping.get(changes_container.getId()) == new_id: + if changes_container_type == "quality_changes": + each_extruder_stack.qualityChanges = each_changes_container + elif changes_container_type == "definition_changes": + each_extruder_stack.definitionChanges = each_changes_container if self._resolve_strategies["material"] == "new": # the actual material instance container can have an ID such as From b48edbab8e40eb247487a19c58613eca8012753a Mon Sep 17 00:00:00 2001 From: gordo3di Date: Fri, 19 Jan 2018 10:52:52 -0500 Subject: [PATCH 365/551] gMax 1.5+ Configurations gMax 1.5+ Single and Dual extruder configurations --- resources/definitions/desktop.ini | 5 ++ resources/definitions/gmax15plus.def.json | 53 +++++++++++++ .../definitions/gmax15plus_dual.def.json | 55 +++++++++++++ resources/extruders/desktop.ini | 5 ++ .../gmax15plus_dual_extruder_0.def.json | 28 +++++++ .../gmax15plus_dual_extruder_1.def.json | 30 ++++++++ resources/meshes/desktop.ini | 5 ++ ...gmax_1-5_xt-plus_s3d_full model_150707.stl | Bin 0 -> 1035784 bytes resources/quality/desktop.ini | 5 ++ resources/quality/gmax15plus/desktop.ini | 5 ++ .../gmax15plus_pla_dual_normal.inst.cfg | 72 ++++++++++++++++++ .../gmax15plus_pla_dual_thick.inst.cfg | 72 ++++++++++++++++++ .../gmax15plus_pla_dual_thin.inst.cfg | 72 ++++++++++++++++++ .../gmax15plus_pla_dual_very_thick.inst.cfg | 71 +++++++++++++++++ .../gmax15plus/gmax15plus_pla_normal.inst.cfg | 62 +++++++++++++++ .../gmax15plus/gmax15plus_pla_thick.inst.cfg | 60 +++++++++++++++ .../gmax15plus/gmax15plus_pla_thin.inst.cfg | 60 +++++++++++++++ .../gmax15plus_pla_very_thick.inst.cfg | 59 ++++++++++++++ resources/variants/desktop.ini | 5 ++ .../variants/gmax15plus_025_e3d.inst.cfg | 12 +++ resources/variants/gmax15plus_04_e3d.inst.cfg | 12 +++ resources/variants/gmax15plus_05_e3d.inst.cfg | 12 +++ .../variants/gmax15plus_05_jhead.inst.cfg | 12 +++ resources/variants/gmax15plus_06_e3d.inst.cfg | 12 +++ resources/variants/gmax15plus_08_e3d.inst.cfg | 12 +++ .../variants/gmax15plus_10_jhead.inst.cfg | 12 +++ .../variants/gmax15plus_dual_025_e3d.inst.cfg | 12 +++ .../variants/gmax15plus_dual_04_e3d.inst.cfg | 12 +++ .../variants/gmax15plus_dual_05_e3d.inst.cfg | 12 +++ .../gmax15plus_dual_05_jhead.inst.cfg | 12 +++ .../variants/gmax15plus_dual_06_e3d.inst.cfg | 12 +++ .../variants/gmax15plus_dual_08_e3d.inst.cfg | 12 +++ .../gmax15plus_dual_10_jhead.inst.cfg | 12 +++ 33 files changed, 892 insertions(+) create mode 100644 resources/definitions/desktop.ini create mode 100644 resources/definitions/gmax15plus.def.json create mode 100644 resources/definitions/gmax15plus_dual.def.json create mode 100644 resources/extruders/desktop.ini create mode 100644 resources/extruders/gmax15plus_dual_extruder_0.def.json create mode 100644 resources/extruders/gmax15plus_dual_extruder_1.def.json create mode 100644 resources/meshes/desktop.ini create mode 100644 resources/meshes/gmax_1-5_xt-plus_s3d_full model_150707.stl create mode 100644 resources/quality/desktop.ini create mode 100644 resources/quality/gmax15plus/desktop.ini create mode 100644 resources/quality/gmax15plus/gmax15plus_pla_dual_normal.inst.cfg create mode 100644 resources/quality/gmax15plus/gmax15plus_pla_dual_thick.inst.cfg create mode 100644 resources/quality/gmax15plus/gmax15plus_pla_dual_thin.inst.cfg create mode 100644 resources/quality/gmax15plus/gmax15plus_pla_dual_very_thick.inst.cfg create mode 100644 resources/quality/gmax15plus/gmax15plus_pla_normal.inst.cfg create mode 100644 resources/quality/gmax15plus/gmax15plus_pla_thick.inst.cfg create mode 100644 resources/quality/gmax15plus/gmax15plus_pla_thin.inst.cfg create mode 100644 resources/quality/gmax15plus/gmax15plus_pla_very_thick.inst.cfg create mode 100644 resources/variants/desktop.ini create mode 100644 resources/variants/gmax15plus_025_e3d.inst.cfg create mode 100644 resources/variants/gmax15plus_04_e3d.inst.cfg create mode 100644 resources/variants/gmax15plus_05_e3d.inst.cfg create mode 100644 resources/variants/gmax15plus_05_jhead.inst.cfg create mode 100644 resources/variants/gmax15plus_06_e3d.inst.cfg create mode 100644 resources/variants/gmax15plus_08_e3d.inst.cfg create mode 100644 resources/variants/gmax15plus_10_jhead.inst.cfg create mode 100644 resources/variants/gmax15plus_dual_025_e3d.inst.cfg create mode 100644 resources/variants/gmax15plus_dual_04_e3d.inst.cfg create mode 100644 resources/variants/gmax15plus_dual_05_e3d.inst.cfg create mode 100644 resources/variants/gmax15plus_dual_05_jhead.inst.cfg create mode 100644 resources/variants/gmax15plus_dual_06_e3d.inst.cfg create mode 100644 resources/variants/gmax15plus_dual_08_e3d.inst.cfg create mode 100644 resources/variants/gmax15plus_dual_10_jhead.inst.cfg diff --git a/resources/definitions/desktop.ini b/resources/definitions/desktop.ini new file mode 100644 index 0000000000..309dea2301 --- /dev/null +++ b/resources/definitions/desktop.ini @@ -0,0 +1,5 @@ +[.ShellClassInfo] +InfoTip=This folder is shared online. +IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe +IconIndex=16 + \ No newline at end of file diff --git a/resources/definitions/gmax15plus.def.json b/resources/definitions/gmax15plus.def.json new file mode 100644 index 0000000000..d651a86bb3 --- /dev/null +++ b/resources/definitions/gmax15plus.def.json @@ -0,0 +1,53 @@ +{ + "id": "gmax15plus", + "version": 2, + "name": "gMax 1.5 Plus", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "gcreate", + "manufacturer": "gcreate", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "gmax_1-5_xt-plus_s3d_full model_150707.stl", + "has_variants": true, + "variants_name": "Hotend", + "preferred_variant": "*0.5mm E3D (Default)*" + + + }, + + "overrides": { + "machine_extruder_count": { "default_value": 1 }, + "machine_name": { "default_value": "gMax 1.5 Plus" }, + "machine_heated_bed": { "default_value": false }, + "machine_width": { "default_value": 406 }, + "machine_depth": { "default_value": 406 }, + "machine_height": { "default_value": 533 }, + "machine_center_is_zero": { "default_value": false }, + "material_diameter": { "default_value": 1.75 }, + "machine_nozzle_size": { "default_value": 0.5 }, + "layer_height": { "default_value": 0.2 }, + "layer_height_0": { "default_value": 0.3 }, + "retraction_amount": { "default_value": 1 }, + "retraction_speed": { "default_value": 70}, + "adhesion_type": { "default_value": "skirt" }, + "gantry_height": { "default_value": 50 }, + "speed_print": { "default_value": 50 }, + "speed_travel": { "default_value": 70 }, + "machine_max_acceleration_x": { "default_value": 600 }, + "machine_max_acceleration_y": { "default_value": 600 }, + "machine_max_acceleration_z": { "default_value": 30 }, + "machine_max_acceleration_e": { "default_value": 10000 }, + "machine_max_jerk_xy": { "default_value": 8 }, + "machine_max_jerk_z": { "default_value": 0.4 }, + "machine_max_jerk_e": { "default_value": 5.0 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 ;Home X/Y/Z\nG29 ; Bed level\nM104 S{material_print_temperature} ; Preheat\nM109 S{material_print_temperature} ; Preheat\nG91 ;relative positioning\nG90 ;absolute positioning\nG1 Z25.0 F9000 ;raise nozzle 25mm\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." }, + "machine_end_gcode": { "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" }, + "material_print_temperature": { "default_value": 202 }, + "wall_thickness": { "default_value": 1 }, + "top_bottom_thickness": { "default_value": 1 }, + "bottom_thickness": { "default_value": 1 } + } +} diff --git a/resources/definitions/gmax15plus_dual.def.json b/resources/definitions/gmax15plus_dual.def.json new file mode 100644 index 0000000000..4e9a91e88d --- /dev/null +++ b/resources/definitions/gmax15plus_dual.def.json @@ -0,0 +1,55 @@ +{ + "id": "gmax15plus_dual", + "version": 2, + "name": "gMax 1.5 Plus Dual Extruder", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "GTL_180109", + "manufacturer": "gCreate", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "gmax_1-5_xt-plus_s3d_full model_150707.stl", + "has_variants": true, + "variants_name": "Hotend", + "preferred_variant": "*0.5mm E3D (Default)*", + "machine_extruder_trains": { + "0": "gmax15plus_dual_extruder_0", + "1": "gmax15plus_dual_extruder_1" + } + }, + + "overrides": { + "machine_name": { "default_value": "gMax 1.5 Plus Dual Extruder" }, + "machine_extruder_count": { "default_value": 2 }, + "machine_heated_bed": { "default_value": false }, + "machine_width": { "default_value": 406 }, + "machine_depth": { "default_value": 406 }, + "machine_height": { "default_value": 533 }, + "machine_center_is_zero": { "default_value": false }, + "material_diameter": { "default_value": 1.75 }, + "machine_nozzle_size": { "default_value": 0.5 }, + "layer_height": { "default_value": 0.2 }, + "layer_height_0": { "default_value": 0.3 }, + "retraction_amount": { "default_value": 1 }, + "retraction_speed": { "default_value": 70}, + "adhesion_type": { "default_value": "skirt" }, + "gantry_height": { "default_value": 50 }, + "speed_print": { "default_value": 50 }, + "speed_travel": { "default_value": 70 }, + "machine_max_acceleration_x": { "default_value": 600 }, + "machine_max_acceleration_y": { "default_value": 600 }, + "machine_max_acceleration_z": { "default_value": 30 }, + "machine_max_acceleration_e": { "default_value": 10000 }, + "machine_max_jerk_xy": { "default_value": 8 }, + "machine_max_jerk_z": { "default_value": 0.4 }, + "machine_max_jerk_e": { "default_value": 5.0 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 ;Home X/Y/Z\nG29 ; Bed level\nM104 S{material_print_temperature} T0 ; Preheat Left Extruder\nM104 S{material_print_temperature} T1 ; Preheat Right Extruder\nM109 S{material_print_temperature} T0 ; Preheat Left Extruder\nM109 S{material_print_temperature} T1 ; Preheat Right Extruder\nG91 ;relative positioning\nG90 ;absolute positioning\nM218 T1 X34.3 Y0; Set 2nd extruder offset. This can be changed later if needed\nG1 Z25.0 F9000 ;raise nozzle 25mm\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." }, + "machine_end_gcode": { "default_value": "M104 S0 T0;Left extruder off\nM104 S0 T1; Right extruder off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" }, + "material_print_temperature": { "default_value": 202 }, + "wall_thickness": { "default_value": 1 }, + "top_bottom_thickness": { "default_value": 1 }, + "bottom_thickness": { "default_value": 1 } + } +} diff --git a/resources/extruders/desktop.ini b/resources/extruders/desktop.ini new file mode 100644 index 0000000000..309dea2301 --- /dev/null +++ b/resources/extruders/desktop.ini @@ -0,0 +1,5 @@ +[.ShellClassInfo] +InfoTip=This folder is shared online. +IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe +IconIndex=16 + \ No newline at end of file diff --git a/resources/extruders/gmax15plus_dual_extruder_0.def.json b/resources/extruders/gmax15plus_dual_extruder_0.def.json new file mode 100644 index 0000000000..0037b75a1c --- /dev/null +++ b/resources/extruders/gmax15plus_dual_extruder_0.def.json @@ -0,0 +1,28 @@ +{ + "id": "gmax15plus_dual_extruder_0", + "version": 2, + "name": "Left Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "gmax15plus_dual", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + "machine_nozzle_size": { "default_value": 0.5 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": 40 }, + "machine_extruder_start_pos_y": { "value": 210 }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": 40 }, + "machine_extruder_end_pos_y": { "value": 210 } + + } +} diff --git a/resources/extruders/gmax15plus_dual_extruder_1.def.json b/resources/extruders/gmax15plus_dual_extruder_1.def.json new file mode 100644 index 0000000000..2db9aef3ee --- /dev/null +++ b/resources/extruders/gmax15plus_dual_extruder_1.def.json @@ -0,0 +1,30 @@ +{ + "id": "gmax15plus_dual_extruder_1", + "version": 2, + "name": "Right Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "gmax15plus_dual", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + "machine_nozzle_size": { "default_value": 0.5 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": 40 }, + "machine_extruder_start_pos_y": { "value": 210 }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": 40 }, + "machine_extruder_end_pos_y": { "value": 210 } + + } +} + + diff --git a/resources/meshes/desktop.ini b/resources/meshes/desktop.ini new file mode 100644 index 0000000000..309dea2301 --- /dev/null +++ b/resources/meshes/desktop.ini @@ -0,0 +1,5 @@ +[.ShellClassInfo] +InfoTip=This folder is shared online. +IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe +IconIndex=16 + \ No newline at end of file diff --git a/resources/meshes/gmax_1-5_xt-plus_s3d_full model_150707.stl b/resources/meshes/gmax_1-5_xt-plus_s3d_full model_150707.stl new file mode 100644 index 0000000000000000000000000000000000000000..d122b8ee185994fd385ec6b0495f75e5087643f7 GIT binary patch literal 1035784 zcmbrH3AkO;`Tv&;#4N}pN`F+%!M!q)bI4=}Ld`WMsCft?KhntICMZQK)YKT-sxiU6 zjXC#lui^88hde7+k@5ILEFOKR! z81z>b4gtjado?B~1x>V%el`HM3jq zTYg}f1oS?8tfyo0SwoXB=qVNs0mP}DjR{K8hI@7Fas$f`JU_c>YL9_c)k}MSnLQ-+ z>IDmj0Ai!Z8WXSqDQKd-H021SDW_iK)#CLAq&AjXI3+5L2VW3w zx(%$-cj#sLpLW)UN!Y#G&}@LX;gKzypKm}=iZdEJ(l~1{0=3T2i({H%yJ@k1`$G8>x zbRZ0RZwp%wXT(pgUF+`q9?uh$%6N6;+2xhjxasa)cYbfU>V4)Vx3T#Zy*m&Fy^V!K z`1FXg%iH!l`0f$AXmZ5;9D+8qdkKH9<|oPYOm48k%R>j0SK9p1*1^MjlvVEo z`?`(S`mWu9Fz9zI90G_1n=~dU6?^sYzjiM#3~RQ{?cKMmdS9MgOUFZNbs!9SnuSBy z@}u3$D}DD$>)-q42};FY9rE3d<*65Z(z?$|8<$n@4zt|Gl}D}BfiUP<77k%l7*YPs zK0j<*zek>+RP5E1FtB{beqGv*UvXer^>#c~v$6JC9SA41g+l;w{yvQfO2u9+`tHZ& zz01Sew(K#Yta=B1>NcK!a?K8eLBC+(5Ds1P<8tr2S8kiIQl6kx?A2{6^ezA6_QzUZ zUA%i)^`5Z)hu-hbShE9R&{tYGgp*h8Ti*Mw(QVg!o+l_3d(~t69_4*j-m~rKc?XnL z?~py+#&$ce*?}N*_ zz2=%72!lS}!XcD5T2$(~(}8VoACxC36?--MH_w!AShPvojdvVZR=qFY>o(4Lw`T{! zpwG8(2v1z{OzESMZ?%q`lP4$@dv(6`I`4k9W!s6?3#s1E7P^hw+k18(4Ek;hTVG49P_Q}&r+jMPeo4d>8vg+MwqmPm@U-8DC9SDP7-NGS&IClBQ1f^oHRyeU# z8r64T+u!Y}pn9)4#BJPrQO^#9LC>>r2tABgwO3<;Qn6Q8ANJnx9ey;p?GAgosopz( z<2GJCyJrW&px>}?2p|S**qESH?A23W^&Q@S^C4|JJwL6iddJLn8yB6`)5axknp>$_{-y z##tEjGz*8&)rfCxj`MBK$p>LW|&!uXSV5x#kL-Nv03MkK`i!kVOlD-|p8P+E@A}B>0?$z19J$EqscGbJ#g5?t% z$D3Y+K~GFrm)qBHmxAFN6Jv$Hvz1YGb%si^pzPpVXntqWdC>48k^O@7z zkL=#mHg@O9W!1aufo|i<_MROGgPvvK5WYKSdi!YyEo|L#r#wNa*sB@;zNLLl8^b+e zV>s2j-|24SSQ{H64Ep3`oVYB4Qn6R_E`6r`zLDeGR<)6(>b>m}w=vGfxCn#ZKN;^1 zyYiX#S)XpwcD#*VvjnALuXfyeQTvcl2ey56z=X2u{n0IMV`CeuBMf@0WZb?if>N

    4JZi?tg{Zm|P`h9#Xmn&*ySV1Tx#RhFW-oq^*pFFO6Zna~{*r_7;Ix%smd!8*ojv zkLZ;sYT>%1k@g-Ze3i+2=X8%Pw8&g*XZ?A)$CkI$5;e%yJ5vkSC5^Ou0Q${~>x2=l z;j_Xho~utiilg7WidwiXX{0>{ptBROjusO1^xP>19sqtvO>+-GiK3R$Nc(rrPzUW< z;ae(qnt_C?@DV-LD@9+bYl~XEE`CSaW3QYcg!ryXn$z8L5UtfKC74NWxx$>Hq86`< z-;wr+uzm&LUO{MIwH9gZisu@rmeSmT$Xjap#uDX<>s=8^;|f=gswtsb(LF`?p)mmN zc!5zocfvq4g8OB7WJ1^Wsg}~*FTE*NYzqW+v8|Xk?n4boLK*w?(&XkHlv&#*_Js)wyQj9j%i7ctbK4i zH;OyFp?y`)LOqUne6CtbYkM56gDmO0*^zVX{oba(x`>&l1AERy@;QYUnM~c(UJzM4j7&J=gjsaLu8A)pP+Y+`*S5!i@h^wq;Ve}Bh&Rb8a?9|8oV`)w#Dmlidwub zen;BhxyGq^#sFGN9i`~#C5}_8meM?vz}sE@e$J-|e~|A0T72qG$onX%mePDT?pf;m zEA}{O;j|~y9xj@bn(d{BRy3m1y)3*HmD5kNeLrjjA-*B~5+8p=vA%*9-T`T(z3fV4 zBHQx}HHUj-SX@KuW0J)(5Z^6o;ku;V2I9LC%cx;J$GDGe6h^{qm3%y?L{SUZC5<%b zXlzhRF9YjX_y$pn_y*G&B`eldOKEyCz5-M{WZR*M)>-f1y=rbFFWh#aMXN?FrIB_I zIgBQ<@8>%1dORZz|cziA^kxHtiG}3q#w@unj@E5NRifIQ z)pLtkrY!)q{P~2so%Xd^OvbznoEy$|5VP*J7HRE@#s*evab46krP+%5>NA-+U?(qv zu%1QwaP5i0XnW_ddM^CIlhK|&>X!nIE4c^28I88aJ?$Ye8l~@p5hQz2AElD8HSXyS zvDCtKNh9r}RGneU9i{Lkm+iTYGqV;PE8L`Q&-PrV7OqPgX&CeiA*|rBQ!rp1aYKzjX=Eyny{Z;Z*8t7)G&}++qq}T>QIv3w0j=LncZBku zQ|H{NR#dyvQL)!3{ko)HIO756Ir(n9uay`;)H^GUG@gk2?K;Ox+YG&1eG2iqJJnKJ z+Zgl6tPa`=>2!x-)DMf>K>WSLoR9|@1&7-KT*C9)^H49k(5wgp=C1?qOvRT zE88QUT1s=2k;Y_X%@5z8jr-HRs?i!~D-rou*80GPX{A0DqXzihqXsgfucg-q|D2;c z?7hO#o$tdEPR?paTY~kqs--kNOZW6;-m4Mly=;G%G`47KhSTVv@7y9|&RWJ0A<>+u z?ZV1pxfVylSO>?Eu&;^JwaBW)F)nk3XXUw)@8`98Esn{t29Kj~-+M<1)lyn*C&_=; z-QCLWyWa@^(^EAMSiOAVoY{U>PV?X1wltn0(n)e@N*vsK_mXNUjWq59S2DtS0}#yv z{45zJgui>Jgm5prb&a-~{IBMlp#E8PPk@9D!nPU+dASpUOXTfPT`YAK!j57^Ub zr*GM(^+3tu{WO24dXnG-;s_9)lwR1(6~~(!i^pz$`5-3 zlnnL;UP?l_vfcoz=u}H-`lVhHPe|Y3Y2ke|eb`{$-I$4C-R?C&|KUclNB1j-Hj} zDm<%N)l!N1);&rKoyyLCW27bq#^RKD4arR#S{!mJw6*Y8(}zC*!Eddo_u@ z+ALOBH?8!`sL^R07U}rTwFO|y(Cf?1JNY}(p{4$>@3INDCoQxe{N39UX!>7MX?klf zYp>8+)*sewcgr+#>#ZpD!#gjjmeNS$Svj#Xv>~8YhkC-dhFZi@vj6r!%HF@%!G3A$ z^J*Z9TF41$q(O(>zjLC*5?5KZRd!vJC0+@?hdr0mT)iVL9JO#=(nx0|(P}O3MQaXg z7qpmWjVf@q3aeQPhGB z(nuSf$T#|0ep$!pj^E{367dGTBr2g=O7nZY$7JMdcr8a0=8ODtwY3K5WwiH+=6Ka= zU!*igEbhrfE%ixT*hmreU~xzz?Ns+Q8)cSS41Y8gpIEKHxMKIxcHEu|T)^{AS7WVLmnZnHGdr$Q;g?|5!r zN|Y#SDUGz3#Lv=xup9r^U6R>gi+aHJ8+PLN+=gkUEkjX@Ht;*rMhD%zMyZ7K|6}aj zt-_I_ zPMk|p3C%%>aXBK_;%K_L<+opJz1QdcTJO)9@8fs=sQvh?_1tUk{oe1r*WT}av9=vH znkFDIEsNJ;(%yh}@MPE@v@sw&3mf&Rmq8=Q3~MpX{$mtvkIPD0AMRP=a+8)bE-P(C zx5dOaXtzj<`z7wL&`KqJ?YP-b$$N(!B5dVjVa<7(U@erD(N=Du9lU#B4_FHRZf5XR zt>nF1zR$1ay@Qs$QHV+3!Bvka@q8fgcA6H`2;+CeBrC~nE<;KeaiQF~HQ-i4PQMW1 z*>HXdYw=U#=M?5k;?iA@-r(mQ#X8E}QUzb#Ql)I@jby^SFtq31Mr$I{T9zvF=d?G#JFb6O8J}Bjtv#3eO0AM< zdZRge9 zf!P+L-OP(4Sc_?djV2(Z%6#hchVQ+kOQ%Og%fiSX!k%C)rp*giBJ_ju%+U{WN~ZOy z5gQn7`Ba5|PzdycX)P;h{Eo1W)%XcoN-%1$lwf3PVI57R36zOxAzq^q)^RPLvBmRk zJR8BY6#k4Y)?%9H=c0(d8^|mUQib^)Zq>N8bKeazti`iKJRjud;WF03!Mn4!7OjE3 zwK+dAgC`$m?lP>!G{Pt=^%Fzs3IU2|4G>12P`Vb*%^Em@wd@&KO!@@Fcu)w8AX#GL zGrXy0Ly0g-6#}Eww3a<{8>{8L=NW64P$ukOd!HIP*1xRt!kM;~FR$Ir*n0qpz1tQ> ziR2Tk#k9R?`GmDHkXRdK;ihe{7Sq;tsSWb4GEA7~guV~ICpMT!YvFkyUh~Mb=lnK) zf?*tzoAJV^8Z8kBYp-BKTOS*-peG-j5KL+v{W;b#plB zmbI9+eg!dw*{GXOlYBhYYVX|FaNIQ9&|bf|9$U0p!mxpG6qVnk#H_vc&ajq!)dg)| zd-cxZ*?XKQHg4Z`M5gg)jkmhbTXnYL;^e7s)!}#8!0%DSL|O~az-WX)N73EC*Ds35 zxqU@M`Pdge7A@IZYavFr>@VwU043DuIwKBn|CCP zd>|Y}ZxO*-wh9HbeM?6;ibjlXC%xJZ;oL!+ryg0nrq1T6*Nl2c!mxpGiU{j^P$r@k z&r=H>&r>5TyU*l#VD}lnYgQAnn$BvXt|aF(&zu&$sr+vG^}D5)?j)(g3Yx-KcaZ0d zFZuW#`N&_to7O^}j7C`30r1+|(z2iBJ(rayNB$`9Homyyci7MsDZI8eN@*cpqY>7x z`n*y$TeDf>k~OqFHj6!39UH>1p(|yXh)9cRgkeKhtijZxgCq#?GY}n_|6}hjfihP(wPZbFPgEt zeIQ}l*^a`k?9#$@3};T-eDszl{!?dO@%#ZA#`8c}Zhp@Zti`m=Un8a{dgu(jGi>hu znGD`q#D(|SR+!@Lvb7ZY4l==7O!NC6MHjxIC-z<$X1r_!vHK7Isk4zqMVI#_4BH61 z6Jq7-E1oSROxySaF@-t4jNUrke8>KoiVyX6w_$s(k$b8^qcyO#AKEf7Ve7>pVH#o3 zh{^AxN6!g~tn113uVKG?-0$joA6kD^6Q#76Mp)Ml@|l2mYax-hbKv*#-pOhjdYi*u zWI7WtN@+2Tu&%|SHL2Cn%B^ApYr$*p-JQ@_&t0L&FEdfJNz&#lillc zc?T!m{;u5h3u5Av8b(YAhnqtBC^2fwu<%vpbE%1tFpV&1#3Vakq-9t?@QU0wFT6S2 z8gMJ&3D&aNY|u7;t?!^)7f!uFX@T|`vKGVjA4XtZcv=f-M=yil5!RI)RCh~I6Csh+ z+;M%C-GFgD)>Yn2SgkfKrV-Zl)M0;ZHT+#EtFUhq<&M^pTO4kQq^xoTYuUOb(6(+# z+g<88d!pxr4XlW@-V&?Ttrykx?Y!TawV1X(Sl8C_nmh9iWThO96OvX5>qXs~JJMp> zyboP-_ZK?T39S!GQCb;pKe$!GjR?{*;1no(9@5IBXvCzg&sV<*XRwC9mq(nL`v!^H zZeJIt{=7!QC_{v!hzZuRuM7G{{g``i!d>wfww6?_Z8tEt4jH{cL3|tSAK%q5Y#s{~C)kQT^%%~5T&8vbCKMn2R}rc@5-v{xUba}*hXN@w)M^;iEFsfaXr>m z-v2&BZ>V^B*>D-9qW)lnWnZ(bCgOL5qo_H~e++;71%kEgi;|6mkq;fKP1>P_oEQF8 zSO;L=`^OG@zs|nuUUr&>VFTePVuH1pw)FvsDT*#zp||P|tL>d(e~>*S_MAMyT1>P5 z=;~Dow{TXM(4JfE$=~yn)3g0+}7 z|4MDpezgq8W#eVc+}H?NXK`rkEHgz&uV}?HUY08SuBlpiirz=x<>F&<`_D1UG47MK z((g_=Da;zgchl?a2NP*6#A`Idpu_lMs@^ny;nvforN(=JHr)1@pwF;9Cfa{YzFmnO zHl3c^V*&}MH%mfWQ1UgH)Myp8ep|dLpgGG{QPxa>=uL8|}5>o;CYk zBcr0ty4D%*wyosR_nZk^*8>UDJPLC=EpqD_V1qq9_5kHJb7`+8(s~B?gSMUlw5?}A zIE+}H)%y*Q4_k$TRIwJ*o?tDexgCq5(5p$R&=1-dCG>YZBgiv_o?tDec}y*LLC7=5 zNmDkC5)YDl1M*8F_I-Sh6SVN0jYe4e51PesJ&ySa;)S_BiqEo0Yaw3rSLREo5BKo! zmXeR>A0C?92Py9ajUaer5k(DuQDV!iK(N-4pUL}SZxrn58`b)!=CW38J*`#4Gv{80 zd!H!!H4&`EHJt0TJ3ldFYtmrdRt3VJ<9S9;uolzoKSt57hV+%PdiBA=+?gC0#Wm8L zE{_ePsQ+LkUYuDdGs0*;FsI97K+q^Foe}OlLT}F={vtd89S_1c;2Bz;xpg;m%ZxDM zQZFN+d7LOSMb+>!Ft^11Adgab^x_HDVw(L&sqGoqfTv%0^eK`U0K6(;jG0p&(Ha9+Z7`^YYz~< zZP&j28_5&mMHu-|8+`XNYcY*5@}avR=v=i-?Z?Fu7kbXx&wGd#dP{_1LwinMv+cB) z4q@2P-kHzxZm2I233~d5`${EVcp3N|Hq-+!0)9za3-KC_uzE6l9sr&oBzRI4lln@$ zn9JfP>(2v7YcY+m&QrVd8OEF}HZWc)?AS+a$Ve#sj(p_CQBtqM+3MA4EyQay!a9!P z)2yQ2CyEW3TZ+p{=B&c+u%UBHd}5ZBm1!YfqY>5_FJ8G^Sl3PB!aOyeKeXie)6?|r z6>Bk#FlhY}$9rEwd>+HNw_9X!0A+HOCDB)Q2g%|giIwtc> z;dkUi$5HO)lav;ov(X6a*qQh0TkC^w*w%jF>$J5o`lULIKja+@H^0}g7SqDO>x zr_W_lzP6*}3G4I`Mm}_B7!$0;G?$@Y%gJqcVbO77L%z_2Fl^{|96AXh!&*#pn;%7d zI;Hi4@bt=G)V>cRQ|kwH29k-i7M_982mise1W zmmjA^Jtty<4ebZX_o?AJ%B=yn68=nCrxo{{R@+flTH9%TVvTuTI17bq2G!Fgn?#dNs&olb6HEvBu7(~~24Z#et4c2g|8NxLalJxksj&RR@6 zKRBWjNy9!b^?fiGR=)Bisk<`E75hFqN5({23(whTgmsRLPF2Z(FiGN_6?uCR-*1rC zVj5vx=@e$q&Fd=xk(0z;4Mx8lQ|gY~lorzn>)6@d;~of;m`^3M!xU3kEkgIWr?r?y zSZAHx3HEz*RCb)g{Z6Xt_#Wcc+4Ze}h z#sHY*;6Bk>SM3LBJXpe7Oxq|!=S!$w)g;fnbFMDot8Vhlaq21Gd2e;sw2*d;2dswb zH(|cP-brXYz%jY=!ow*A$*3Vs%d-jJp#9Dl>(z9%i1xd>hDG}lUBf~>PR4o`(IW4~ zdLs2?!q*IWKk)s-#s;Wyu5{yZo7O}l@ckpLg|r)uus#nuZCX-=`YNfSQHuEwI%07I zYsEdM5nQwnMd_C=?Q>LwhqzwB@tyJ4J!@%|&6 z5VHcoT1+F16e6auR&DC1GG}?pKBF>)mAi@k7l)+Mv+Y$bVd`^R%{(3sJ)D`){#+@m ze-D4Nq~Obgq!ee}G`VhC%|Y^P#vO2V9ezhl_&thljfuNQyjhagf(@e)1|3C(f6(tZ zZ9-qQ;_(9{t|?P5u3PxK1H|6??H5THHV}@YQ~spH!0_dVwU|a2HV{)pf8nH%_yo;LFLx5H@n8H+!mxpG=m%q>dmvbgX@p?|G0CZ?l8R5Kf36!!0qa#WcdOftbQx{ZCtojd%VuD3kq3pGWk_#dVeQ^r=;3 zGz=REN71<-D>3NoK^fL!8e!N#OrgE%bfrA=rN>OjRE*VU`%~+S>Za|h&wTw?<0K3l z2z!FHm_`^j5K|O=GN(e?_6e;n$&~H1tCZESwines_O7;H>FlXE8W)`o#?|B zYcY*5Y-_6MoV(oaO!XPQ5iR&4wx3gb942hPt7#!6MkB1A%!AoNsaMM{>?=JEtV_Q{ ztpT?Zp~qo@wL-6!qp63J=OH!_YAUzmLR;%|&VGqWOv_5tV#4oX)_MOcr7daRc|vAQ zXKhQ$8pqXfYrw69Cs>PVgkcXcg|kIQ?jZTN=l8>;6-92*zH)ELy=WADT&~2|1BXfP zjJVLJq762h+v6xIi}%Fs8TP~tZQfSu>x5%3sblYjy&6xj7SjmBHe!mR9cwD2Z6CPj zCDJ=1CFr-gb>>#v6RgF(zU$|s(F5L+^@(@=^Xg2&3o9hI<6jw9S36>byeqW}H4NJb zhut+quolw@BOizq<*?3@jR?RV40|JmTTCt92mwjD*EEp1f;{e3SUlqnk?w~4(&z3QQ@TE96O zh7E*0!CFisjIwGBF=-jW2L8;OxPQTep&d+o6bs{b=q0=2O#=TTO~Z!zC8I(g3vNT` zbK#L8z3|mqHrKv((vz1;7{4PNzJG*17Q~C8&t)y9*|!U)Q&xm^SK+T^STzDqA8}y} zFy(6i2QZIQdjr!C&!vX7nD)KezQ_Mo%Ifaj zCuQJ~Azt`u{1)-s6-5u9qQsNCO_I0P-ZiG#w~L}x6LyfgTi0t?2BU4*7#qgnT>H3I zhIM4)m1y02nACQwqfGO-J?z1HwDiD znW4{U+dg3F_)wR$b&eV@kuYo^97R3aE79rPGef;fw3tR1`9Ms;-)&VUZ&a(p_RSRj zNxjsuBd)At?-jqxa|*wQlL}*^%i;Sv4>?W4hWfjxfmR!>j`G;a>Mm^PIEv4K0|n5@ydJikL`iAzt_ie(by{c&)H8?T!_0%k_KInnB;m?1!Wz%yM*@rqAI0g_GReNfZ^u#Os5< zD@kiHjWFmaI{c7*B_H4JT_&w4${p=1*9@*PQS@v(CF=JolbVRQP=C+{8_n%;6kQwY zEXwMDP=}E!v(9yiQycEI2z3@jhog3unrJmHO(Q1M&?vg`T-^mxSvOp2I|#f7?7bk2 z-_?_Odz2D$mkbwg32{M!cg1LaZ=&d|qkk)YVv9XO3pY&Ll7{+mb?oV}2N*@)Wt3@!O!K%s ztoRKlWg#CpE6jQ_jIitk8jM)1SJRQ#o-y%GAktb$yU_^is0i`vU)B+JE)KN(ILh?l z1F;s{vvYCO#{77d#nv$`UZ@zREx?4GXNI(ETLPa7zf0W>zemx$m}oJ!#S3XIq}^zQ z%_Gxv!QW;7gL^XW;gVc{U@fNEUx}iAVFnf4g<(b&GZV0m83>-!PV_O+AJMJ=h#REd8zcG#vmJH6Awu#K=MSc_?dQC3RacD3$HofvYS9sZcu zn9@0nAZI)(T4lFr7&Z`&qQBj!#HO(8m$jHi7&Z`7XsP3U+b4$AdS%DW6dP+^zPzr> z><2|_b>jpH!v?~hU@fK*h7H6NMGu^&>)ZEPF+5W^`eCv0>hWRj^_f|sRklgPl8+Gf z1Zy#kFl->EC^~1r74po_T{@K&*ztTLler!V>en&p=dlX$zqQnWO%_&K1Azq^q1|3Bu2c0iAKE7#XN#)UMV_P#H zFMfv&{O$?1o~F%S6rJ#t?jO7lBbSYjOI-Vexr~OR9+%u!hWUMjVFO`Luolw@!v_lbdhjlu-V{EDjNzUZ#0| zE{wd!wv*>^LPPihH1Z)SlcN?~T35e(rsQ_og3BZwt@H@r8qF1tl-MBN^$ z!|%ukeoql8EyQay!l0w*v8yhSeC)elRW;%@Nx}YFUyrym*r1p^k=9}wVbD=DxS&jI zbUGr8Ry(LKQrdoEUFm#ngI8P>MvdWjIX)VNSG{Qnhd+(#?+zmLe zEaUn+eri+~B1iDEWt#g(nVFD$gt?5GsGoXXJM?>^t}yOP4m#>#2_sbqdxEu?Mi@Cq zOz2^K&xyDov0ilSuo<~<(*)u&Ev6C1@33Ki*^I@DUbwNZ=E=f{NqcA0N9tIMX@p@z ziN%{oNLkJM@rx2}k+~h@7CefWNNXWpwCCJDM$wEvUnVy0+V>XMQkT9F*W>LQ>JUag zq7e23YjHb|FzjjDUfNar!E5iV=vhBcC3Bznrp|h`xh=k}!|$+x-=nBYO#J4)K*T+# zX(3*tB^+p!ZQ>_d4=F@U|F+ZaOE{){0@h8-;3_!I9r&&lwpA<^2D8-M6%!VxqQPSePTdir6uR>}(VyWBFc zhm7A*R@yQ!k=8=I(DFWY_@ej%$_w*w4eid8xTbUtb$8skQliHlr(xJYILyOsTP;Lo zn1^F6rV)lc#1utC&z>mx`2OA@CEPM_P4sOE6KO5Pix$V%-Ht2ziH#rY56bXpf<1lw zj(q6&gNd{jY(UG84Y*!ei!A*F_cGLXCHgYAPg+b{earPYk`J&}GsZvsbgnMlJbzg( zjNhS`v~VDhL(@V&j7Av0N738s`iPA`k7}3UnF;n2@H=ACxeO-KT8LM)$omN2yoQ&E zjgE&OT~qm)`t5^1n&tX){0Q?(cbp@mBGeL$Ytl6A>8R+@mP4eh7H{681~Ye%V1}-8w!Ygf?wIA~ z{i2A8v=-9{gAO|md-N9@JvX-vHOdH4xOwq-ogD)`xm$@fnbF z@c`nvMQcUzySBTIV69x=?)`@-Iua-Qp}h|4GBE3mxG*2hZz{jRQFO(FO1vA^Wv~|0 zJbxWUr~jfW0l!{ToWW=tHZUgVnP#4W4r^<-E3seLpUPTHyK#H8&td1t^Z2p#`_(*3 z<+)xzzsm$`F^w>uhmLFcE>rH+D!RNbT4RT;s6$wv(~3|_m|!iYtw+^<@b%cg+9&u| z9G7X?jIcZ>nL{>W-$1Yy(`-A8QXkR18SD2LmC4qQmh|=?z59~dgGWm~hECKlY#{6j z)?ylAloet^jk3S6>gDoFMS_#|vyYxG_ACrSPvAFw_ztYaG{Q(#9+7ES*Iy*KV<0=b zQ0!S4ME>0ati?3KNL3zDlbzeHG?(5DUF955Nl6IjeowLiABeP=Mws)FcuUct)nY?# zi3nk6$sLe!SZ|MD{|W?aAtgp5oV!6%-VY?ttmD2COVtkH?i%|YVbOC0;$khP_2!dJ z!*qpE>7Zd5)Dol$^{4RqQBtDaZr3n=M>wpzB7(J;=K3b7%HUu5i_2Zo8<(`CBo62D z;RskaEz1+06T+GgzVn48r6;YBXD+w4u)T=yd`W9ry!ahqz4Ils43a9`i)<3P7kTX} zv4MSlwIK{bclU?e(u4@NrPV-!d_cmq+1C4OL#k>}PPmE2>J_ZpbC%r3wMSD$x1VOx zT9$UJFMZ!LcJqtvt(Y#5EOy@SadS$5hgc|WB62w{}M`ppGP z@H@iRGI)Zu5UD-#^^sV~dg>yJq zi|Ht$Q@JEn78lb9<99v9`Cj9-2!^4XBZDIo_g0L3TVSGMHiIq!+OR6j`rV+;P zdbSAN3s93?^S#)>X(X)0bU4ARgMJyE5Ila?Vj5xC&@)nwkKe(k!;`dnCAFc|lk%K@ zShstwUTH1aJto2pbD1cmm8(nPcZ5Ml(aP4k3aK%yTf)o)tYgliyk?B#si233@jJqP z-4bgt&2t>G`%K<*>^`d)HBxMBTNc{dwIjsF9U&zM!v?~hU@fK*Mm`XetV0$XsPXom z<1MltS>D=I@0|2%X)VNSG{X8uwfl$eiEF>ts7&oY9+ziO6Z((R!H-Fa&I_Ie!pH~0 zQN#pmF^w>6ASS=V&BfL7QPG+{Bxr>&Y)CkowWschTl{p`MMqjpv+W3kyn`SrMxP_) z-Z8|>9uj*_e*G0|F^w?tftc_VlG3#nSz5K&vyfY-|EHH>ZM$jN^RSro7Nxu5{-Z3^ zdagh4&OmhC6x!X`pF=pz*b%{6Omlsc_e0hc;r+;-F-yvQLU<2qH_epiF(bSy2;+Gm zEboU9Sl7o|Oe2gGBBm&+h*Q-EzBPGE*(FOw3%w}9u%UhJ3GvOOPldjgwV1XZRsAcz z%hbgc>>(v`2V`tp!nsu8E>nvO5~iJP_sp5FR7oH1Y;Y|}YjLU&Ru5oyR(HPa-!u4d zD`!iYR0Lm*-y(jyqG;ndCC)uL5cIA&I>ZDUh)Hftm!1=MHJbM#9&7AVq4t?4qy8>= zWI3POv=Fb+2y5N_{H{W=@y=O&GtsV3NIuG!hxTLR9DU|6Af_lkBZTq0 zo@^A(Ldp@W#WedXVUOYh-MjS3uP%{R6xPwc*3NraN_1jh4dZu&J;7S8b*A=M+C+Kg z2wA;Ct+u*^x68s>+r#_e2v|2QNqgiLle9i!1MhiS%i{H(emYgq zf=6#@M{T#TdirSs)=i6Pg!PTuv~i-eqPP5JLI$O4<<2c9x2Ur3P6+JOV=boLbHe_v z8axa9ac^LKhV)mi{|I`HK&ng&X}2B+Vf-#J=boUA)uaW8+Y-^Db|s%M8)-VRK{w>p z)PM1Vyaza`jJ-+rGUe<~$w#<_PrO&yfX~S^!uVa!Jfrj5YwExLQEcF3Mb=_E?8qIZ zt6t`ZFDFim=@5nuJ)@CMm9Hsp_(^QwyhqqGEw&w2cgOQ^qu(u-RGAjj2;+A>Ig;-Z zVoCW+KZ`w_B8M;tJyDMD5^`D;FWbWtw7;;*yU+d-my8s7w8f(^QxE@#_nowuMi|dr z$DDNcSq-PE@!suX4=2R>e1ubI<(U_r*RCe5g?N!${Eo1mLi^D2iPDOma@>RrJbjc2 z#sGz_#)#Hlp&djRzat#hUwx~@((u-@7SlXtpp0WyjmFM4mc{#FqgQ*Qj0#_>;}I_; zOs7ZNIU+Y}U~@9at%Z>fo0CZhd+#7IztqAxI^x?;-OSzP2TJ+i##8(b8~Oy9Xh>-x zUTEQWg!R5uKE;DacdpkbU&5dJ;k0OMh?rnQ$AjU7Sb65pPM=g$KXap4Kj+UKmT-^E zJ#{$q>>VXa1HoEMBaECQrm))Zy;f2ae>Y-K2D56AV7@K;osQ^M&DJn}N7xgr#Wc^) zg)vUOo&j;rZkI?+L|mw&JWAowizir%YdF_w@yH|}@W_xVOD~U1dBhs-qPwe52zY(0 z#Wd$H?4pb3+r$0NGB&`ILJw&*5q*gt75yBKCg8oYmU-mTzs6p;_O+oVW>DV;g;@ix zaoqZF4fVHYr?srU`u2)F0DGT#&dT0%l%bBcvA4wDLVnNFH0){15cWF@f&I?#kP%nc z;5)<9hn9>JXv`q{opS_hG3|WqD4Yr`@5kTEuBc(3lWREFe0QIhyirIM-UFuDM~x!8 z83J?5AT+y+a)Fqr8h~Hr&ckW=0NNXWpqY>6~2gy&&aQ!jg5a-aFH>fuWke`@wTCvw> zH4!$ntoZ!)!oO~iGQqiXl?Shva>JSJ2qPc)=eM&K(+IiZHePMfXl^}fU_ ztwH!5HuMx)K2tWWg|r)uu(l<1tCe_`kidg1IO`XQ7bl&v#~DR@cV=3PX@vEhRGKx& zn3sWPYjX>DYBrmoPcYPy7f{>F!wv=3V%j_zttECMDcW7++;Uj?%6}vuXhmI#prw}n z1MO~Fi)nD5+qF9 zXj^+6zNdlPrNXzqk~)UF84yNU<=@l5T1<007Urq{Q!Gyq_r!6JGi}~S5-(2g^nH{O zxQ`{Rh4PVJEzk(-*`IV*N(uKk5w$A_C(oQu&1Nm85rz%zqi9^4vC*iU_#KbQkrHc5 za%Y%Iy;?k`UB*VdriFNoPV(VSh>gE(;>=a^$Z(pfd1U!#%CeTtA%eEKMLoTh=47N- zLz$or=bFJa#?8q{O+)gh@hP-i6Qd8+50d8`!pKMNnM-ZQ zGiNQP5l)^t-MSzx93*JT$_~;t5#9^8eEz15v=-9{tM9|7G=nfn?dR`F+Tks6Oma)5 z*%6J4HC}v! z@;3M`h_n{sl~e^9Vf}(dHeP6o!0FFsLr;P>0;f$|K17RCl2<}H9Ta|3ip4Q9}O+@ob~<>^1`drT1+FXHuxqQ?kDPR{ZdL4Z4|)tkLt9Rm5;q?TDp{~YW9{a?PA0ES4^a}U;|#5m5AD)wnS0|El8~W0KutsZAo=n zi)phLZqAC=Y~z+OZmG?ulH0Oe+fMgwSEscQFM0s;yY#Lt^4l}k>dUAxoC45(WS_?Lyh2OQ@!d=f1t&Pg?oCWv#>r z^YCRf9u;*TGT)`j#!jGpK7yy8LF;qnX@Q7Grlyt4c|0P+@8a)Ds^IUk*T*wZJTsLL z@OPaSd6xDiMg84nFY3O#@4j2{0$OUM1T8Y^nAIh2!NaLyM5MKtMp$bi%_nBq=d?LQ zj0bFPQO5>MuolzoqlTTuALw_^p5Y{DuGN-8^v?VixHqb2S_^5nHwt0(GN|=&qdT-+ zC@XmPR*3PjItKfY&&@R@tLxFhcjh4F81!(>ksRx2fkT?_dKlr3^!XRV*sYvcGx8}N=Gb{ zJBJessW!NNiRzde6-lp#97^w%qEW}RSEJRRGNK0|Bl>uKDn=--hnua@DtNuJH-S#Ec~TE=P7%qGueM$wpMdVb>C16K5` zJ^8^pSYI;#o4VRlAFRW(={+KZ!|w>=_i)})Osw835GgID5e6NeV1=F|eD!@-XDY70 zK;ru1*s$iR+l6AUJNBZ7Fl--x(K*XGSA{vtkan{^?gmZ!(D57UIJKca->$@G*)V6B(qbB6 z&{1@Dd}GL%k>Q-8ht$UWBRA9)zN9wVeh^OU3BMyB_&pFE^j4Bx%HJ$WYaw2v5e6Ma zx4fa}a$eNoJ0VO``L)LT>Gbu^o+r{;Od||hzP`#^i|@7NLk^a*k~IZW+DY26S^&Qz zANgwyqLdcmH5y@EYhb4cHXqxfXF+dG`;2fpgnJ*|JNRroYw*>m7VfQO8ey>)VhUr< zzv!(bKb;qDCD}Sg(%a|LP#dm1SG4B7q+#Sk!tNdu)?ylA*pQf_bEc_h`NQP-QcEB~ zZQ$q3wI`g{cbgKgUprrFiPZ*ZF^#a+lA4ivBI)ohJ7@3&A;FVsY&}!*G<0A%DTJPX zI8SDT5U0+|s1Z(llU}^(v8ZMi&-4U$i z?+gP2Vsy`UU8-2i-(;p%vY9`fGT9NV)Adsp+5HorbJ9w$*;X5$x7n-6 zNr)&dP#Zc!4}GNSrTz9=#Dvp|X`Rb}K2kMvw@;e10WHg)tqWHhuO0S!u4NDj#cQRY zbK%fWzvm!W%WUZCHW0|iXU83oD=S$+7e52UYtKgKca50)+7L%Lt@!!tteO!s?!C2} zv(8#^9n+aRBeqW)kgFwCU@nj87G5**mY_2aP!TguPv=Sj*ZKT~#bb!t=oYTvn`QEu5~vHsXnII=ED^ zmbH(%${PgoaqKVGxKy#0wbZ)y+-%J0a-%CN*0Oe9SHv3;`Y89zomSjm>3&WlLO+;$ z&-IyW-v=%06LpuV5r?*Wz}awGaqp~qUqRp<{O?mQyPR9^3@!5jbVsh)2tI==UDh)H zL3jOvKvr*}8hD`eWYDsHUiU6R|EFMM^+5;bdS^Tj)=E48tX$T=Z07X~>r&4{{Zj0rGA~n} zY>sF?b!%6y?M^H9oOP@Q1f@Is`#rjuhYSf5=3nbxG9!L`In^?7ys_u3qdQGjHq+y; z3!Y;eF5Y;|psR6>kpD@-goSyXe!PFF2|~2u-EpL04 z3Dz2XRVyKu@AGRSV59tljbc5W5{?Oa_|u%kx~DsZgDw9Rxmfd?GsYTS`PgBL#neJCqAgRjFIq%xyUElUQ*AlhSloobvmAAX87fK|b zV2Q;GqVSPfO%U_LTU-9&pG1OM!l$)ZOvzhoId@u2yZs+1DYOhFp>&zxHT%5x1o}$g zf41&vJ^d#CJ$FQWMh>*>_y4=BtfWC$I3dusUp{kVk=<;I+Q7BMZo0aJ;>LMmsi_g`AeiVHlh(+@*EoOqX`1C9#(Br&5 z`rs-@&*0>rwb~9diC&U8~hWbGve*Ew>{;= zcV+Tx32Rx{PHzSCzX@pZ38-oT^$H=DaJ+UGHs1lNHdxXW!FRZM0um7UdAw_4HGhb2t-+h{?c|M>K?k}8%k!DlzB1#5SiU@g8c zSBW2jjpxSvzL+IU_;VnYiQ9I%sorUYd+O2p=$-dW@V)a)`1@-?U`F_-OTVmQ2@`yC zg<3c#5O4l`OLrz%i|@`=;>$o>vv744OPKJtU?`(GXM(l-{hT1+$@HE*u!<#2@a-6C z!P;FWSc`8ERl=URlhEB9e50=?oP-Iw#aD@EHc!qxRCId}cY7`o{x%O~w5;qrOF7-N z`5LJixVOzbS-lIJ3G-{A#WZ^cs*e^9989Nu`P@a)g*7`JM z1M%8=rZuD9iSzMBcx&4{v|o3Ya7t`%R(-$vX?2QV z2@|%SdgFvQQv^$xuw7eYhrN*^Si*$u|Jr!m>nVaIOxPaGr90Ng1bUpKmL6Qi5=X=< zrH@^?DkiKZ+UjUXn6TB+({Fk$Cg6)+-M3XSOPH|z2K`TZm56UH+@p#mOxRwBh1*sV z(Rjgb#VldM_P6w(^Kwj}H|X~H-xslj34ekzS~jb@Ot2Pq-JmzXsnDvAvTDBl!O-I* z5+=-^o&>Fo_Jd5Ymf4=R$8w+ZDwZ%|CDN|;B}x@+vBVK{j<}`?Wi_?&ouZ})^wjp8 zrd_&}N_S}Imlv_bY=E%3aB}AtW5P<8B}`a-d+eJ!vhmhi3yN6chjkwb8&=yP zVZz>hu+iT^ zV)25g{GOo} z{*d#3E;_LrOPH9lt)8I4)<4Y$6RgGeaI5}SA-~h>zRc zQp^%2rqw7h?f~5Tia)HNd$#@URV-nm%QPk4UpR?!4w5BI6#hwxu_LZb<(wrK!4f9w8xEA5uU?0Hs`1wt@=;c`pqM30w3(sA$lA+OHdw+$?I0zlK5{j0?+VPa@=B_Z0CvKgbdHe0_d$5Fwd$y{Lgg`!)H>>Yvy)eF$FMLGX!RtCaT(|9RE#3U@ z=d8uFg_HgqUm8}tzN)Gz0$PFyddlZs;1^%^=v9gn6UE`^XGS2!i1etkUxja5+>}t zgZz1FmM~#E*7N7WS;BbFX9*Lw13a12w9ca zEH*9F27dl_mS!@CjQ(SC*fHXWa2g^!Z)n-+1<4#TJej9o?_0$LYuUL5$sDrPL`TGD zU_;B!-b&_>;a{!aYfWzU9Qj}^I|C${Lq@8OSlY^^%4x+rvi%(LvE@CS4cqk%Ejx1} znL|cCE<5oqN3fQiOp(kXgTRgv&N*vgA2dojnL|b`nGtr3ID)inuXQqq4C2l+?{leQ zEjv#pnL`HgkG`#4s#vQ{eEvi-hm3suFl@22!CKf&j(j9@$X44qAFNezsICf4W`r>p zzNO_ai&(;hohFeGNYy91{!+vQYZ;x)2wSR{U@c2+GV2`YJXcnbFkz*TKZne5v6lVr zXK}75Uzhs^2?-PSY?3)-=P*SM!2k4%li3b z4jHv%@6UE|sbVeb=aV^P^lEp89V5<0e7g>`5)Z)UkdcpTr=3=0J2(Dym zY?)+_NeQj8fWOFEOjpz%DYTwj3r*w$|FVRM+94f;&@+UfX#`7{C|}!A2t84b36?NX zF`}~&dS(q1EMcPd?cWHYC(wXES>b<{Fi}`^oDj)gWXlIj95JP<5PmN*Y!s5j5p~^! zNcJLIstQTMMD54LLL_^UEmbUG!ovA`k((l*Rr`4lv61X7##)0P9^S7zOE}(!`Vt|M zoyC?9mN??RQX%qp7B`TDiKzF9LL@tjE$1v@qI~5^LL@tjjbI5Ag&q3{;dd6x6C?=} z(U_BkNOl&R4VExbF{!T*$@3FfsOt3cB9@p95LOqGoyED*jq492OjvzOb{2#9 z!`lmrSmKDdwkJD_&4$%>NSLtq#_udfZD$D+$y;kXi*wIB_ttiHHthXRb`~4K61HJ& zO#aSdmM~%MShBMiImcQ9mN+7AMU$PyNL9t-PcE`n6cQ$^J@z|`QB*8(MBINQJB#gk zSZ^Trc~R}Np2+Vkh7Fdm4eRav&SD|reo*enWgBr{o9ryM=V5&#Cd~Utb`~4K5+=;UNp=?JN;me3AYsD1D8I89`CthX=BXt+i!D_wVIuMR zcxN$e*i7T;;p`pzmfp2f|0Onmi7@o=r(PdxF>T-L{b@bCeiw1EmU*@QBpp~{2@~e; z`qO&;KUuj@kC)@$g^4oHpVoFyEutqDmyWP9c;VZzp($;q6<15*6L& zBiuRkoGM%025*}QTPN3qPfaJ{Ghu7-@_lNSFk$Qc5}(@M50)@tYYG#e+6a~~Ve1yX zPrdZTWc@BAj)>Rq=KIvPY7!DAZ2hJ8sVjp|%@QVTji>ji-wi%BOPH{Aq~53goYwC` z!i24E^*;5pw0;*7CTyK;zK6_lv6ij5O$d7)EOA79M}YUK!>ZyUvjGVcmcqoR#)#$M z;8QcfT2@y1J~c}m5x4V+PmT9{+jq(OT{)qLwCp)~pSo@Esaaw+5U9(?LgEN_J~hAR_8!2eX2RZ^CVcAnMioeyNZ!q~Pt6i0?EO!CYO5tIVZvIU zCVc9+^?`&5Ysd0^YL+-6UcZ~~Q(G$v2@}>*=lj$waYWqaCqA`3bL(*+VZ!>Ze4m;n zOj!Sz?^Cmc3G0LNeQK64Vf}o*Pt6i0%$Labsae8=`78N8HA|Qn}NnmYq`Ky>J*~3CC;a zjCfCfXz=tM5uaHiTH&5il(e_;b=axLgxyREtMZ1VgpNvC_SjT5c!_IlMrFg-+TJEhMjs`OZfR)P0aW7o3ep; zOWW)ysq&uwO|$mv?j&)lKooXvCPcoc?<7Q&uG}uQJ%9GxNr;Fh{3t{do<2*6C_R6h z5c!_IlMqq+=w=}jPv71TCm|y0@?RmE@bp^XT)f0wXR&q*j=s|)#_zLPK!*SEye zM_FO^+-jmon22k8GJ9@0x7sceBJ7Q7!qbo6D3K76yqjrH-${tD_doIUEmclJgtb0R zc=~bcBN8I49n1IhorDN$E4`MaC%1MYYk1X-@jc^hotZ&cv^qqu=!~;k?ef7eVGZXvg&S-?cyVJ})m%taz_rmR* zL})Q>=QVoo74?M)*0Pfr6E8fM^Z1NLNSKJ?lOw%P{Rf^&JrfN zZ2ndV?^B0WFN>I9t=dPw5hC%a(Hn%7HAPIYR+qEFJsP2O6Q3II;EZtAJrk_e&^p|N z5s1X62Juih>z)bLDt-GaA-qq0QaJ0L3D&Bd@ud)nPmO$h_VmjxRjidg{|h0!PyKE< z>z-|}RzdI2h44N#&bnuUwX#QkCPd;>qn3nKVcrI5b@}x=A@Y4{w!vEVd*V}DP2}gy zwWJ`fZ;4NBE0;Mgw$WvuPbF1}Pi-rg9YI+FdN>;qX%!4s!u!;_^uEgx ztX2E+hhih~squbbz)bL8uy42iBFAG z6^66!nP9Dk3zbNGYS?HU&bnv9X$@2&@u^{BN;vDDiHNi+7rq%k58Ty=KM?;8XWcsq z5e2=~hWEn12xr|h;k07f`_v&-P1=B#r8e=Yk@Icgta~S+c&!u?pBnisuYgxOJ_|)kqh$qEb*1{z| zHOlJmVdXO0U@dDO6Q3F_T*t6-*%5JD3oUD@6Q3G3)`ykLOt6-<^NCLl0xOpt5%){b zvR=*m)L6O91Z!EJ=zVIeTxNo`tlv$1YUKRX%9mZvS>{%miyC z9zfcsZfJL2FZgO}I}Qt9OqNTyYo}pL%0E0m7e*_EKlQ>{i|P6iD}?A6Xw~nwF?`kk z>Cql6VWP_mN=$BV#1GrT-q&|8e4Zstl#V-BY#eu#5x@O$a^|d(lY211S{3`gEX2%1 zjQD$a9__xpcrijco!2?+6C>^q#PSh;?#>d9x8h*6vFlnR zCI;e|qpw}e1Z&wTqF26Z1af}CjNmiOTPf*aHtu-Z2zwq(u$G*)Mo6WEd*0M9c6B~D4Iw><{Vf*U( zf|Ye>chT0`&7?<#aQ2&Vx!*PR-)xwincr>c^Q^`6v~M&fwBVL1ZK;`HExXHfQm)wN%?KQP= zVqUxJ2-32L3*0ONY!r2?u6ag*!oe3>vmbiH1yM)q2Xyr)4M8yZsN#(cTM(1|v{(~hvkh7RV-nmeC@7cBNhc>=G`TWnP9EbYPB)s zJtL5+%dZG`L6C%r)f?1C|3yroPBOt-`hESi;0n6P0*-t`T_VJD=ELAxoGj zKjlCvtAF2S#HE2)*y{T3Ot993KdOy2cNj4x5Ce9&d@)OynARgsm1`51zH?hQmN2o? zOik4V~c3VAf#qTZa}i!CL#A za*)_q)%eG_$3dz_{_^idOt999yOh}VX(KQPaK<0@b~ae+um&Xtk2L}|W)*+3kZrKm zn!^s3RBdZ#1Z+%NaG1+EYt0y`M4z|LjPrqB?b2fhxm2;%Q4c6_$F)YFtaiDj*x6vM z9;=n;+Q|sKA1^O^#N~svDt0WCeBA!l&^T4F@k#Z5E>*16<`^Y*nrH;d>ddNz?s>3Q zwoHkQ2QX2*_=|2_x~x_CS0$D#wowsgiWan(SHuKsWv^4>qce@L_KFGCvfqO z>};@>ec?^=VL4}sC)CEQzxAbjpiOLwfR_E9d_~?IQq|_(dy83OHbB&0u%Fbc{9Rj2 zuoi!VMq2QvUIuG5W#jyXz2bbpZ(q>m&MG4yVPb5B<~$l=IY;U4{pUqROt98t|5W0x zql`eR+Rq*C2-aG7rxF!EolI|3&*gg-vklgoJ4K11uN(1QNLBaWKj-qnTGJ*fvE>mX zkgBie-2WWgV66$~Dp7fr5wLOg{qtO^SZmS{C8~!QfwMnv8uW}y6>C+NC^5LR5lGd} zm&|u%#ahQ5uEfk;jc5oqI+Xn4QpH*wcTwWK&-=usTOWw0i`p*coU_*RUum1zez_6p zdWBlzwBA>bEU8yU@XE}J*N^XoSqglew%?QQ&Zt+Y!A)t&%8I9dE42R_4k99n#S5b0 z^4|#IzqkWn2@_HK&O#(#^(|E_VWMJLM5XnjoBUr*j#lD3?_|+mv6-$^%*5cUtB{<`E`(JM? zHZ9Z!e*P8joFF!ml>?sz;`2*B^8{(t))onozjADXOo+N}{IdEQBIp7G^I-s`@e&xX5!pZ?ABGM{+Mv45D15B`1 zX<;9+k-u_)38(cJCH%?()LkYb(#qaCRBR;c0MIh@-{qG@PC`V(70Igon?**a-iYLk6;Al?rv2b_cmD}`j`fZ1Szwe0u&l>;nc!k&#^IWRP=9ALs} z#n0cb9C#zF9ALs~3AC&x`jrFEP8*P`S4b~wSv~eE2ObJ52iOK{*}Iag9KbVwBCH%> z!fEB+M_xH_PFOj>MDo^lUSjXOUpX)}tQ=s1wX9u9Rt}_}Aac%H*24Lf1Ixn70k*+f z);{``1I@$A0Y}7bEwrqqPF4<}td@k815B`%wex=EKx0@r;E32~5UseM&tEyfgn0wd zvVPvL95}Sy1I~uiiah|oa^SyDg>zWwzGd?Upk@8MUpX)_tQ=s1wXB~{Rt})7&JHUF zm|!jI=aZEKATA6m2bf?j^8ozHfv3XC0VY_>`uSw#0Bl^nZWo`b*iV3#_4CQf0gTo5 zIrzX_?~IzrT8Rh1D+g9xSeJSp2gYq}(4w`xXrJ+y%`~67wJYbtY3yCD3H(710q zVhP2Yo!d@`d~vup!`UF(@{!zTj<)^Wa0{Q45K-Dk_pA9-Np?t!Q&Riw&629* zzHOum1WTB(aB_RLwG2%W(6Zn2iPG6?YT>Kzzqw#ZRPYZ8L(6{8Cz{d%{l8Pi5{p-e zX{#jX>tQ?o({XKqKiP9VzSuY~M_5@g!CJNdcwB7M zOf(yq{kY-52a8$ah$YX6jjMA+uC`NLwWL)#_%X3DZ#3H|eeIrNmM{_hZJyW|og?-L zsj7RhaxoK5tL39&WBL%YF(eRW7ftUTv4r9+J??3-k;xHOR!p!~?YxJ@#>Bp6uvYerSz=>C53_-JpPfhETjeAaZ|OBpijCGe zqIXyu_4B8_pJ#%#YB$Xk8#9hG8(TuE_C2;)50)?y6+R(0y52WMoti^ORrClA`(V+j+}%6}3ff98%QOf-!9S&007 zEG%Kd!pVH1<)bM==4US1E;f?6CA*Wgfg~L7xG}#7k<2Zb4VEym@Q6s}^z-MISi(ef zyAsLVlG$Jh6ZdRXBAHtb~nOj0Wa3?EEI9{s@er^fYSi*$Ww`6V!IbRcYdb7k4ac%c=OR!Db4#$n5+>~ZPv(}aS7Qki*2d(|EwO|NYsZqgCD=IO+u21dVZz$VWNryL z$2qAiVZz$uWNyjIiY1PS`wu_2gtD^U01_swC-QSkAXvhL^>%)42?R@+upTv;Te5tx zgbC}l{oE34u!ITo43fDev%wN3%=<{@mW*Ht6XxM0b4ymQSi*#PQGRX-`CthX=BXuf zOO`5@Fp+qDer~B(5lfih{Vhlf{^IZF@!n~fzv|vnT4#g{{{EhL0Qo*O$HiJ*Iz1{x z;vu7~o(ywKti`Fa{oIMCk5o+!o<0+-RXJPtZRe+otusAt_EVCo0f+u7qz^2YGXCzW71=z7P5qig5D2Gs(#yv2|N{+Fk#_iu51?PV_qoT^Y%Kq zJKJE|R?yCUDQ$x#OxU{KYaUM%EMdY{8-IOUnqUbNwg!6FD~zx=iX}|g%IxhUjj+1Q z5+-bgdBf>xf+b8;#4F;L^)bRy#S$iLZT-?>BP>-cVZv7Ye{rl4ox(n^M~{Cjw|f8* zCTt%<_y4b2f|_CUj27S4p*G}{)Si(fv zLrTm)GEK0AiNcqZX#2tXRH|6QMCI2?d^+6-dp}shL}Tlj^2~=0OcN|&qT*yFR_tzs zl`cyhF;R($uYDcoV{zCGc;G&-cCR1_6Vv7?@$BtJz(%+ObRkQaD5#$;`N*${eEPTD zYJ^d|{ho}^t*n~T!s;EnyC{FwfF%|$2)nx|e`bOuOxWE;`LiD^VZ!b%%Aa9j2@`gA zQT{9rOPH{`i}GiRSi*$eU6el?#S$j$?xJMI%jy+Nn6Mj;^4I&Ygo)&oO`C_qT4%oF z5Ve7yzuk$I%*ohEAr`L?@g0ZIvfH_mIT?(d`Hn*ntYvq5C37-X6WIo9+5KV3oD9aC ze8(Ydu$J9Xmdwc@ReZ-G2&Wa_mgd*{?0j}|#~}#2Ee%?B*P5S`!AT*U57x5#+>$vN zfWS#1Y=gDz);~Wd^U=1oi{&B-8DKX!cmIhJs|RtouZGEA_R{hrLpz{dLH56G33 zjD+H6fOzfMBy%z#a8d}z#aj0K{hZ9!dy+d2VS}}-CMI(-u)%j6f?zGH$9_(R?>H3V zpL&ZYwCr8+b25C#Aqc0Hduw@4hVM88k-W8?bMJgICxd+8q!2DEYZ;(r?MgBylWwnI zgSD*fO6Fu>gYP&5!CKZnCUY`q;ojVy+;J#Ge8(ZQtflsIGB_!O^TAry&igqTzT*%! zSj+l(KPSU?9D-mi>*xKP4Bv4Gg0-xlPv&HhbDR{y`Cu*U=lz@vP6}aywXB~{=44<4 zCxtMhd#~}#TvVK09 zlR>Y>cN~h1_>MzpB_4pElc~$yIjPU%8%b5yP95Ai>loSKFPqsttoPxZ^I6_e^EE=} z&wj9kiNZ%_36adnz{W#iPKIqTZTawXG7q*1>r2Qw$6Ma+39*qs!@?3K>}-IpZieO7 z6RX3?+(}%lRT!UfaEDvN(rw|oZcMON{ha$HRrxb4Ot6;yp3Jad7xpu|zEH(lY@;GR z4`SOg8_|Clh_jdP)SU^|%Eo6|teR~Ep2usqKC_Ss*0Pf@y5&}+EC@C_UwG1DCRnRB zKKEm2ZhZ;%l0DJAe=!rRWv7Pp&#e|gs^oQIW#F2;H>vGOoxzlKJt1O0ubs2*{*t-X(inZ*F z99lCmcXFn>Y~Tw_uvTe&zR&-zSExTsTX?RUlfm20HIB8ii=LOdo6O1Jc}V*}5+*FB zWQN6hPL?!9B;#6)SpIUz4OK=!!bJT%eWT_+VY43~e%|T&Vn>ixMU4`Jh8TgCdf13{ zit>i+F= z&RUIq9}^;}S0H}e>B(;MFV@{zPp&v5w*zp%%p;aW@s279qmqX|zqb#Prs%Gn4x%~z z`)|1Q1l#8Y2@|%@@74DTiGU?0Sj)nX6xQDTK4-6Kemo-G)1shva6BvfmE@C ziNRO3k}ovN_xbhzumS6wcB9W7Zu7e+-CO?AXCX_NFdGl|W#Y+?W^`i-6Bbj_`lO#A zBux>%mhkg{go$Z~XzeNA(`q|x6c#Vd7iLM_# z6z5|@$j9LyF3s)Egbmgj6TknnrW=8>I%dr%XM?p?XVpfFeny~$JM)BDuB=#V{!}F@ zzn>YW>YG4ZerT;rmD9RQi7k&Cfm9v1daFxSL|SuaC~@qWM&Nl|{=gp{!CIB^&f=<_ zjldY^>N8GosbVdw`Clw}FwRH*8#N>Men88J3x-`sM19vXS4&vS+88`1t?brbv4jcR zoqcS>on!+nOPV59FS#Kmu#)`9PfsZ}0um-{=Y2w0&RNnFG46}M#Wqm7&z*Wm?j!_A zn6N$d*W7t6<>RXTf0H{w00e8uGf~}QUT&{GY_OJ{ zSa3!!%SSrrAXuxRr=H@`=Jrb{AB!JswTLB5*f|PYvRNvto@aek!~|>ESq-ypnoKtS z_{}j3nP9CM@u?Bx4!D}iYWbddTOaIfu$G+xGP3sam_XZpf9;?uE-Tiub4I2< zaal~D?p{>ZrkDxVva?JkJ$Y$NV05?iuV*@fwd}l<0ZYeIK0dg&!R4H_>`a!Zk?Yl# z#@pO8XDvG^X2P*XSX;vRV6ED-weD87HezGQ$JZ<87PEv2J0oYx)QjVMz^7ii+s{=@ zu-3xAsg0J87-4S|OPHv5Bu-Vv2;^h*$^na5!i1eCw0`?VajI4YqQ$3$-I-vmey^#G zj{lFZE05Q5+WuQ28mK5qIE7SFU5W;sH(m{<>qy*2N`oSbx+KY=(Cl0?hmdqLl|tir z>zFd!l*kmN!40AMg}C9jziU0~dA|EO@4fFI=d91(>$}&U_u9j=)>cEHmrQ@Gur0?h z!t5fooMeb49atfAizk7{?fzu|4udr3P+FjtGetBmU383JFv z)Hr6|QjTGSSplo~rXj4Z7{OeFpHLYy-%TSph7pHH7R+`oGQ@bFt6ksTyp&@YQ8BWT zwjoBed3;jgxx;VBFoL;ew5uw6g9Kq?(B52)e0u&$^V89`@jqAE%c^N*b7^Kk3o;j@ zSu>E92Ctk}}+{^`E73#W9Sq_m@|lpGI&DBkYam=odbXWLRBs3?u9v>6G6;N#%-T7-4T!2eeHi zIEE2M|Fz;fDH-_?;IbFApA7ssLZrWfKn$mAuXNWGuTRO~7)IDj;7(IMN+CFg5%$`+ z%ft^;2##Tdy=dM&YF!G!F^sTR(?ffIkV0?_BkX1N?v`s)2##Tdz5afE|1}W;s~Ud= zftUahed}<_JF8PN?Cm*X7-6s2r%(J>guwbSr*rZZ1Y#IrFXhk8z84{&U;QvF`3eFt zjIh`Ei}qT-f(-r&0x^uRZv@VL_H8Q1vZ`AaaSS8oTvY=??MF<;Fj9@PN)*(S) z-u?E${n~I0BTU|;g>O=>Faa}yxlDFRwYR9Qyr;kTD+t6e!s@EQiZ@c_;21_2jg?3j z1JrK8kI7dMNQ=3w1xx<^IwANg2*fbLdP%3|ucdOuF^sVOHs^ETv@sG5<*Oyn|uX<7)IDkUE$)zsa$bPfQY_=7&&%P8bL9Pu$Aci zrLU$C9K#4(?fOpX*6u!^_6!(1$bHD{d@kt_ZRBCV_2 zR}f*Ywp`PyHA`oC?(8>K;x$C5Q%gDGx7j|w#AR<_lhZ+~D~_?(u{amE@bahU`M8ko zruq6B_lky3Q(Ylf9AoJMQSf&~RNThr)Ie}dfM~CXv5%KSPz)oADl4MVrD+7mFk;OH zeI0$p!D$4?Fk;g}MU*VIlWnVAj$y=_dlXUk$~1yw7%}q(MGUQJ2%Lr27+t!AV;E7= zR}s6H+Bvo5ienhDqDT=10}Np^1II9;LuW+{sA33{!7+@mZv;+zDSZ~sG5HXKxc}iyL!NJKkS}=$q#HLb3%!p66t>i%rA^H~15*cgalWogY5JQMHZz-a0 ze6nqbAchddJ)agC$;r0mDu^M(&Yu*KoNOB+h#^GLL$gIjc(RSU3StOR{p@E1vG2!p zzY1aqQS_4{l9TOk{P@^^%*RWD7(#T2yj9ezmzKc@<{JLo9LZI3vW;EQnoir=a10}g zBHtWCpS5#pjM~S)&MsjDa}AF?hE(rp2&-L2FjvXoe@d>l$0yscK-2v{FSg|vMifMz zPbPe0=es6@5zMu-k$zp1oNRyPW!zWv=Ms)##EQs+OSgwu#`W79E@lLC&5QiXeAvwp ztGtZAUe}}@BbaO64$W0^vW?zerNxVFIEE3!BhNR3>zNEIIU|^>`hsVrc9WBBSWy0L z(vl?{!-%5D&rk22c80vgBbI%>r!6CxYg6QXXzLn7SgshsTm?5jC%H<_!eNDW`KMc# za10~N+fmcfvWaBGHC7p? zwE2+c63i-Ga^^C>zscRiHZNo2b>D=!ioA=1tHa<;QjXfk+HD5v>V=Q%#C~{Dj({uj zS)ANvV2yfv#P*;Z=Cc@Fn-*^r8FTlpjmm+Uq0bq|1i4}^^O2m~e;`+P_8t+BDCCN{ zN{&?-XTQbwA9Zi9737M!%)fJTV*(jh-}hA@gSo0dtlrGenDRcA0Kr`5CK?GGuQC<)zkRiKkQZp?eVww zZw?U5WxltQdmP9(f4}=eMC6GbTt$;r#+(=5rMjAY)}KLLG1r=5ib!sLAfx;Jp9C_P zYegSLOz3TQML<0C?c)I=;EFt(CwE0aupf8yD@R=Bdp)`NL0#QiVO;EEU1A8asgvfa zpc3Clo%?a^)|?h|nNRmbhG{a4U@jZ~$?XzmpGw!%k9#{}7_l?T)t-5Fy95~vI$adk z6%YYeRHpDg>gdN$iASwSC$2S7dra$-+5L2XN>^C zTs9t)TQcP8>4IF4E9R=+L}!MAVP!O;N`6}w$Y3s;SHgR>XMWxs$Y8FbXomaxB)f@2 z?T)DZ*FXky+58yZ#C@{lx!7YmYL~foMle+gg1Ky-5AW{g&#oDi zgSk2^(beGgoZa0)#x?gI9LNZ`;#G|i!v-!1WF)Iv>B^bW%6ZH~eA{=&6XWBV8s%Uv zTb;xE!KO7I4QiLUikhefQ2Ewn)aHNwGCs%^bD91S-YCv__=O->%+>b~l`;N$yHP}4 zy|?40Kn8P}9+cccqL(aQHXx9}TstF;?Ddg$2Z{5N7e@Rwp0A|MiOaOU;Y>%7Vz5+4h**}6@F_-POliOF61K&GyT``yK)sx#- z^j&=K%n0VPJzR48iuHWD_iw-m=1O*VeEWLIXY*dQdq|%4bOd!II&S&S3m?@dCz1-8pYTvMx@K9J7KQu+i9HQ zj9OeltZD#Jbji*$aR!j&3T<9|bG1eMrRR#w65*1ssG@JJ69ifi(wK|U_RU}UZ?NpU zZKTC$`%XNmUF1qiMADgy%cmtrPrUKT-HSP9W`pmO(o#x_Fd3_w)RFqZw|(26IY#In z_cSQm`#{||JVY=Tqm2%~1_U-A0$h9h94j(D=~2H-WmxTU45w@1$=85s1Y#Irbos9V zImT$@s?LlWlB=*B_iitF)wqxrb9HG`T@cCFfd4C3KwC=T*MMK%_r|MSLgp%pWQ1P> zHrzC$H6xhI&|yzpw72=`9K#4JQ;0yzuna~UoqXG8{VE>Pzz zR<_LM63`037;N{%?#1?w1PGf&!DX{uh-e8!loKG#IzG6}o_>O`l5e{4Xc^l;Y}$6N z(BPUmw;-mYVnp**$t4RV=Dg!B@HR5agoZa#3oq}PG#?kE6F;MtD?=d0(gnh1zOWpn zzgAnsF^sU;PP{M%?ZF7$N#02Ty z`jW^v@@GR>IfAr^%lsG}vds|q?rz{!zr`MoB!&>hD;9{1s+$cl+9SF*8n=|w3b@{# zEA7#2wIOgDes=%mZ5_ohV#QAjMMjf%4PoVA1ap~}s0SA^;?(&kx8@i|xT9YY8Pn%8 z0waYH0axT7YuJN~$S%3NwfVu47*4m={U62w@(_Y6b|DgVSOz3lHbro`;^; znqvY)hs032wxTjZS5B5;zJwTEe*G|n z#Bfd`nl*q>1|z`5`dn0EuP;pZ>j%qVF7v@ue*NGWMzH>v$PkJ&OVfR24UhEQWIZo> z_SQ`M#zo6JOsXtwM+1uyHXeZRWti=KiKdqU~i8juei_yc&6uqN~A?oX@eo~Rs5Do zMQu5T5iLfmj2@pE!b;8v=34bnm2vK3My$Qi0+Em)!YypeeJ&7Y`=ChDTWbyFH*#$N`{DQmtq((r;8%yZtRpQ2gfjC z)ftKyvnY+=7)Eq&rido@q!Ap$h~Y;o;>)3F1jjIYMJ%Y8MsQ4kC{sk$Z5^Z9HSZDgD25S>W-Fq}TZTXj!g~bAFv8A|wI_}|sZ|cz z@l{{8%&_-l>~V_6eN_gJ&u-kKSa=E9i_xDXCn{8zgp4rnEJIBP2U|9rYUVf0F* zE51y9IB2ya93WC$NLSCSN3R5}{!%}vsO2~uvi#1((zU$-5TFwo9})mhkR+P$!%0baR%r3K)}}ypYMZ4xSr`70%z{b z#b~|}aBf%T)I!LpS9MGVo`H}Sd9sYjI`h@nzf3z2kgm?u4TM(v z?TkosK?b<&d`4%6Z`?=AA!EAlyTLdhPvg$hkf+|v-|MD`n|V4r*8GN}wKrw4@dZZ7FH(n&xVVIIR?#a}}Mzc?e6l zT)~5&g_}3Q5P`Iq3ne$S)Pk!Tt>>Tn_1t2BfY(3d5IzS(8LcA3e2++TnLPFx=)JJL zS3~ORm}|PqEQ)k7zp@WM&DCG|2JdR$JF}u}f%MU_-U>d?I6M<2h>0G-T#N>d93my@8_}QQ zOfaHY*9!Ej1moMDxELLd!QI0vNP7(F)H}oV&K?p$qYl-N;_6X~Sb1je40AD>+sU~T z#%~q9WN__)g0QsMry^*CtLMcA_bH-r&4C%_;+(K-=SI9dQ)Fy8bVLT87m*fxGR`D# zi=Yv%o);OxT#RNPj?V4bJz8W;{>!Kgr^Ol)YfjF6QTJv+9N_g5=3;ap+s!)UH9;($ zKU7K{*NHC^dWQI!r1E)x%LR(~^LfA45*ODf*J08}{0t|WC1gP7ZstDKbQY-&{fFQp22>z0l(fmy;%Ar5x4mMJd7G4{fWeTG$ z-1zaoIKy0wHft;TZt3c1H5lzz1A7O6Z%puI2hzni9|#96-<~)|q`6R6h6c@Fj7Y9> zmMd6m!MjeCp|m2rof-NS=a`GppbhQZX@^twdvE{Gmb3j5SSCTbuvvm|&}#975os=@3of>6;@l@g zdWeiBjVfi>1_Z1-AYIsfKsac%8u2M1(p-=MuD~{gFF~>s&R3&mtp_s9zE6lijB!B* zxGW{L?^AoiV3`xYyYQwAzM}^MU-9$z?w}E_-_h6phav`f1amQ(zsPs)_1!m1U5&b- zRViDb;Wj`xWT?%Woe`q+`c|cBE|ddY+_JLs5`7mtFMM;3wD2uEf8!1s;rbo@l{cuq zTg4-oi_!e`x^tz2RWIpuo?o54jRd3x8wqSX0W`wZKEs*;ig@sX-Wld%G+RaROS}APS{e4R3g4+n7hY8n4qAP(R;sIr*>!4V(p;!3aIxoA=l-?rdXaI)f+tGZ>JaP+ zAzfG+LO5u(Q*?HO82-u=rD-n602f;$a&GW+uOIr~X&*K$gasO;1=}=ibp|xT)dCG8 zn2XVD%f{n9i64*~yPSgqB8}qjZ$x4*ifB>pE!(7R_v?rbu_2n|3q%y+R zSG=?jWdw+56*ex^g5)su6-1)@*m^DqTEkhM=HJS0F<8UXXvk9y;FOcJ&7c3WWzJd< zvp%e{q26Gx&Dva7gU%7+L61mtAzed*R%>r{+V++oGtvLTn#*~mH!TxZ z%UCmTjuB}tlml7@!a-+gz1A04>vG@j-(1S^_=j!%>@!Q!h4n4Ao&_56)W%lR0~9fA zUE2(EF*>l;<<<|}B|6-5W&JX+e}%MQ8H?>yfkwF6ziN1eBL4YWzYKFRIx+TUoBbH9(L{^0~YXj)n{$M zpBhAnl6zLQXD&vw#XRTQH?Ab@(adY(tQ&A?xfYz;-9!<`4DKPdi*}aUCC!3$3Fo@6 zY$$cr?7lIgAxm9(?+R?K2{gjhZd8v5(cB}Li#2c7wQYWrIZ<}0NDKQ{wy^}-!b1de z1-oC~6}wxXIeQs!o&V$ChErOs6|=VN+|NfV;sTFgE=C8k-M6RcZN`~%hh|`j3;BhG zFV>J)b8_yp=>DU=zyDw^Mzc*XITy{L95@$c{haNpftL0VOKdl0Sm-BY+5UzIa7{OdT zmzyaXk3tCXwV4vV=p?tddt5cNOWp{o)qc3jLw5#F0yo-XyG`Gy8aP=O6z|wjee~Z z_IHshSmxzDZn&>)Jwp*YZg?%&2{W24`8rqg5Pu8qe{a>lMRvj{A@<9Be!)9r=W^8) z@$ZJW$ms`ih4TyEFY~F0m+^(_qOD&&pgn7MysDX=s9GN*(p<s2IYy+pAOlvD!@AnyXC2hlGkz9gt%%1RYf=7G&ChH=jP)~JnhP?Zk@0wR z?i{aC0&$VoFfsd}b}=upX2BYVbHguJ#9j9f6HNx`LX%-M&tuNr`QzwP$avk~P4FDf zRvke@wpxz7VSjxyaeIqV8RlX%&-u=^`fR4iSaa|QL0DS6lJN=`BAAPF!m?3<@N^I* z=d)?-Qf;@Sr_N~va%EhM2CaK%I(5$RT*4>NY>mkAIdzV?7;UqJ&OUwbXeYg7bf;#r zONDgoM)};Bcdy<ICy!t*Mzj9tT;XSWCwyN2t{HesLkq%>8hbSZjqrKm zEsYV(#c1}s=HJ2HJ0^$Tb?Aa!URdqq!mu?y{~l%>^0A6~aNQ7uSxj_Y)ag zF5e{xi-F%)$bffPPRTh&q`4Rk+I-6=DXDXDGs%w;{K z9BbQF%5kpP<1J{Uq&{*V@2!Yy+gHjl7o$NZ<=A~}k;v#*y;gvDy+G52x86_&Bhp+* z7db&VX!Z4b*yfHR>z`*$loEnB|?V!Q4HPz5Er9awsUtJ zsxJZi`}bGyCWy4)XOO-AfkwD`6P&nBUmNc92y3n(_XUn_huRPcnW{1NEcpJ5e{1YrMCW55$?}s znKT#r6}S)%T79xUf6-0ScYhi(xG?Z?J6^{GeD5M0GSsUsBZ^a8NEciP2W_5v6Wz!9 zDEu*SuQXcyG~n#m`n$!TSEtcZ4j*p3(%UomJ|FpoZx^%NVYG#Z2!CZ_spUgt=sBF% z$OHk6jJX)i<0foDSeHUtXeqNUWweEd2>U_1WT-#kL;5LVk3U0ZE=IF#=T;ADAR}t- z){Yr?Hbz=FjbgvZpb@TT;R6OL;=^qnGt9+k_L1ydFTehwj`#n#tspEdp1Z>N>IkQZ zQ$A@M%y66&mhE-8=qreN7>m*B1?`1LDvx02_`3<_VzjM^sx5UIsG7{U=9Mz=e~og$ zOE!DY290p_xBb`vMNDr|DZ^ZhW>4DA{iEALY4hn14$Ht#G17wnW9}K;W1JgOq=;S* z4U?XTxeq;&(d_ZqIe+sb?SY#g_AU&!*5l@^+h*jn2XWuzu399*XnEa!F}6hf-^nx7y>^wkfGjg z`dzJvYW@9gmADwqXMoO)ny&k(7e8oN$g3Cp(IZ`Wt>@Lwxd{=X@!E!kX)as)*qgm` zJ6{_s?Qz_;RqZ)u*<&i>c7NZ(Dfu(~2yxDqRqfMUkbztw95m2=oS$4tWL!F^hs+Gf zJLU}bO%592`YxkRQ$-BEvPXuwc*fy51|vLK&nrHu(y#TWT%eKe_LrZCX@r+YFc)(rdpYV_YpYVKAz$XaK@i#xr#c1{jAGV;)ma@;FIoM`Y+kYgz z#A0NArQM6Ar1S28lXbT}zw5ff8T)H{4EN_gJVzlM9N_*gZmq(8EUGzjAX>uYgi2uBNK>IWo(#5#rQ6Q&Lg24F|uLhj=aQ(==rKbj; zbloK-w-Tn&kf$XdwpY(&-k3YRkY{Ap)p-W@x33Z6i07t@rVkmStNYae>0&kD9YFZq z9sIZh0iW=^6XG3`bA3+IFZB+rHb!<{NEbUVMzcqF|Gxb~-G3Zg;#UPab>fpEKBaQ* z#0b&(zQMt1R2mK0^ZY55|E}nOR?;5d?B6QGnm%lIp-k}Ij&RVb^)VvNg>;20vTe$q z-({R+Sa;?f9q;tOX}@CGK_Xpf+l*#i+qt>5^}OWLqiY2-9BUcjoOt6Aia4!atw59E z`7zW>{K}a@zOZugUWR7_o+X@P1amQ(_ddz%w%`0dinVY)vqE^%9(z0|a<$w4Pjgv& z*!h*tCB@72yNQxR{C5*{o-p&AD!Ma0;<}ZfA)}tBovZPdB7UnnBEwva1`T<7GJzc7 zhux~};xPAF4vhxF=EMZST#UB8p&~{`->Y4Z@71Ws@s5RisB?@+b0H__ui+lYujf*` z$XmXgU}qZUDvdxb8kd#UQqp~`zsD&=`nbp8dgs}IX9?&0J&qu7kHcJy4%*2TMSFt> zus2|>FFO5_vxPuU92gLGYqAMqmParb zqj|sUZ`x-~7a4tj_3wR1cV_LLwSIZ;BM7|rVJ=3quI+F6qIIy(wu;Mb^@8Tb`i`x3 zs*xF@|MrTaEuqb!6{XRrH`SK7m#}Xz&_Ls!%V@p9N+XyH>4M8r(p$2<6IG|aV(e$_ z=RBe-+5L?=mko{dHg`$qGK3=~gnN6q5u(3Gq`4r&(4c`1wD9GoGr)$3>FTgRVmgD` z79qWTd72C98XC0PFQNTMDG(N8dk$Dq;go_MOKF;m(V*213#}hHoAqJM#?}nj!m+hP zt=v?rrR&G^V{7HoTu9f@pw*HNomu8g^M+L(I|G1CA3Fn3`#y|dE=HT)ZuWf=&Cc2KCh4n4l_rpq-od>AJEIKvFF&Cq4W>7m` z{w1Kz3^|(tV0VnU80{^7&r!r;uP-teqitSM3ud&V&)EzI`)SO@Xy+KgT#U9^)GVU?vFd{O1O&<2JEtzYo?m*mpsu=`=X1eW~FVy6dZNvov%KXWn`>cd$Y_LzU&ULDaUoqpgH}65w8x3(cEs=;#VI*= zShO1C79Joo97>2e3S5>h&wLn1_VZt#QH{C{dIltI;Ax<(Jrp5l`^3fQ|J{N}3%2f! z3s&BZMmW+Bdx^G`axq%Vbc`V4a%3zmtSl9yyc>;_bj2}#$YL%=gN6)6tlD4uRl$M& zKh+7}{DrrDFGYw`J%YIy9n>^z)>z-oB|Y(&GV6&;K4?UJ7bRyzn#=0P`YzB?yTL39 zt`jS?ie;dOTS^Eok3cON7o$Pj_|W?Gy(DfAvHTO&o6$&#ZBvP?jMWcftUZi|3`JbD z?RqK4@vl5lSTb6B_|LODl|45>=kxAsJCz|EG7#=xI7Nu#JR;47bPWv}Xy-bu*K>x& z$JZ1s12NDhY}{egvi6Z6mUu*(i_xHUW*B!#XDLVfCkir657u&g_V12mEl<$AKUuj` z8NyKxg!>n!7b#-o?1D_13+WmfG|>J`DLH2-wbKFEfwQv(Sdp_c2el8!h%^_{H8g0o zLFd0|kaGBM8cOXf12J~)1KW0-l5>CDuZTbW3YzA!bP*1kE#qmAw9zSZMl=%{4TQ}l zaZi*{i&{hsqpgoA;_qd8iu2^4U8OUlb1GQ!vr`<{0km@;wFx->HATF1#jaB3Vl-&v zN^JsGsG#F~o8J%4xw4Y9ExsVOk!qR@a;v(}euQ8yMuUb7`xZHzMG=Gb&Pr<|3Np;1 zT!=u7aWNXSj=`PL9m~jOm2zBi)<46#VnmutWvKQFTD4c6;cQOCN^f)2NccyJ*7I^2 zKrYRNbPWv}Xn#f)y)W55xPfTMh=C@|+AC|${%gSGoI22u?M%kdNJ;hGW1?N^TYiqW z7QCzXsbxEdX#1bmtYtj!BHXzh5yGFaJ^u5mt;&s=&4<)%ub3vY=K?9xi zb!dIot8GpMm(i$on-dM?zkQALLBufH`kNt=Tv`2Kma+Q53tXdh_DR>qI-4Z%-q*0I3qzgQbM>t5!|7OMZdHv^CzPqk~r#k}JrNT=~}< z$UD&XenKrlUl_fO$_yVYCoJH?Neb&beDdP&qawtHD+i0V1R0|5MDL*tjg(YdI_f-q zUsBh;d~(Z~=3&5Jb|*3_Ik;1oriR=6(EmRN85uewjX4x(4H zCS&76dpqeqxilAYXlT%?`~2TeZKUMGcQ(&0^ly(5^TMk7as5EkLpW+(!d+{t zSS=bCqd}{lSgDqdsLCrkm)d-VS%%Z)S;;v=9PANkE~IPdSe{Ki{(rKb^M2WAAlO?P zfXRA}m}HJp8YNf66CJxsUHwt9rtBt=7IqDMF2=hI=Ng?AAr7u7r)o$G=VIVuG-y3l zd+cxRM8-dFY?k4k$orjek8@`~MO3_|S+FZ&bl7)?{NDhPac1>xg*dr`bezzQ8lvqy z@0Re~&wrJT>aB&Wu~<7}#bFJ{xs?%OqerBL0zdg4|=O6RyJjPq&<;D_AJ$p z$+WL(NIBYE)-^ZJ+rNSIs_*tHD~Z0T9q#?^fJQiI|0U~ZifGZlYmT`X4H~kMl3zLf z`(w1>O8*|Y?NS26}@3GpJ7RRydLeNj>meK;zDT+4O*?S zKe;+hUu93JOsE|de~Jl%rH_^{WJGIFBTN5%xLMB3JIyQjDy!_c60MD0II zt;5{#>&VSHL$a2GRUv!JJkEQS9)tCcPZk5t2~0aNJCpdMJn2XV@6FGO;Qng0%=z(K$JH4Gmq}9UD z8N6EZD(c+rTNSaY;uu+-QSVq&84ViYNXggLB()s*mVZ6TZObzb&qN7gl}9iaqq#3Q z*W*&PUvhWTA-TSrwN7Sx|6}tiY0sGUhten?=n%nNj0TNzASLH+TdkHOw>&g9XI5_D zVU{Ot$FO6^*mFxo8Xh_6;hz6WyVJz`8_KPDpo7LB~FWgaR(iv`T~ z7=zvdW{$ZSZ5}F+l5=0bUPD&STGw~YnU(LYFZB|8;m9Gh7uIS*1nW4A1`RY)@+ZQR z)&A}i8*a^Y_uo6B-r*at%P-m<(DXnfT(!PGk5K!&1N?gc=3+Ex$UsWLOY)p~iCA*K z*QqEcoJ0SvFY!x8HNU} zb0S%MkL~G$%dEdQ7}ZN?AV52|D)04OwIq+2d^yxy;Z8fAsUwT{BHh!-p=e4U1U$2baV|_S9w7XL;=HCI{Q<$cb?=8no&RKSi%`cX=76 z4`P+Ex4hu8_q&SN8X+q9)quGe4H_~`Pqdoy{tY6}?~)ehFtP-%GK}BXSx^o}o4t5N zY&ue{i!HgnM{f8dI$tgDeg->~>Wp)V_iG3mxdQE6wt*tXU(+MUT#N>dIz&oIo{%fv zzjFO>jf4p1VsxOj2oTK0Xr5!7Yksj>hxz!yVL7Y@NDJ!(YZk0=gb3zhG_Na`C;azw3TaEWgTS~m z?Zd{Pp}c1x|B@KFk{CjprlyEje$j8kclmjj>x8vQ)-t_*MF{3%G}obX=l`kJNM`tN zn0TMTvop`y{?6_xMXY#ztgHrTTg>5%=6y+2M^WKf+cu3Hr8T_4aFs2p=KI@nXYcWUcbLOZLC5d>r)E!L1&a|*sh5{(Sy zfF8v;VcCKA2sy=p3_0K7U3}zKLU;7!p+Zg#AOkUcI>hHe-j;WhTC&zws8*EYJpiu& zyfTCc=3+GO8JwFmSkGQx8rV*>43tCkkI1)|X-f!KZRyi16tV9re-A=j=C8&y8I(^o znP`anf8HNU)^dLn%(o?OTKL18PSvi5gn#$TeYyG~i z#wudJW&Vbj_5i#h^BU~jvqRP5`|d8iWoCd3%o%)|&8OV{+odszcskQtPR~(7oOxqj zF*MIH{yp6Etk~u3_Mcn5jjeZt3+o;4Ab4lt*pjF0SRe!Y3`X;rZ0anW&J$UCVXekF zJ_~0qK8*wo*?IzLEeM^IXKK^J&}ycgg>4Q5b1^!c+sVpiuJ~B>YSq&3MmyZ5zV9ye zJ66!BY0%Cwg1HzC8s$Jrfql_j!5st7L|To}g1ZKs39ftmod;-ygO+_%4yDJ=i@6vL z8fc^>K6qq}@;-QS1vLgsT3!7~eDRvASJ(pJVH;;GtK>Z zdroDbPMC|)fn_|&m8HdK&06 z*7tn}_1e?t8GnaY>m5mJFwWJ>-WIOA{EP}3GK6*kg1H#&X~>Y2;7dr_!}}7-tvF@A z^dG7BTh&+Jky!OT4H-hSrP~~0kQQPX4I1Ivg0hQ<2Fa!y|1SB(&IB~LFeZ$)9ZPa@ zXEDZwoERFkjwtd5mFqiD>#8^IIk>c33+!=9YS-$7(V!77DZzGvtWn-}LaxL3ccmQl zv6nsTUEx}KztYGRXtA~sBbbZPpdkY(g*)MbS?febbFb+!7o)xX#Aui5{i{i?EG&1$A>?x0+v;s8Ec5>pi9OcJ}7ta|T zh7XaP$UN_9ltX9gK{NH_ZtTPUjEuM#&2vn6cemoce@ZPLvdy=7w>i=Vb^UitpdkZv zcz4HKj0TOmLP}u^+Pxauyg2GhM(1yH=3;bk-v-a5ab1}gN6fFhlJN@XYnSSZxfl%^ zxzd@MEJx-#?0#12YZk0=gb3!sm^Uj{R&CmLZd_M0=N81J1r2ohx?(OygHGxyk>bzcCcGtSVWsC)pS6L6ALl;I#c0rw zp*q9!AE@=cW{-}|wOGDNWZdd^cWe5u60W9R9%z&Uv~%~4RttZ>`?-X<7!4XSkdnXQ zP5ck$f;r=$XQW@XuI#xy4H-hS|G^w$kQQPX&2vm@ms(48oG1OhmUF^63=zyVlhB|c z8!5>QCv&^^IVqY9@(WF-c*TMh;Hv8T7-)opcCP+xT|ahI!-|t|1sW3RMDk8XGyw0L zJZI~joFV(sg>-EULZ0?3|86NpUuRPyXW-IuEd*XFbIiqP z(8v{1@~4BN^|o)%NdMK-(XU9IOvfIemHJ2?g4=0NBey~a_k#f!qdg57l9KECLA-{kXN`FZJ;!yZ%`-^x~EqTA;$nR&({fMHKj8{0% zO9EX>zQW~;_cDpiq0$H!BxB5n0D+mo5C6|)2jvJ5h`}75Mxz`$w|nbilBFy7Bd{@gmV}on2Tplo-4!iUDk29hjY&t+qgOObZ;A1Mifejalq(6CkkEy2KwNF zr)4&{2=Adhjq(ZY$kJ2}F_0lKtWA>s=ud0k)fFsU;u(i$qQKvFj=2~e$PW4y zc6Z1x_Ixk^jOKk}@a3fMC3HqcI|$xc`0rS7dgFf^eNW_lMu3h^*z{D* zpKJ?agMSy!dl~Mp+(YH`To8Ck&RmSs8t0yDsC%3vW{eeW3H?fR976Nj6`rc`4jVcn(4y(F1{l0y zVJ=47?p}BF{(exjC2z+o$7lD@wID-uEz+FAb86;dG@tcLtx5|DMYU^ffIYd<)*ian z8Ui^nF4Q!*tetd6Pc~&`#Q~SBMRW#$oj$^KN6(1h41iWLUc0?l}kl?O>6y$iHqWIPGBJ+Th+Enk8s(VKy*2ZgZ(!U@gYDkP~oON;;Rk0fs9x}XNfZXu1BSi*Y5AW@Bq@;@z570p9 z>4*0u5F?n2(V&qleTPi`)pB)a94#@hrL|_$(ULB#27m@aEeJ4zxfl%^xl*fKWzmlQ zI6q?twRpfMalhhP7dzWhyErv)DK4ZdZQ#Q}Yri`E+?xdP**Aj=_gA z!CZ{yKJ8aE@&Z0#kB;+wC;0CmH|W@2P_a`P!ch){`>z4(7fH!yR;!gsb0H^&1`TxJ z8!*@XfO?W&eD%BPpGQf$unz_r2(=Y9GOMp~Kk;5~n2XV%kt_Y)c~W#P+Q+xxrf(`r zT6mjXviBh2`qH0lA{+>Pv(1P!7jj}~&_FvkX0BQn8{_TDG^$ZqWNh|2)!uKkJ^rYw zG!URe1amPOG;)QMyglT*)kp5yaSIDqouR#9%%Vg7@6iAZWpPW!nB#w{~utP_j|jc}yot>e>#iZz72kF2pR~`^5!l^Fc+giBUebtf1!7Tz8%C1>=p|&EvysF#b|lu zEi&-Ro4FVb8ZvandFjo5(y!jWbXO^~4CEKuL`hEjD=ZDM_Tl{~MjqL`ed^LQ7o$O| zoubZvjuaWs-ZDLysd?OmbNl&!D5C!O=`w1OUyM7R=Xo@vM;guzgMy_p(1h?*lp~!ukd0*16XrZ3+H<(p;8zgo9QK8`ev3 z9><7PP3pv4pwS*70-7>&F*=lSM&fTf*L{KN46v%Qw~wy+uzms>xl*etd zT$Q))!@07&!?KOhR*q!UT8wd7{a8wB7pK*OV`MJbb7RB8nccPT?rQFJbXqIU-&_N>{w7fl!5zNJC)>r(u zOI_4v&A4~^<%%BDwC4D)ns_DS70x;TYEoq2)g*H<8Z=6dl)R_d#2>x1Ao7d0WlfJY zKjn$qo`R*eP;< z<(;K-gCoS|qdbCoHMkfJT6?>XHL}h126DFBV4T;GlIET^JZP!e={2O_Q3nQU z=X#!`<6};*b<*3dSEtcPNqhTQUDQ+4Qy1TqtKLR+QGA)syDi>@IX7UWB5HU$Sj@#} z(2!m38~2RWB6Ky|e;N&h>2S7o`qSEImx>rhTiX~SS#cP_ds(CNBOo1n*)$q;r8{B& z?W@ex`1Y0837(yK)|PKyV+3Q(m^ru?tP+ii1vX2Cme(9(jk+b*uBhvj&A%eLW4H|W*U*3Bk3WX?#_lS_=all-RmhV^u zf$vzDi_tu8{OVlqM5*0t{^1d{C*$77z0$e6SE^@+rrx3hb1|CtaL)a9nSL97#CIKY ztaI{=!!wa{?|X0TDEVvKJIV})I>EfeXx34k^ET)N0ULC|Ox;1pJS@tM@-$LXEC1dG zogiR?4l(Erh+#BngzMbyeGdr2`#uX0ydMZEJ@-~O3`K(m+G-a6i*w1Y;h3^IGipTXDy`_0#dp7h zOt=`G>`Nj`=~52(1uz6Gl_7^n7gk{{w`w7lzQWEh7o$M~tv1hc19V5q}0GN|}q%pc5H%3lJb|Klr-$c^}HSBf2+O zuyt^0nhWV7Cw6ZDw7*MD_MCzM7h+5!-`iagC`X9+>BfeoX)Z>C23qdVtzSuRM+_|5 zS}%c>MeA2;>6ZFc(08qm85$|6jmF;fTZ)Wf|Mn*n@9W;F(fi-6w37l@P_`2UwYeN1 zqB9HOVzj3r11ULoBo3b%tCUG&^a;p~jNk$F` zOUt-mh1Srq-CC0o&kTrRG|Nuf&(}b_4#FC{^+cml^78iEnag?!xNIFXM6!>{#|1wx z{~Ljl8<*w8QVPAqpd2;M(^)@Sqj;QQ^bbP=HZJG<| z8XC0u9w=W|JSJep++^tZ$X8d!g>(%KS}mo28tJ0d{N1*l>5p&nbiDSVXK;`4ei{hD z{fE(Z3xJe@^+QH2S`gAPx{wnagW9iVq!7$yrR6edIq1x?l(jxPzdUB+Q!DKZ2()vI zU@k_3Mh;a^q_d?`MzC%e%D5~#tv%SE)~30TE^@*er*oG_Z&D|CP2cJr*0EVnuv%BE z*;OON=h#h>O5h#aoL5870YwcS4 z7+FbLq4r{{glRH{N#;bvFdDSVJ6HB<<;wwW!Vs7_jaDrqUpb5m=^7fe&AV}~f_`P` zaxH`<=k)_I+^@o(NVk?Um!Nhr0|aw$Fz+&gxp@BIdByvXjx5B^^FE7bwpc6g7BE|` znDD-wonRIP4cR*H&h+B~W$)z233D+Tw6=%(d`a5F5YQkk-Lre18q=m(h6qSEE~IN{ z&aTkHsR&YixWuAK7^YL&5E zp>4TL|Fs+$=3=y!LwgC2C~I@>OVE(5{qrMGi^hdA85*=|;k%=r__JR@O$K7PLOpOCe+QAO5}Q+!t3u`pGx%S5|UnZY9$F$2CeL9JF(cU@k_3 z1{x_Lb^Cc=5VL1VEnd~{Fd2j3G8!^K8#n%Yt94P{5yNQEh8E7GJ)#ow*p_;WQi{h% zfIwQtg`5}~wAR&+QNQ}d|L2@oU&8DY<_et1+YkPKn#)RSJv5%-%H^t{%~A1uWp(wx zOU_)32JJ0V_}+nBZTGpdUIOV>(}IZRF3lD7tGGRk3*|60XqA!f?TEoV2zki6AZUI> ze#(yz<6^YQbMESB)Q+awg$!P0c=ho!T(qja=)WssE^8a0tvx_HXDztX*O~R|^N%~U z%q&{Zn0~y_C=+P^7CdTmj9TVmw2c*{+%dTHNPoKvM1C$t_wW5+R>D;hKtgvEf1(MBWOzc1O=A=BrtjihglpEfx=w(V&mqhayn z?6tj46B$OUj9WaSZ-lTIq{V2XRmRjMqcY38UN5;SJbQBX&qrFv<(PC`Yms5$olx%VBDk5XjmMPf@4XcO@3s)I;{cCAyjYf*d$Axq) zTxG2N^|!(c8(c0j8f}}LUADi>&92Nm`>i4@2GSXAbX4-AYUO@9qDaay z`=oK%9xEF9x*A%xe$VaMuMas<>Mfzsckd!Z64SGc(Fu*7IO6^>xd)%r+tHt29-kd} zReh1MZ|?Z)h#x`sEK6v}xZK~NZeFH{B&KH>qZ1l3x_dv>75$51)YXIg-=6(=pXQy% zT@nr%56+lgdVhq-&*l3Sjb`V3-_2Ryoi~4KJnqInH#OU6l#WNEwRRa{F(@sgjn)?Y z*55%^>8@|dx~;t_`{DmJkox)1jm}oS{y3?(ght63k;DuwV{}5J)RHzYs4+f!@%rPXem?tVTy|IX1gW=#M#vQ?Tj2AP)EnP(OM2hSPb&ZXrr|pU(Xqvn}5z)`HE-I%Tu#|8+nk_ z`;)Iu&8~U;ASs8@ifH=G*xW;F6k#!t&S;}GSIst6S^n0i>QlJ&v?t+dC!l5yEb55Zj0v+VWD$7SEUO6Qd%9PPn~ z{9KGid;Ik2t(mVUR*@I$SG1m-?e^p8BBP+qE~qQxW6dp7 zWqcs58N;W_S_>`^J}#td z;VNT4?{{#@dHSW$_-^B~JO5SBr#rN)`|$DEH@h4yG7=hXKFYsv%0-s`lNet=gidI* zxnFBbZLOVs%v4!lk>7`_OqF#PIk9lf6(jO-FczB)e_yu!d1qvTOTg0xSy_^`M8j-g{zEx%`4^h4d@{b-d)SNXYmmL=h6bJys~+}{t}AoK3lN2g|Qct_Ww;^|Z4IoN0|2O}&7 z`DL`xS`OcWIj>Vo3t|=SbdJuuJaZbYG8kboNQ==%tBhzJl#<(OfEcV~-e-;UE2GOJ zEC$jUZFE%f{YU1m{^Vh)E7LL%v;FC*+4rB&^~z{P9P!79T>oDbVKI=-Xrnb(^Zr>k z_r#y)NjbWmH8s0ysm_VtwwRjjv0lqz;VOd>`M8j-g{zDu?)*&qIXWlWN{<-cSy;Hr z@Uv*fX3>0Hj8+*_{A$qqhRW^H6R{dR^O}xxUIC0 qJRynJUBL0Al=Gumj))$}1% zGygc`(hOvLlAD~pace7?2cg{;zt>9I+`<(x@Vcs*VFxQB9~W|B;hL*w&TN!>XlDnJ zfqLKghst=b>(uN6N2z{g;VOd>`M8j-g{zG7FI-o6Vl(x!TF`rJ_R@c;PJRAYw`5T?OhynE1L=%5T5}ck zL}_!BaK9sUPUO}!T5}ckc0pJS(qgpHDkG}haxzfUc9!wq5&5`~6ARZ|MH+y}z)ElF zLL0EN6ALeo$j61eTez0PYfGi3E!l|>V$f=)YZ+Z0VKI=-Xrnb(HBY)WS5&Hf*H&kw z#oCL}D#O=q&U(AWAT354tuik6b4m8$s{cbLx>96p-Rt#)+A4$35G`C~%-HaG;V*wtL_RL0YvC#*y++x&55^s4 zIHYT|BGPM=abe6G+Gx#H?cFCAPVVfj;`!g|^OH8``mu0Dy!iFWg_XS~4n#gK%}&e*w+X^@EF-K2%93`XSRVzkQeW3auAL6**KVBt|+jab{>#$Y}!q-)_S ziLZ!fcO(9YE%L_RL0YvC$m&o3tz zo)`5i#Js<=qR2qHwZEw-GAvwW{Kq5Ci4gg?kgkQR4CG&b#kp>$Ov^re;Yof>+)*~N z^)xwW0)0lCY1!gGn@G5Et6ya1V)WqCr)8VI1kLFVU-INvoZ}cqbZI#)d%@og@m|^O zv86(eVMOib)3UCOAztoW@+#!uMGD6-;+00zviCfu@>QJU7)JCy%-7WX`xluEj$uTD?NhVgy=5}$cljtT2P2s4`md*ECw>dP6fL-* z&q=Wij$y|M-(>`I?O8W9`_^KU!6oMyMtqi=nw>M*5Z6xc64x%rFrv%i zso7`F&zCDkFxP2wr)K;2H5uOzeKnTBF^st9F<-kA^T}WYb2YkmYPM->lhOK-$E7D? z3~~%3*55WYJMgu9G8n;JZ;qatJ@qh?amw>2hz#_0j$uU0{$97+n@IP}&z zajrOq5$g-4W^cdLa`i*wR&j4<1an<`$kgnPCryUs3bo5IjJWFeDcSC0O~!viFxT0; zrep_~n2cU0O>d>B;vB~?;+0RPWY2sepA1GY*OYZrvO8`w8DrjSeHvt-b~%O-U%xaZ zdsr?lBaL9L0WW*q?naZrCFdAM{CxkE?Ag~DV!zU3r3E2_V;Iq7%9QNfkJGtAdoY5z zppl(C%w$}7cvTr6kijvGcwxYl?DlW-$zTL?t?t3)IJ`v_k%3%s3?pWqF(tcbZ$24} zV6MyBaqTwy=-jxsa||O+Iebd?p#7Ss#vn@02iH1`r~K_EDW5o7n8pR0a>b7|@jlpJ%&xu=*V;J#s*<>pD&Yu$*j9{)W-4WLiJ0&Cz!`h7k|~_NxdaG~VT3zx@_!k%j9{)Q zohE0K)%ns34vza(5JTynb^K(SuV&rfE3REeFxR&&{P|_9Wh`BCb=(sDNi5C;sclYhJcoaSS6?d^+jB ztWk_$u1VicB7K*0#W9Q+^u;97!WqFajA-`3B+~Rt-up6cbBQ<7bZ;(0*EW)(f>|)?ZaPEjzf6?o5@|aHMWO|7{;}F&cE! zs1-9Ia8+_Oy>jEyplIcdSRGRyE8%j9@O%r(JC_ zX3Uxuk8_S;gzi{P#%J%H74K3R!CasV>zRy$zONA16~{0__n#)iS_9=^1apCYeRZR# zJsE^)3H!Cauff5Bv2xM54I zQ*#U>bT?@-xXl^CT%a3YYchUq_SaYg;21{eZqj6Qef8A19E@Nt(A!#=jPZ}vi)C;O zBXl=uGPoR!U@p*C|I#q3-J#zPj@yG{7@@mKlX1btC&s;<5zGbJm6?qFPHyz7=Bzl! zF^tf?VcjTKyH7r@bv^`hf!PZlfiYx2<8I)*8wJD+$|5q?ZGjO z(7j<=2F5ufm<#l%Gfc+DL+Z$$Q)UK=VTA4t(=ss5IW6V_efNPAlfmU+1ak=;_p5V0 zOk{8jBXk#*mVw%3M8M^DVafQIw|-^Z=HQBBWUr>_>JBL_1GUQt<^r9J^G)kl#Csf$ zVTA5?^2uNXbAe9gs~*oC70cilM(AE7pA1GY7wBZ(J@n2;<9@|4j8LuLWV}1_$hcoI zg1JB^>qp&vRbm+&!-z|#Px7a=CWHGGBbWkOF^t%B^dx_qkxvFAmK*2gfjCu14X??#?)p0MzLpWp1v=T+Zrl4=tSxa2BR-rp(chAr3?AoGjP-Sq;$J@zy|Jf8J51 zrxdkBZ_`r|rJZ~6$JKGknTyeQgD~qLy#2wQaFvsCu?$8q7v3O@>u87r_O=rls4GS= z7hV*sxy=yVOBlgidMaY&sC>wZI9D9Q2)sc!d%4Nz@Xoh!zhVS)={d^bQOPfPaDm7` zIXH$9c!Ti3FDB!ayN1T=2P2pZFAB!BsGLWqW(0HTIf~`#$3_$5a&QbI@S@<&EAz=< z1as**iphB7fsXN9!ZD1%i-LNOnvB^4o{QUq5zM9MD2GKQpV{#iDF4s)F^s?)goF3Pmp16_HP87j*1{RVTzFB?sJS8jn+)dClNZa? zZPmxdy@X>JffohW^i0b@T`_{W^yI~4-0{cOxCJ?e5qMEB>vogz!Rg74g%Ql9CoeUl zy82@KfSeN#iN!H%%x{FmaBV4ZWbAs+c}02 zc!RL@2$K=iuACuhTFj+qH727?(?#)_49746FAA<~l1~OBm`l%UOor>SH0~uF!w9@V z*xEWR18vR-=F+p88d2@Of5GfnhvOJV;0?mLS(7pQ%JFgSGJ?7AqF~B7hOpX2t{A~w zdb(q|I^e;(C09Uj3?uNO;HmS{GSKFXU@kq~F&Sg0{3D*PIEE2;QBb}dkiiJ%($gK2 zG473taSL(`Bk-aisa>lp$Y2C>>FJKi7&-L0xEvhA2)sc^ddZw;--=t15zK`b1^N3f zBbZCigDh9W=dFs*062ybcu|ml3^Ibb^gPI9RA}{|xOO>)5qN`;%q4B+)R%P-{fZIH zg%<_MeD(UG%JEvu2J8$xmSY%!7X|s}T}CjMo*FlKb~%O-c!Q8=8Pm3Pk`{yvMlcs%6eOAqmz)vIrKeQ!OdUh~ZbHt&G=>p)gOF%s z1=)^qdoY5z@S-5m6Jrs+9E@NtJ=d~a-FEObu?&u31l}Md`tFnW-Wk_bfFQ0x{&hm4 zh3`K=&*3nl7{Oe4QIKf*CGTApw;&^!OV7@%93!gEixC{d2)sc^b}YB=*%6n65zK`* z2+2OGaKy5_2<9n+azeaIWdw8Kb%O0hox9-If>_H~ zHFlie@fOIs-Ln5Uf4}92zl5@l7pA?sz z5zN(O)VS=%W9mmb!`g$Nh{ri2m}|$daoN#h4Y7W6m%Iq(8a`lLcG(6)oH=?9 zbCq2(F59wAgD6)#J{ZAV|4-L<$4gaR-w$9Rg1sw}1Qn5Lfrtt-#v6@2#De-D7Br&q ziHc}Y5gx@D;eid&SYnAS>NiGXth|~0o{GkxLL?dyOY99xVnqVKv(CC}?wWUR=AYT0 zv-djt^s~=C<^Fx|>B$?Hs;s(i_m}$2=^RIVolH+ATp=Ad-|%)J!lil*nx1UJ**?|s@%c?x z*Yn{VN9=do)TIB_MLHbeQop`ts@2B}Q|8utlye->ed5&Q!aqyLeXsVa_YX(7)THrK ztzGq6c3#whoIA%6AM7_ZxnQAmsB}9b8l(=KYW-v3F@5T(DjCNSdv7<@dTo#AF0bd@ zIgaSD<<#VxWgSyRt1pYor6#OuvGHp9FGtsPIL8so-fKzTey2!>BV6h)FSXdX`}AXb z)O9$=5n~=|NrrsTQ3p!b5iWJ;11&ax{P4uxcT+!ijw9Z==zrzI5iT`yZi~&Fs&kaC za~$#cSuJ%NrBr(Pq9f|5a*iWzJF?|})Sx3=>d+%v%=Y>3wA1UQ>l{b?bBC7y(RLl- zQuBs}vf63Sg1Oc?j(B~WmZZ-(A^tS2wVo>HIO2@YrdY3CeZiUa{^1ChI&{sJu%jp) zULVeJ#0IZUN#6Rm5FfOiQBRd~9P#zsDFx#d>f8}7HS~cgNp<&O1!d(NM~t{)O4#ia zV%ZJ9s?Tc9am4+5Oeq+tkt#>H)TFbggxx;r@Un7_Bi>$|Cl));Zl$9 zG$pJuige7q>(XS=BcJXKZ$Eahj+lct4lZm*_{l%puS2RZUUifb8oOEN{FLZY>CP$Z z*2~H{t`B=tJ8mk(Jx8sm_Ydbd0y|BAerfGARR?V}<{_3a@7Ids2<$YCxj_i859c@n z`$p%SRD^JjBd`m!>!2cpa~y#^on_ywmFA;mS>Jljo#P1X(A>8`2;~Fy;T%U`hvw5O zg}7tDHubV{jw7(&vUsczpB=tMOciuE#}U{)X&olSyAN(s*WnyTU@zo|O@vTB(9fOY z2<&W({$$M#EfEOkI0E|=3!f=MIL8s#r+Dt3B7}1sfnA4-t}H@0#}U{=*kp37CQ9bX3>&T#~9N9Y`Y@{XK4#}SRY`rrBY-1^w= zrR(K}{g%s{RUguUvT}|iuzRxUF+~XHI0CyT_Z%j~dygGh@8`~O1olEsJ6H%$m2(_{ zosE$P79pJD2<%g2I(BJ(w{9~y#}U|d$nxQ-a*iXg>yVYzyzQT^*N1Z)ft7yGU00^9 zeY;JvT{1_w6m}i58oYYbyXyIHjw7&#ko7^&hjSc(J%oHeM@w{$Bd{Y-JeD}e5%BL9 zk5|rd1pNEOW1@2$0dIXa?!LA27JDN1OF}-J;|TbJKAEWc@Un7*OTk;8%?6Hejw9f$ z&t@D)IL8t2y=SwU5U3C5I0C-+{LG1d?i@$Jlb+4aBkq`2w`82-2>9o&d#b3c9N|*% z&}TNog&TcZZ@bQM1bpwsc8PNw0Z)2n``mo|7rU{%T58U51U%`oqDrL`_Fqv?m2(^c zPkLs6x9l%T_nWZ*%MxYS1~3fQR*o@Bg>MJO~|*a4GoSWyxk~0>U|t zX!OwcU$|l2_Hm9QqBnYmQnmL6XVq;VN4OMx`Y(Pg#Iy~Mu9vPOT%j^OFmB7}1s!LzCztyk!9jwAd;Yxr70>83dP0O1@* zw5&TLcvw`r<-d-Ia};v!2$%Xrj~T&VBE*p0c8V5RM;$KpK%W`GU(%_d23?0sF}!bz zIPjWvqot3V-p+Bv;k(QT9v127Ib^%~DC!888n*k4;9(Ksvw8c~ElWqZ)QQ7q1P@E+ zG*uhjH?=;BI>M!%D$fXOA0fP5`8vwiPS|^S?uMe3mvbC}os^ws6d|1B2<(eodR7s_ zIgY?CN0)I$2%L~&U;#}U|1C|=h(#}U|1$giEz+MVMF z`1-T;hw2;%=QskM`(g{(IgWrIzSvH5jw9fQFSdQ0O80&UHA)5%fkEA)Mm~dZUXF&T#~N z%Ni5^bLNtIyK;^r=yevt^Whvvz-Rr=>075G_28q|ug`y;*DIiE9W?30l*BsX8t5rJ0X z97o*P>w=_xSw{p?@!q6l{l43z`Ix!kPW94tjw2S{Hz^r-z7S{5+oL`^JI4`w zO`nw1o)f}z?i@$VJ$h0ydWW8AsvO}QN0fdrDY09qLnzprTDUy5Z8ThP<@r^qmPd` z*sUoaqLHELqYI+-igx7)m%?t%{Lw<(dqb%{8#uzHuv_!}u|k}_>>Q{Ce0t0op)$GAI@-lhmOJTQ0^Gdjjd}h{m z9pO^gt;uGbX&+53OqEMvwj;;^uEVsEDyuIqT^w~_ymF2s zuv?SOYCEoXQN64h5GIA)nrv1(>e<8U`EZ0wVYeom)ixh{cD-~R;ZoSG$!4{d?%7>3 zN4OMrYqDAGi?cVVw-QIV6!u>7vl>d*5iW(@laF^)>7Mt|-|J=N97kZcCYuL;JNM9f zsvO}`*t5vyK_9Oi;ZoS4S@iV}3oHQVI08E~Cq7n$aE>FeL-XOqMF{6O0y{K!93;fW z?_6G=Ii2GO>{GniO^E+&|I7M5j&mG=-J0z6?>EQ%zFxYHa4EiDqgR@D{XE;Xbc9Rs zH5$FG{_^{~6zXs(zAYofTSv~Qw|3XzQrLSbeuv%>E`@!HkDlBst@9h7`>LKQ=Qskp zHQ9UmOV-M#+ic9}ARb6kmuMpuk7?AAQ=wGh+pxxL=5 z9N|*ft?Ak+NmF%Azw!0f?g*E{Zq2h@>WF#6>MhX`E`{BiOvk8iHZMfD6n1N}e2hQs z-XCbZavd%eZ<5r@YNsC86(Sm>!aj~XQ>D`Gul+WTR~<_idpeTBZcXNmntSJ+vCcap zTnf82+4^IhMJwy)EIl7Ch25IWLiU#E2$#ZcO=c(l{^cF&;Sad5r0yAGGaZcS#FY`xo+g$S3zZcS#F{OO9#3)`+sVYeo;OJ4bR=fZa7 zQrNA@?2`SizojteE`{BiY<6z`G@ENZ=Prfanrx0bx^HWt4wu4iO*Zb%UtWxGDeTr{ z;7_Up$?bAZcTRMaQ;gN#?tNB&s_?;HQ7DL zOpYy*LkcEGw77ZcTRI`J$T# z7Pc#w!fs7=r}~g?PZpMLgH+hZ$!>Z-dd5eE{R4YClEQ9HcANaY|7=(|pSu)xYqA^b zFaBp%-7fJObSdoCWVhmv>-|z;&Rq(-HQCMk2NrcM%(+Vy@8fi=50^q}b<-xBp-|_v zmT2R+9aMaV1qhdNH0b{In@D>M`Ek8;o#P1FcCxROF66@zE(JQfA9d`h8`Z5>=Qx5E zXP4Akk`Cm<5iSKfyR|j@<1Y1lIL8sRgNt-H!lgiGcgeoFVo|-7IL8sR&Wm(7!lgiG zH{4p*J-^dv}g-DZGACd@jQ|j=)NU?nCKiw(AQt2!x1ipw@k8gGHn}Q8(Sh~ z9OpQKdoM*g9N|)U{iOKxj&mG=w@k7VLf_n*S+CA<1o!lcQsoGj!doWUxusLL`Ek8; zo#P1lPKtCm!lm$*Np_lQ!Y3QmXHMrhg5H)Q9gc7*yk(M|@%nU)d+Igl97oVUBOSFz zx31fXj&LcwWs;pddu*3y>wVBUj-W@U=$^16TncZQWar^Vyq2x*oZ|@kfQocD!lm$* z$*_I5PHl#>raoJrah&4_dX0*7IKrjymdP!>q~p8a%U-#0jw9%2QhnUBuzTHRaD+?Y zEt3P+l#WH8XK(2_#}V{QNr#WSj&LcwOmf)ATcu_7z?)mu%gQ;9pf5{0uHE^adXI91 zOVO7l#Do31)^qL%m%>{nFTSEw^*tn8Z9B&i^nOW)=iCu4g||#Te7>$@)c@7<;T%WM zUsj~U5iW(dOs-ud9i3`}W3R>h;T%WM!&aoj5iW(7NwRzlJ?66d$lx4Dz$cf@oPRm) zxq6*D!lmewE3!)*;Zk_ZB&)%d?|-LW=gx5iym*;KHt*d|_3_FPE`^s#vbOu%KQ4&l z6=pT(ID&pZ<>UWV)~=V8BU}o8zyD$Hns%4M%OqK^t$jSNo+{@!f}TR9>h*!=)>GvO zmx8CTcs1b&m%_^=*?6__bJ>fe&T#~Mi`lAZ=x4vH=fe>$Mc-o48pjbXg*QO5k^0Gg zo7P*2a~wf$q}H6f?{w~N?CUKxN4ONdkwSb>{%yToIl`srjTB++6pDS9J?@bStKF6HONOQnTvo$IM`jwAd`da3lQl?T?I`oFCz&^3Sgw4~|b zVacw0OlzO`?X=|bSB51Emp0XDgqKRQ0-}~8T*}d+fi9K)_{ufazMUsT9mni5Em`r< z>b=3~Ix4*Tuw?b#h*#m%@%w=2pCXE+98DeVf1X%7^QQ4-cbOjosJ_y9K_{l(bTa+pK-MUj0`S;=Pa_m4UhP90kqqDTtyDx5n0 zU+JLAkUQ9}n%{3pMm=1LI_`V9CAsXCQq&=uh`$9ypA;buv^!cfQ+093!xu{j#QIPT zg0tU{>B)l5oufX{M9d6`PA?N74zxR3G*flh+9NC1Pv{=YYLDkylJbLH>iMX=(xsjc z&_o;+5OY%m@*ycli)N~RcJ}!484pd2I$phfYN!L&`O}vLE9_O)xx({^A}ORq;Y?M& ze+-XlXKshbw2P*WeE*;n`vlRVspHypN7lNX%Ch=+?dhScDp3bUiSjFzs6#Y$%-(cl z?W1Fe5C?HNS~PV`J!5g(*gGc2vU+EWX`$`1tPbcrEt&8I%Sz$Yaq^hOZSzt@krd)p zICYHr!&a5e!zdT~VC+$A#I(-|_UA*#uMzXa9!0uTTI05@DyMcnC?bla5U;|iBOMbX z0wdfNi(kF+FLp2V?4bRHoNv^!cfQ`I=Ohtm{k|M2nSM^%Os z(Kxnq^Z`dwNQux))y8kWTs>{4u@&T_?-|pQzkk8`{EsuHCF9m(xhb4F98n~Ncoj|^ z>F5*73ggm}x5}|TFygG-fMbbh>PSbph!6*HIa)Mz?EB4t>hK?P9z0;swEDQ~pC_0@*LK=!l|QEK)jP8ilh*)!l@%2MWYUkmRlT69T;nG9!?z! zr;c=_j))>D#H(=X=xB>xux!uRw=vcZ|6tG9#xRN^oH{z%q8+6Wuh7)7^rb14@$nHj#7hBja*7ZKQjQkQRQ-I1akWntxh={W8CK@B$(*T0 z6LIeM$JJJRoY|t1qWwvQ@?+_slv^!cfQ#G+Pq4x9l zt|`ayDz(+Yq4h$$U34BH4z$aLhm>fhDp-~kS(ch{z7Y)@mDGcye{i z5$DDpb<)(S$>51wL>(JFHZ@r?4|H>T77iWXnRRlt_7ftCrJCBaaOg-*IJ#EbW$oCm z<`15cJbS`+G2ZWOI3qdi1<+0H84Vqd$T(rVGIT~m$DAjQuWU5xvnuL*($Mpg*FV}e z#@l`3d3Ajm4aBIYj;~xgf{2XM-0tX%MyfvlYC!qGA9HNS42kg^X~)coaUQj%aMs|r z0kMCID3WqCTgg$cuBdkHdu%MLmaC`L*MpcX$K1_6sBr3VM3EHYRXBCrwEkMd-&{sJ zF}}0>3%0A36IznL{haM83rEf!Q7qNeo`s`yhaT{J_25CL#C-H@nU?(F${k{T+_(3% zWaKlTo7=N+=x{`_R8xBv4jos$^l0^u+mDMnV1K+@<9OwEw8B|dr@j4Xb=0;*6iK0c z6wb2x?l%)^``tD-wyV3Zosm2>zE@297Qdd6Ecp-UruK|RKFVKBsQvCfA~H@>yQ4E2 z`3SAOqW+P!#L%v4=cWCl*=QgRIO*uh8w1#*T*}cIja0q!_~hEgS3T8+{&D&I8Ocs> zeJ|$Y%RkRZe*TN^$9!Zo5W@nZbs-TMr>Wi18I4q3|IR+OGfwPPfsRdT(~}$5+dAr4 z`hNHx$2p*z+A|tD4t{f=+QgHI$T&^yj?QT4nArc6T5aU>u|AGEV@9&hc=Yq;_8EuI zsQ3AdhK^356}BEoM8;`qcXUQW$H*-jgx9U3Ga5RAy<3yLJO9~fbsHDfvTR?`%tx?yYqEF6L3$l6n)zt|#rW#xVWo=x z;TApYPnDIzslyRPQixaK)RA9Db+&aB*PmQ1as62;<=0V^;@XL5(bSRmU(sJe4-|bQ zTtUiT;)o(C#H(=X_~P3Yv3$) zXdt@0vPb1VD~QNA&FzlPXrwCWs0AIdbXQ(FJ=yi{tztfWCd=rKh>R0#Dnn;9Qk7q; zv43#2#s0yyn)+aVt=1@o(iIwXsdVg>lWK3w?;Yy{qyEqS)-&eAYb~RZkF(}Ys$G3E z5g8}s!_XNG9Zxp*sy*@AKCwO?KX!Vu@E53qruN(VO|Q?jSvYi@b4st;q&J8tmU1+7 z1nad;_OAC%w{f#@=;*ugT5bQzS;)-|eLF)#$DxaQS1(Q1YFICEeb&_O<3|<_9bv6j z)#|QT%F)m<xPGjVq*RUsYsZ`FhFG8I7C=o4O*Ky8oT$rZ#m``{9evO>OFCqmgq*xRj$a z8al$-pd8i)u@9~~X=>eP>9&Z%)44Y6^sN~@wipwOq)+AD~@bT5r8I62AcEo4pZx$S1L+Kv$uM6ty!O_3CAn7rZ z_HGuAvO0FuXXS}c5K%1E)SiVyNBfcYm%mLdF5-#BmpG>D?MfRE4v2)0P+!MN+XgQ#5NZ%;%LbpGQQtx@&4*v~GBbE5Ur# zY&238=JQIJ&m+R69G%g~dAeU45!$tccI>#G-HG`S%~YlPwGkl>a_DH$%=yYeYgbmD zcyvT~P5Ig>3rDKf+G*{|mnouHs;NB-N6y1eLpkhCL>($!q}Odjg)>#Z`^U@W8+Rq5 zNXpU7c{-m*9hjYIGc?E9nKlDwYS|BU3m_seZ%fM28I62|S*;RgwF>&j%I{A~)))bs zfvd(}uGlixc@~bcas<|vc_~LjM>_g+u*jNi^l2Q4!it_FTtxV|l-YC5(H|fSuvAL- z&tpE&8nl-N&#mSw(Jb9`|2!hZQM(daF|h{IRcag)u}bZ_AMFyiEHWBpm9B(4STbDw z3Z2D-vRbraV5Rpfd$0yWeaJ3x3lR0eaOfBiEWTC2@szc5jR}fiD)~;fz+ymih&%&);b;x;hga0B!Lr3a$t{~^|F3X1u-}JCC z^dV>A(BX(;so+VkqoE^zP9|Lsru+418Cu=3l{D@<<1`INHA$iMX;+^uF?gdY!5bBG zo{geSX6ZLt{iV`>U)!hB5-eEc+}8k(&S>QPs2k^&*H|$jB2FANC0V&GeXl+*W#JtW z#ZtlhVY6KreeQW`xYo7qmG!-XEF3x(x zEpLrPSvYh!0(N^|%F(Fvu#Z#GK8`FI=a8^ns#I^z&PL(P9XJ@(aOMv2iYDUKfOs-R zhyy9iyF!a*s@%%xHEC9`OL#70)k(90UBYu23MZo7ESVxHq(tFN)$?EMRk>qN?jkq8 zKQq_~)G_+&naP9OQio_FhA-c%(h^D-{X-n)BSR}DrYfDCW9edc#`yxKgf={+6i!5H z0Yn65dYn#hDMvF^9etMA;ROdCDD4BohSSb(7=1eUEIUd$nmWRGRSW0(VyduTbN_bC zN6TH|woAIVt#IZej90aAu8)WUDa0!@b+}i}Pvbp(*{pD;i1ndx>KJk1`0_6wiE~~lPlZ(W^uFtxNBLCWyRfTp3x9Z#5T80t{l6wX$@ctnw=ukLQ6;5mo4`;k$D|vOv)MWG%Y`gIu%VRvlpm6GN zM3EHYRXBBoQx>&w9?n`K$19G59Ix0CNyqbWwQwFTB8sFCufnM#^|!~I!+ZYVww%u~ zaxP6cQ!Bh)R`9n+M3EHYRXBB|7C=mup9+Bmfc}Vh6;2(gl|e*-6yg<{I(|EO@$fzF zm>dy53j4sFpJsh{9VnbS98n~Ncoj|^`8kU9!C8iNpwgv|{2bLNg?NRgj&y8~`Ovu@ za4^g0bem`*(y=`v#DR84i*Cqy4gKTQCEHSk7R^*OuAOIw6Tki9nCLT^XzFNOJ9F+sT=%`4 zp+!?igWHI{Uo&pS#XUZJTYJs}k9oGVDyx!0O#BGOYx5g`t8 z=xEW*d44`;K71VHe6D=t=W}u-g_H=*ROQbUF&{o#iY6j|rie2#&k+$Vn)yg)gV+b> zemEC=U+5+>>E-w zVkw>}A{y-~-Ia+5`0npN zk$xZS-Spa?e(Ee7I?|n=h$xn7YR|%pD= zUL5Rt<4ij^e%@T+)bVCG9sPFdDJqh3G<9^euhg#m{J(0DIy%}{I#ntu#49v)G_D}o zC&1B8KH?QkMB^$IC%f~#$ooy)H>haW^79kUP4_v2U-aa2>*okF8Z{X94Jz6h%{a~N zj?QSblF(~w!M7CaT&Jm!cHBzPT|&_;tFf#0sy(wa5#k_+juy?F`^pPzGTqI9d8U8TRZw~BE&&ljuuTFsf8R< z1v?5JdT`KFd(302RCt;Xdew+1ka9G2q&LGFW*l(f9bUNsZ7tD6q_@u^LL6w%Xd?3KT1ssZ*R@28W~x%} zc|*<-7d&jZy9O!I)ZqwmAfn;f6y8 zMu3%r=zFCV#+9CE<|DP?B0?Ob*U_SxkMqJUp^rc29Yx%5Ib;~`;GhRzc@ppDh$bR< zYiq$<8(WDu(C%o_Ox51uPU;DZyT=i3%+Tp!{$Sd#*)81jo5?(hrj8#5M01J|2XQ%C zGNiToe57dV$dB!8OB`|7jztrZ zAKNL#@tkPUOjW4!TCfvis_0#2K0NITCnD5&E!c?-IR{5lNQux)RijUaceTNRWuZIn zSR3dLcd6uvA}L2x$Ct_CwiR}d{<%*%*TS-#@CD~u)H%YLkADtX+_vNIc{;jC3h^qO zI__9=WM#)+(lbHd3&#)aVB$Rh#49?F5C>9@7R^-U?JL$AEhmmEqNyWqUr~xS715%p zBX3`^&S@dBRnop9-Eoe>sjx;Vq(o?@DjgH!NR1H=V>`6_s3w}JO2@>A5C?HNS~PX! z{cx-g%ze0biFid5k@v$Y^ zqNyWIRYZt`xEw8-Iu@=uq_XuILn;^(vBKKwDvs?wXDFOHmITCxDWXUU@hY4;z71CX z4sU07U$uYATdkZ2MN`MBfasYb#6et`!-W=29eKMw9owTt&X(^Zcs#v>-EfZW1yYEY zRzG8k=lUAn9KbFBq8LJpC#+V_ao?y)O?=zS&}0u#49v)bUcTw zd|))t`2y``us+gr8L^cVNg-Z^Q%9)5ifT~1;oxBITk?DEpNl3Uw33Qii8#>iXwghn z-k+EsIW>w>N8X>v9woaJQlhCNZSAp@pdaWh1GI46KNn3MX^)BsaS)fIMN>!qyeL~7 zYEAcRQ6IQVN<{v=C^?csN`z*rI{J`xzQo%re8{T*`c2kY=S5P8SK-u=e+!BA?4z1! z<|F?W5^E55yH@^#XwlS>zk|iHLTkr6RftzPr;hv`tVSusD>QYuB|{sBb_uN-+9C?4 z4o4J8Azp=3$NGmZ9{x;f`#1-_9@#qzr;fD^Q6z{1#aMaeyi}^@* z++*n$Ng-Z^Q-`0RbL&nc1L9RUb@(a0A}PeHaOw!H1oL1V;V`RVi~Q->pp zq#R8h;dPiwcpWC@T=oYz*d@{XfTD>w{=K~_8yrZ4IMD8B(M(m|pU4phmfoI+(=HKB zMBblBDf$qJ7R^+p^I)_^ecgwdOnwc~M5OazM2G|Jjuy>S<iwS3TLVuQ6vQ&3TMv4DB9tzF!mfDYqh$g z4o4J8Azp=3M>_h%e6Vjb9~h(X<{jcyICVIpNDA>PoI29+D(b-KBb!01ZN#f^>PW|{ zh$xamyb7m|w6#YBT07ob0>>>2(L|&@Dk8*zc1Me5s?rylDp(t66a@!68#?hTnuyta z1u7!Mfp$lWW~$Qlc|>5ft@l3Z*<_CrokxfR?T!}BRJjG9Sq*Xdn{Wyz!mW%VDMvF^ zX-kaxK#O}eoO=WZ?GqOfs~^~Q%8P}o>rfGxkM9@-=nA9?p_tqOjYAqHNIPl zxG=xM?*}Q&oC7Z)UG#opqm-kWs?_&dL;vv8Z8|9n9SUcv8t*&vG_Fe_UZJTYeH%CG zfag~}EA%e)dC}C7zKt6Z;vg8kBtaHPR1CD!DL=%yob&d#epk4D7q(n1S`S%k! zbE2MQ>5Hb0)RS69>57B6v^Ip4XzBT!@f}Fyuu;mJ+`F3{_U<-| zb#TpYvxARxvsgExsiSf4E|VHFG((G~j&vm)#}e2Eskb#^D#jc6h^ z_%ysJTiq%m#DR84i)N}C{ctlweQ+$9b3^DWGy6t;qKP6A+I?dwE8wK&lJ)NeDi zXr?MZmhg7R`J#zW3T1 z>=M4+hH-HC2OLX~4}?=k<9n}pDa0!@b@)% zS~OGD_^vbF>}M(RJ|9b(H(yAXN{#P2<7NLwDWpVbrmE3T&76bN_l(y1xT~BqRgGtz z^HPqcj&K&Irq^3H+IV)@6J*={cyQGBk{$hzp~^gWIy) zL{mpP`b2~{h)ZKIq(oCkhprm1Qi zce#IxxcG`(w(FobzDuQ4M>_8E^>5@*`>H^TX3iVOEBcMWp?8ShVfQDON{%R!ax``1 z?JLfM90zHg(Y_)b-ZkKNOk$lENg-Z^Q%B=@2F~H&pw`xTh;=TSh_sc&`CJ^7kLGqr ziDnI^CxomevQPYRMr-gVbCh5U)mY+)A}Q!lI8&A0agRFS5z_Y`+{-1Ji1dzoM2Lg* zI$AXI;XCebbE3UsZb!VL^9XSu9VnbS8qY>ylxdVg+J$C5g1u{RV9yS3MRD!4PXA#0 zq-!eC)Zqwm5EtwOp+!@Nzb>W|bcoBn@}jB35#k^&M~kM8#xpE4gT2GMmRmeNGt4El z+eH)6c!njDI{c9gEt;uH??=V@@VUq>Z_z}g_oE_09Oi@b6{HjsQ`LA*hISjId?pi3 z9qIl@923PsT(ajNC7L?CbfNw7E*zbK-l-o)XVKJ=&d$*y6G!a<9WE&urJTH z>+N;^vka$>#`AD&?chiX@d`~HX<0R-O1a(haOML!2TdJ~dqw0RF69YQqN!s*`0B!e z`|@pd%?9B3890Sg$5s5YL#*>6DMwRB`m$=w2YXb0w$#i?9l`ry->8Cx%-lL!G<7uk zcR6Q(5YPR%_Wc$%~bh|a_BjG9!{SOR>c|_L{o<et+7EK+EXS`tP zXMTp2gE+Qhqz0Wwhy(3zy@+P28s8kqY(up~#4Br%I?^|OW1SaCAzp=3N8Y!@{^5Qx zt%|54?_1*7E-Az-Gd4zZTracMxQ-T`>fl=zF;(IqF6tv%G<7tdL(axm_t1(aqVXIueY()DF&I*!nX0^> zVdGd<^fPQ6>w|s<(jCvk!Ozerg?NRg4nF}QuNpY+BT+c>;fNwBM^i`Rw*k@bSfYHn zgY_Yrh{kUN;;j!#u|E!me}CFwqwjlr;%5KctnTQAv2Eh(g=aokOtS+<>VPO&yJI#Ai~D7R{W0vcZtbS6>f~Gv}Ar&q_9UZ1-5_Gv>@ncD!Zx z@TKYL?Ft87DmkJ^3h^qOI!=7<QFd!T(|7y z>Q_4xQ6z_0rM{(9J(IOOA@QODk+XC;qs%6y0>V#8g>R=#?X2yvj@ z(W05E#xq5nGY}U}L)^a|=MT*Wtd9mnfs~_}DxYyU7qMM2UbZELQ->ppq@s>E!!f2( zsqtP>Yj{J3zE@Z>k1VFY6_yObsUx+0qRmhw1sw`!K5h@^)P57bW`Jh*#m%;juynX3F*9L}{oWy4t%`)cw5 zl}h=uIE_+>S7_=;-!F+Z=zbAjHHv1=)AvgvLL9{9XwlTsvCcnxbe&jMsI}d1SSOYh z>Kx(4b>2}5@d`~H`LUhzxxdOJnuz?^p0~o>?kbhWhn=`{ZeJ(*cjePXT)z7znmQWq zb8^29rRZqUEZy{_kl3#LOJDw`Xcmrpsg5X?YKpIs=%vzlSHHtMkZf0csg5m1H1pxF zc!-1a@|7&2MKd3%wG=HfSS(uidoL1A9gYwOaXDHvb)=SloCkfrgLRKRHpDABj}Qk^ zjuy>Sr8_3EK755mzcI^7;na~@OA%2dg?JTC9r?3SEK#0rq7IDh@H0|J{%lmE6yg<{ zIvU^1oE7%cXv5(a_65smo#7TX!l@&@w;lU=krd)pICbRv2iN`V6SPr86Or#9lwzMC zS~OGTFKl2Bd-M~`2j?ZGUEz5|krYy*aHi_#;hWy4r?;IjB9Hi(w!8qv5@T_=bL1tJS}?*4&uY9ek2B{;z=fyhbx{YYj)ZwQ^FyD<^j}{A0 zh_KETo<|f(AtefDs{CX>Un5{2gp_GR_0$)ZO-4c}KA-QMTOGs4-Q{bI{NIO)-$tQrs_4(H1t)Zk#rSE_9McW?(;^lyF zDMx?)yVm4a`!J^PM#kj}%7-1jdF{%zhtxEZp?ogCWLDDuuPo8VG4bQs3(5p2itrNc=g-ehKE0A{chLp2lT(`5`o_OAJGpNG z!^8Vml?`f-J+ZVrqSKI?OF8e(sp&yX*1fr zEr~{W9-$VeRw=aFSgCaPIbCa0L&^q(9)%o^IhJ$Z(%S5#&mh(sO5r=5RD)}u-nI6? zN6V|jLg~7cqxTv!J2|vPmi})iUR#}g-nNz3L!H0XcXo2omF#O+_Yc2w5$nuKe!K`VVT8MW(TwU@KkrjHFVy+C^=2oVOksLGC7!}k zX~Ii0ss{!{r;rbqa`enMTaz=+P(DVlU8+3%+3M=w0s@{Cm7vS$vc3ic( zx(`$>Ij$A^5#lY)MZRK2x1dlB+6zLR>?^M9LBU3YAs z+OnX-r5ufX{JJ-LbE)+8fVpjJZ8W%cYe4uYgR!=Cf5z*hQusPokGXA+Z8*5rE2PS$ z9F6gK)&A0P)v`ggp_lfn{wW~-c<=1wPX~V|j^{7zFemv@8|Vw$Hybo3Su~Y&skF_T zgKAff?N@y))VWJJddA(Mx`2i0y5IvxoAJ&jjB*8b?TRvUd@`DMTA z;4ofYh5E1&+0i}*bKcPWG54-Z)A<9ZF)yvp83@;0(gD#yN^=I#Sw9bBNwo5z$2ro0 zkwG-(t~i!7AfR1RidQjl^jY!E>gp?NmMR~IvBbwdj0U%F#*q^v#^SMP?dVar{daZs z?NX`IJCv?VIoij{@Pfc4{cEc~X)6Cc)Zo0HbCNMPAl?hxQEQ8Pb`A9OcGT>jUt)Nv zH0am;Yxk`&s{D^IUb&Q`-@A2o()SCE?UP;^RNMTre&q$B20bpcl70854z#NsHwBG+ zJRcC_#`G)i5=I}FanXe713-{3jPIX`9H-u&R~WYG<*^OJX*lN>Qeb>1x?uH9tr z@P7v#F6HQx{yaN5astt@bjzW1Ybaf}Yu!R}%c)fQ_oGY8CzLm+9UBlXZZr(pZ6JF5J0=p)mD4wph36B_MGGeg*^oYlW}%Lh%>cLTyl zOZ2F#zT#Nxqid;jLu>!q5$lYq_6s9}OF0^S@VT2b?)JNGL3xW&n^z{KmgT}{*cwni zYJIRp@3=$l>a0r^lzSbsdF8Z_bC-f$Dm2Pay`WV3Q@1bMeiT~bn*o8jNNv|!hPRkf z>6D>gwyhBm{R6_K9F6%ZYwe#;yte#suw*a~zWT(hy6pqMv235WzMf^4%>L(ITRtx! zU;((4qleu&%dDmMHyB)*5?bO$q3xbGe`dYyesA|#^|m{D&so+IH{NJ)<*@g!7=C`J zL6>rL)59~ZwSUxoaAmg*=eBLO4iTlThsLoMh^A9OU)T;E=kCk!Qfbv@gDXE+ens1_ zOH7rdpigM%IKMy9rP8ij%pLyM(5rR~slu3{mC3V5XEwvkF>V1|K49+fKL*6gP*yJG zXpAdbA(cueeYLtec#TqR&7i}rRLnS9HM&(>D*a;h>gt@%rP`>_5?#vCn4{#s4&O_? zYC-kt(VN#!3kZys@+a+b{OtNV3L|Q^D%$U|1=VR`<@HRMKU~VuxAmMIy;PXtN~P!a z+@SW%b4#nIr7ITMyKbvvjgwig@9e%o?Tla{?-JJME`{}u&~C$*O350ds`rK&=e$t5 zKEAre>XvL+(RUtIJu@I+C%TlQebf%`2%pupcJv#|%O|9(3E2j|+VWLcsWkhHuC+^+ zFE2kAbhwmT7H&(FO8wR!Rb3cHxbdOR-AZ-4&8^ySPX9Zjs&`%7zqV;WxRj&ao(rSs z*shhItzKTeJRp3X;g+{sj9PR6pQYm;ps`7q#i^Ci)e~Guy zQt6)`EU%sy%BvPq0eZ{q&rB ztE~YsH7#99Il6II|Huyq*H#Q(Fuxgf{?P1X(%&+h>Xxpw872&!lZK-Pmwhz2cIgWX z=Fbl!94s$MIU07?j$g^Xy8XmHwccUHeOt(fTN9%f23SQ2SKO+ZT&K}oO2mGQ7#>#8(;-YP8UB}#8 z?HT&HOF0^T(KWXK0%Lpdew2gvqXzE>EC8ID00$O;*5t4mbbcbdMiLOg!%~BX#ibk# zn?dzdDjoR9(&|3JvivHv5+4D4Uh)y6RO zK)@2dxfjdI*W|F4r|-l1FO{|%vrBEaPrhioDwM8EIoj9i!QLIyr#Ah?8Rgx>$bcF= z=OnKCd`0Igy;7+ucs^cvW=46tkSdpQH0pfXLahh;gt>gJOBPgj390g$^7++kHhd#@ z)aJFma~4#`gjBhdqkY~jl}7&Z-tyT`Z&N!rv=aBRdaZeFmP&t|cyD>oliNhw$E6(Y zKG{;~o8VR3KD3g4A?MyZ-PhxNKKK~|B3Q4{i{ny`b{|l%eI{;O>on=wYBlKap5uMO zds_JZ$64Ff4!HE%>iYrVQjYe%621ui^o;VIq32Ett=;>9uTp&V627z%>ibVW4}Cr8 za4AQ7zX@Looix7MZRgSK-u=zvsnoe(;_bzXc+iJ3sk*UXv5V@}~&9L$`b z9?!El3TIjEw8_Bo#_8>WA}OR@;mpT~{U+50y*?nGH7FW!Ak{efI6@pqIa)Mz9Q);7 zwYAdkbGo&y)dZwOGan}eMCTMC4x}6{nmXQIJ-F5-tkY0dZs|E%;dw-n6jGvarmFEC zJ->s5_JbEz^!*pnY**!@|ebGcbQaY$I{0<_-fp$lWW~zogKDpAm@Tqv?F#DQE_%h7d=O#b@#rMOw z(rh$(lp|cq(HV`?34Y^H-+w@Q`L-SFK;f)&M-)jpnmIrA@aM~&2AmSd693}N_eM{y zzs8@1BUK0eYHH8Ik@Fv(G`>7K+~Pt1@DTuhv8#{dSfX&2t|N-1kamSL zA43m#zIyN=rYifA08ek|8$4M!^5F=a{m4r>8u{4l-vg?%e#|jZGY+)-j)}sV4@VS9 zIhy(CA6{wx&7#GzU1=mkT(Z0&rEntN34P<<{fQ`&ax_!bcsHEm2igx_M$t~+e2H6MOUk~^)f~Ujt#2^J?=Imh;1N+Q#WQ#MGFbc;b}f7h zJ3XrwUTjUjU4oa!@NEvHL^Si^r`yDV6yG4@m?)b0XngAh-)Z2C%vY>AQ;VjK#sZ-PM#y7WT;b^;uF6v#qG({9kIT~&E z`0yS__p7?cbCzf&w?9T709JSK2OuS)*-9KC4x}6{n)wK`b4ByHe3Rg8RGF2`Jd=J( z(M0@mpGlQ5z4*3>IMD8B(M(nQk@uIsz3TK>RzAvPZLHZwAC#3Nilz9ic(u?{smm*S zRQ|JKVARoCJ3ra=?yX|^;A{3buD5j@+cO%ad+SSkR9aUNk#U;a9i7ogmES(oNR2Yl z%!#(7aJDN)6iGRnr5jGr)pUYRD@AbJYoKtJt|N-198DcpJkxFXqV%m7cs~w5o%6ZR z;R>gY*I(#1d|`?xl0v)+r;hx0GiaCicaZq?2-zj!oIbwRT*Hi0B!zetP8~O`zt-?K z!xy@MSUI63S@Q^`Sh6{F&|4x=OqjF+a~JB zXdou`Kc!L|NkqnJZg+G>BULL0tzB7p;?Xf5*@`8+FIxY;UUPdE4#ZkJtzG#tMHEXp z8mSuAYg}#f4v}o2xYW2l&7gpb?BfcBU z3YOlDFMw{2-;5(2Q$@=%B3#PR8I7DDzVw>vpE~nPX7HFFcK~fFte0V5Atj>Ot{fo_ zq#P}p`RLL2*xEX;u83vj-T`@7ASIeQ93c**94(qUZoTKJ;a7#+qYu8Zb4z_5^nRCx zBj=7NmTIzIi_-nUPtUEaI`ib1k4tBro1FCtZ1tx0{&$|6JT<;otdETDh{!n2?T*f9 zq$>T=UxykDc4GZIfsJ4NtA9-}B3vq~e|}j|EhhGln)(OMH1nI2&FwFIJ}q6{HyMpo zl?JR`d+8+hD3@|{MkD7Rgn72xQTNAwp7q*rpL6lK$;t)n=Na7*k#U;a9i7og)e9Sr ztX*{?zmKCiEi~BR-2dx=%bW>3k%| zT^~6!8mXG|#POAlMiG&5n%fUph-O)Z6@5)BdT~%Djuy?b`fr%gTAF*sI?pV! zfT({Xx$%p~rP9G~?o*j~G7&E2=!`}_8sGhx7QY$_?QV_uODU|jEVBGg5#c4g|n>szVvAM$?b_Kl5#Y4G`_=vZ`^Su#8;C!4~phInEzf; zezx@au~b^LVqmRzu&a@e%*qI(^QF^M`?|ToMrlM8OF0@XG2ENL7mnJX!`Ec)Jr&J- z`0GjHpiCSsnq}oLv3Z%`g&urq98#jG!x7>@%F&{!qwmIRwf!r#Mcsm2@U869X0t5O z5`!(;ChN6Ws;NB-M_C20K}B8zt+1fo_kk78cIAj7DMvFO@8ADa+ePVo?%I7Vn}s7E zVLoq@1yC&2WGi9hV?bDStqQ9z)OohT3N7RNlj`$5|qDaco)UmYd!0KiD(nqG!1qc3C zohns0bvU9(%F)!}-gCW92@c;4V(BWJ_2GyjDMwRBqb~z5f3XJrolL&`rS}sXeHqzn znvz1iLQ_Y&gB9xo){<_~U`Gk(!Xc$_BGO&5h$xami7K3>`^VpJRk>;Pff0ezvA9Kp zxcnrj!t;nCDMvF^N4)uH`H5}EMIEqYaQg%t*gLwxp>XQB>%~XQ8}=rmNXpUFk$>lo zH`XVHw+$<=@V>if)_MM&J4)f+zFr*?O&$6BwR{7@-+kcyTD<|`h$1P(tMF9E+j~`h zb_l;dggtE4Gj_97|DuVwARvxQ5#pc}9W9!r+xQ;Y^zd#_<_pJ+gLpOLu&h#xEUs(C zffQ^lp+z%QjW#vj%wzvhYe&3zxdq|W(P&e%N4XT@6`DHy%O`k;`q{_QH#s`v?lbE^ z;nb17{vBJQ*Oa6XufnM#oug`+2XTWV&VymbA$?&xW*pI!4>Mx}b);J`Pnv*!wDOLRn$l%uI59Yv!KjFxzV3>>r!yiJCBRygZC9jPOtNXpUF zk)8vH2<-RkUZO@$NQq`X93c**94(qUW`_4NE;^U*Wxxu@T?uf;gmaxb<0qPkFJ78b zdFSG8u@8y^?T!}BRQahFjR1%XCtZ{$h364PQjTV-W>>5 z(RqY8(C%o_Ox4#R=YRfHx40fu&Jh=Kt5b}ksiQTN?&x#)T>x)Yz3Cpk=sZFkXov4jXwghndLkv(IZmG7_6g#`u9fb%E1Zb*)JsGZNjaLS zx^2smmAj7W9uYWsf_4Rtr$lrfAr7=VS~OD?zE)5UU+sxH`05DfLA;2sx2Y7)b`{>^%sDqvQ@hx7_tdIP=&XmH)d3hJ2MKe|5jjdXE zS1tAr4L4 z;pj?j7b0BB(HRXNSvc`q4rhd;4(xj4mML`L?3jE23THkXQ6%MP<|Ex1jXJP1DjnDj z)tXb`)ZvICDa5Prx{h+#uZ=piN(IN$u5jwuA)Fl8Ha$5|B;{!8Xgn{x6-vb(ynmkBfL&o4zE*2M3I!EspItj4k)kp zWBPqmgW&l5s&MKEexI^DMMYAMrjEvQuXrz-Ip>RFTxaq!+RxZw>xRg~FMSgWi0!D(^>;6yjAlb)@@hv2^9%L0oQ4il&ZqUo9fUL0pa& zO&#C;W+w!|RqB)l2 zzZpg;es6?m(bSQi3X7?dg$xew+VRf0!kLfsv#io@@I*wB6yjAlb>!dd=Xm9QvBrIa{G0t8uOx+d zg{F>1Umw3RhV=3kYu2V{=ED)ASVDN8uG(z2)q$uZhkh#6b=nEt)w`UzLyT3a^{OnnYZ9Z5*~Jq(oCk`f`0l zhyy7{i>8kBE!Nmd@LJ$yuh4(xQlhCNeTy|B#6et+7EK-L3Dbz+OX6G)VrK*2pM;dc z^N1oTq(tFNRsL;U#_N{1XzIwnjmy%7ErL>jlxXS*{iE`)wT8re@C$N$+YqmJ>YEJ; zr;gA+D(|F-A}PeHaOy~31&%uOCN(${gYQITrEuyyb7ldM-)jRUWHSKpRB=bpzpBytS_2693c+ka@+A7vLe2Bk% zi**hQ2jQ%9M-)jRUWHRf%Ns9OFWV`5PhW46!}30A51z9{yFxg1Jn+fO)n5$A-qY_W zg?NRgj{Ns)`C=>Hc*XaGQ9h!H$bY{!{}QlX1!n1{ul%!Jg|v^jg=OV^0;xhc^O1f@ zAR>ySkP?M6ReOa~XV1M%uK}#^rcXJC!-LRiOWrXNO&uErKf{P>=4X(UqeW9k`VCO# zBlS~)gRfQS4Sjhane+4;pb=3dFJ4gy=s?s;f zBcezO@hY4;e%0Y@?bzekUa^YbeLCB*Xx2x^v$c|fKR{^F)X{iW4d2J1b`td4!0?B}$?*n?@qsh{UQZFzgI+imtP#BMeZjGN~QewiW;R5uh7(y zA4@o@aWvq!YdDtJH<2nQe9qmBA}PeHaO!aHhuRP77M>8@ZxGEocZ4{I%h95#Bb)@R z>Leg$1H91(4(1HK8>MjSa72-mqp2g^gN!F2bk-3Z>>}!|Nzr+PIMD8B(M(l(Gc3-W z-bOJ>;CqmWS2WwMBgBD}qeU}SjdzhbiXtwzibYdLI_}035aJ*%ADu;0NB)}@Tz~jJ zuvRS8k^iOzS3;6Pyh2k){##p|KYZjAO&$4fZE^i_Bi@-U!juk^e4oIx;NBSCxszu8daU;V#(@$5z6(;$ypV8;4dHts2ox zRo=Ihw~!PQQ#F-m2WzlJaS~7#0M7X6yJVuNBRxA95#pd9I9fFON8Y!@ahK~%j#2b2 zY20;0krYy*aHcB%ZCTDAXc;U2!9FOOInRGvmQrYa_#!lPYuLq7GR_hzq+JTVBNxRWx;^ z`yUY@4&rjOXzJ*A%Ty~NSTD==Z z?(owar4X;s)Zwj!Era=Bi(v{C&YU}PoH~vTuTmt}bmw`|^j#Fx6ka*O3(AlZ z%^GxsIFQnNDUcFP9jOPhhH)33#+_EMEuk0TyNy67oH`s)B!zetP8}WJze3vu$7f{G zM09-r3KjsgnXXPA4IpIvi0Xg?JTC9btB^bUKb_g!KhU z#Ko@;)2b0o9S^rntjz97gg9sojuy>Ul72ZW*17vwy%&k5j`ZtX5g`uZaC?nhxi0&!_JKyGomRr?gBQrMd)Yd51v%F#?!y7Lp;mA)nj4%UE66Mk__G!g0U zQbdS@^g3EJ^O2s$jR>SyzCLfS3TF+bCw?1RyK>tR%~W+fTZ`El93MaA<)n^|XKOXe zNXpUFabfsk=yzVq-m=g)Yc)DUN;GviLL5k8jVrWh>d5bTaedA`FWS4@G12-wzvtB` z74^lvFve8$ZCQ?q8mUoh`U)RwF#l~?j+~N$4xyQk{5~hOa|e?tBTRltR2h zQ^&Ay6Y!INvp#TgS@SDSuBvnu&iZgfkrd)pICZ4w+p8FNaZ*;_EXJwQ+n(UtR0^jK zM-)jRUWHRfdOA9`cKC`ndmrxxarJxHtL%dcXMLn6upicC5&> zHVp5ccX$IrdytZHGb$`Rr~%F&{ksDa4B!L^yRcAS_jqa(&d1Ka0cq z@SRH0MC8xnEP;>p#!L9EUwBW;4{jdo zSu_!;w>BcgL2GcdXtt6~w>`Gf?JL?oJzl;z*>EaPW_JDL;^f08`^R}ubRHoN<~v7= z<~%s%@ovLkNMBr>`{C5&*)B;;`=> zIK~pJ;s##L{aSw^R5a^6ed#tL#6c-KS~N>H%s6eghC7|m;WG}P;xmLX3xc#Yc=ED(1QjVsMbf-GD63z683p>@TujP7K;Y6gn;So_JuynJT}DJ z%F)i(RN*Taw{2BBwevx-l@v)KUWHRf`s!&!ActC?qkMFZOySIjBZ{ODufnOrPtf_U zg|7h>&bI4_A}PeHaOz0?iDmQ;c|X8`mtsNZ%u@)Oh}54L5iaFu(M(mxmqK(-8#D5_ zQ9NrPnq}4TH4;f-J{MXvQ#J7QZf#Gd{oK8P?#EX+bvU9(3h^qOI)YcN;T|OF85~%d z@^Y&NslyRPQjTuW5&NL5S8xz7`Xl01c!Q3HUh7hhrjGQ5@z{2K*8(RiaHb4sg;R$k zilh*)!l@&@eHK#%+dyYOw3%+bDw;YRA&ztit(d4Id^e-2?`HVv7SsXu3K6fuslyRPQixaK z)R8~ew<+81BQujd52s(0r}r3MD&^1h<#&#?i_CuhML5SfG~HdAuxe&<$(FsN&9L`& zvy!%Nw~sc1!f7)c`@*B;!_pgWMN)`Y;ndM1ytc6JKI!`mS6>`Yg@N<u(#&Myu-*-6N4$;sI3^&DP7&fj%F&{k zs#Hg8?LhqSrh&1nAa&H_fpvWdXR1;i5m6*1eLz!3m(>HR|4rY&x^Y-|v!s3d$oa#G zt;u`Ou|5<|9T%?}Q0pl3k6&Lit3F<#?V_(BUWHRfsE^_5A4O7#SK-ugbhjau*{cRu zVDHWwIx~5DC!Rbz^oW_ssb4W43a5^~YY(Z+@64NFMN%;zDVjRc(v3C)O83s)xIXt4 zwrC>K8jJ{Wpxx1;nW_WU7+8KH9or|3pB2Y*#O39qa3VJS&cO1V6j3DQXr}6mpLef( zw!z5Q+7Er8C7CvI@7Q)n&TUCP-f{0(9}1_AzXrs*;dO45Zjlt?RXBBwxM!=%vETAd zz|YT`nUvbuuDmTNoH|zhVXMkDDWXVALo~ zt)}dMluIh)noAkv66KaIqMj!`7`HLTB}~R8P0e6p5|Y$g@5^s`FEKR6uQ1HdU}7#A zmr^~)Brz^w0LXY}{oTJ{6P^-kyd%7G&e2s%i+j=z|Afb$0aXk6-gmphP#gG<*wzk zz8sLtIXD>Ye*Tn~6?5)7uCx98|E_UFk(8ocM|GbO({!{;Ur=uEaN0?<< zre#SEv@4plr|N7g*%j~kTzg5U$)TTv^H|r(p`RmO(vH|-++sTyW) zc}-q(aF}b)>@nGF5g$ML^_`sBrKDZQ_V&Kvwf4>-T01$2OVOlV$KThiuU^yTf>0l? z?`5x?4)V5p$#-^tFj*Tg+;#l!v-Q=h_H#s$RLE0;b{)yuAn0IgKwPwUAVu1BBx{3! zAO}*4Cha>Lo}K)a$zd#Y^Qg%w^#>FQ{yb~M8sVdE|={eUQv zLP{9!sY+}gPnFp_tPdSOV96ldbtJY=Kom(KUWU7l_f{;azI2G+0A&q=^Vpk>VQq+b z8SXl4Jy^9hXV6h3rD)f2lUV@2NnYE81weZ@*a^v4!f@B|QtLxX&nAc>Da6Zg*P(Vh zXHIbNm7RTsv?J7RCkNUUP1;kH*oh(Mm{Yk{)3h_(5s94`5Jgf*3Bx^Ay?T+I8G!yB{Z-pDnaq&IaIcKLGJE+;zmZ!%|63c^643 z+I95UaB{hiSxnHu*%=&I1FQb(^Ev632y&oZ(WE_9Ho}!T!m$Psm#(l$yAB&g%N#|? zL0pO^?K&nV2) zkY3##BJKIWZq&2KCVoZs`~t5WT|9lEzz!E z`|SU|?`7oH97(t%HjWrsdM)w9RwRX#Fx*p>>@x%%uyLpZy^H&a40j#LK0`nhNg-Z_ zyAHFjO0=(XBbnH340j!7UzKQI(dq+-QX$?1?K+Y^7^A3Yg@dCOE9sU9a-c)eq&-zu zA63>zn1yYB4{>SvFx(MVA63>zk(8o6Rf)YDN*Ci2>L75Wo*C{s5_>lw*h;{ml%ie7 zKh3gy!cL5YvXWIb>`$x>fre$kwYr@(FzfY}FC9@Ng?Jh6I*wkxzErk5Qb9+ue*q46 zXoC*f*NCE}AFnSBP7p;>igq2zo@MCg7y+<14UUdDq#cp$Sq20-NQt6JBRqfIxD-v=baO=u5)Nh`y5(ZiC^+} z$w<2nMUaD+_Y_SU;dTPsJa}yJneVC*fw;b@)K<S~L$>qx#E1Oz!q zucAqNKK8X$@Y}!i)1RMSURxP6ZtsxxD~8rq<}CI1wn@7VMUaE^Dw?$CBe4_1SfVov zY(sqiLc9!j9f_S75Jgf*JHtI6Yi)IR-hMt_VGV%qQQ%+=$h}vFyN;jO3i4JvC4|;q zB&BHA(fgWL=Kdu4(y(-SP34nUcMt8g({2+gZ@jg8$Opq+ha!rkP(BRzvU+IsfcTdK zd>3cr+Y>9>F6$EFy*Zv(IplzSgFe!(LlNX4E=7}e9sf0tT&t4Z+Mz?Pul(^=ymx2s zu-M`^xOng$MX; zz((I0_JkhaweRWdu&QFmP;$^t&u>JO!Uo+ZoXbRsy5SNYyq+N&Yx5xZqLJs6(g_c?$QBJ|(RaQ{ZHh$1O`muI+tqkq^=&n@24?~*+`4zF|V7248X*Vk6g zukIDvF=@}odxm)bA^)~b4$4H)q`jD+FlpDJ2yzgYqDi|B`+i>K zH+mf{bsS{4BgWVc%SZOz3pp>6LOnCw>wHqFYx&f#+_L1zfb@3y;`++*+xb|+aMv-> z5N9NaA}K|C&WD@to!#-Z*^O=O~?*816b0Q6z=jGTd|i4|@fCQSx<(qbN9!jGma* zIm2CtB8sFG?K*z6!=U)Ri~Xw%EXY5WeIA^*VPfT+6wK#+sD6iwQ7 z*gkd4Z}hbKki&o5`9yrLN4yMo9kx#$^BaAUl%lJULR`1pWo8*cX$SXAQ_fxhtBq*T-2KuPiry?q9H?-ec49QEQU4r%Dmz z1nq)mOrEO53J*01D;zd8INHKVw?vQw?TRMtsY+H}q0X`Lf=!LMu-bx64Jp#DLlNXa zO3|cU$8)xmI`eLy)%Yb2abcF>*)h_t!*+3Eo;)K5<*sPbULR(WmCYgxHxxK?Li^Y6 zUzgf*q&-z;^_9))3kY(cUD2dHRaS$s)p@YUxJm^FEx%`9x93Q=M3BR>!b%uYjLB2= z?&|d=TH(5K-}U`*!G;Hd;jTjwMN){D;jZJD_or4*y}Csa<}!q*&}mmo#jb+mqG zYIR|PAO}+I1x?y@+-#QX4#~+(&T8Q3nuFo4LlH$%igq1|^%~kPS9jp3g+#g~f*fd9 zG-*#&k9U@oIwkLBXesLYjNxfMO3ZnY6jH))PgUDdBTF|VJM>qq9v|uh932N4?m84v zB&BHAffJKFjr(kAayY+>xYW`k?K*BT#LNM{Dk2AcP0^&i4_>+d1@X@2KLK+sEda!& zD>~AyZOSoneW2HmXQU(XPXG)yj4nHU`NIQR;Lb5e+xv?E@& zlN^UHcLX_*QZ#8#RkHgL#w)Jw&>ArNaP%SVtt8oD2?%l!m!e6#4z!Xh2lyz;ks2Ir z8KfP7mdLMtdblI<-_Ki0A?-waKK{0-UH=!8_25VUlkHjR z8j#_xW8NF>`oGX@1qlwNkXxcX=Vn=!X<1^IgZub73rQ`f$gI~gtyh&&G-*#&@)aPo zc37#{lK}@i|Jaj3N=Q2*`O**&NQkWw^hPt`R&hR4?}_T4Dn9ssBPhT6&w6a2mb zX-AxX=8V$@9Xb9g)8`kxAiO2u{;MinQlL{bk@p{L~+p!`O~f<+t4B_cTa5Lj7fsgLoB9 z+EZn_=P~!&kG*qZy2q~8J?WMRa!@{sChetbyHPQBqYfHf8}_dd7j`_ce+4PhuETb` zV(xg611Uw5b{%KfdDM53cl)@D0}fMycp2_GX4;pydC8aRA}K|?4*mMtVcGb~2VWi? z>f^}A##gF+`-K`L?e(Dua-dz&q&-!MB@@~%TRS-WEU&G6`i%Dv(vC>1B_B&fO3|b} zRrzyd6YLzBkL_bePN*zj>0|qErh0gis@yrUmQsk9XxH%<`);>ia=t`oNLu%Zm*K8s zshwwdoiF{#dVo@>1ERe?aC(P#$>tw6-fU4nfAgCo?E6P@E{C+I3MYhUy^;g%iYD!; zy2M7GGe2Gu#$A*m>lq`?{wj z)}DO%2?%naUD2dHRVX9>)xQIg%^6l#2>VY92NR=W~ z3N+?j&-pI@tV?w$M-jLO$s1!)^z-Gf6(UqBe{*uy@te;?zBgLwDn}7I#$+Xhd?-St zK=W>=rE12{(o`u&5&7{d(^3;FLZv{{o{OU6P8!h1Q8lr06oFZdGis&*`A~#PaUS&g zIQEba9;XiFDB{gmYVE6>&)Rt%icl%g7*|}!e(^WGsY5x6IAK<8rR#_y9g0vX&<~tK z9b5iitF)|?qljDXsHA{~lQDbSxxqK?KNY!=!TN>@3Gczr@`<+620B{|PZE00hq z&_kc1j;Y%op4NwQ6w&kIS~~$n9d$q4DQ$_0P$|$ae?uJ??lv>%K>tvVBK|$Fw({Q1 z)WLi-N2nBN+>i4*Cjw=q97PN{5?}j$tjy$rP>v#|_NlcuREQXG^ZdsgR}(8o5tz?U z9m;$(eRbARKzwUCSAOVw*W!)5X)E9EGnZTDL9n%*3N zoGV8W2kmDT&bT6kaul(sQ?2`a|Cj(97T-&c4Fn0x7=nlPo6*ib2^qNM-kXzxoNked?-St=B%1n z`ROd`U_Ov4+<5;5ZKp6Pg{97SN?XYRLs3wo3yRO*ho z6Dzx(OC6dI@?ACmKUW;5i0f3t`qIeIO<@kP`b)d#7V6t+KY@tZ2S9RX=_)GBH&l8)#FUn!E64O zwh~3CRPe<16m<;$LA!JwRE{FxiLE&2icqO#izY}uH0R1u#IaS&M_N{&ANbH?K%uOZ zqX_I8v}`5K5h}Ip{s~g&OcmOdauo60Zzo8*df@I#nkwZeBJ51G=uyz22$kAr>;&l_ znkwZe;`?C}qz`sI_n43>=unO#qLU|VV)RjjN{v2!f{Z2Imd;LFNsc4&PA^T6@oMpL z_oZWEjw6VH`%aLNdi`se4n?Tc^llSm+|{yDjv^-8ndEG2pZ8YZG*!w`#HjCUHZcz> zLZwEunILnNrb;=AIPaSpnFl|8|BarCzo0y%Iqlkx>)QHWX z`B07`j(W)usahF3xswP&BBH#levn*$Sv@RX56robP&aV+`>FfvF^`#EwDB{c~ zYQ%=qd?-f|-_J0Q6{(&0n*}RFJ}{OjM-lK$ky-jn-r6T!(JMlw_I$9Wz1 zry8-4ADlBW&ADZ=#NFk2a(^SA6wQ9FeOe!iP${f39_vEH>3?~-kEg6AR)k7n z&9Jya1oMF!RD?>w>c>}WU(tUt_q0@pauk78#>|VTW59?V3lS=XHNzp-6LI3QzG==? zhf2ZfpZ*3@HKJ|zw3R4F5m;q(x{W&4U2#{cBZm+vtQm$pLy3e zKOoRb6roaBGwia02u+nDR0>uv$7%E;>6T1iM1bSOflux7~Gm8MD& zDiy5$v_~EFmhX!~hjJ8wRYul7cHH~ow5$}NQdl!&eUPa_KUYLf%B=ou^ic%X9ONhh ztBhsSY3V9LrLbnm#;Z-~P$^jb*+{+BPtHhnC`S=kWn|;-`M=sREvpM+R?>RQrp&UhEm66R+HmemPR0?Z`Y#!89sScHb4WC&V(=Tb2mX&f8 zfmKE}JHI;c-E?iB2$jMrqm6% z6Dvm%SY>3^((Ub@OmnUXmBK0`v*FC@3p$VwMW__k44Iv%`A~#P!6MJT8=N}j`BaB; z6oFMnX1(6m_J^T#(Q6fB2)^ijLZr@X6aR7{n1>9N@113bwU)q z`si7OI#g=Y>kmzpN+CR3tL?T|pU^*0ABs?^udl3;Z$-Nv+dkBJbA(EP&b}2b-2b(- z4=P6yr=L}`iEmztP$|&aH?I@^*)P?h97WuAWQ}~gJLA41vbHO6sTAn!+uiSOS)E$p z%2C8SoohDn4N?&*1v>i%dG7`9r#h6Q2%M!T{+6l;mE!3Ox0cr4_F~%Fm7@rrjcRF& zDng}rlEV?5dmNP3hjJ9bb6G8QC_<$`XWzDu8oneQMU|t7({3G~o)(ItN#|W3Mh5gj zMW__$>>GWL3zns2r5r`jr))kS=pTwuDbVou?1+2X4oXv{97WKdtt0Myee-lIQG`nI z6rv-popxY4mMBLN^!@9I3zxr>rb-bi#S@K=*k@L!6rmhNym|Ea^dwInLJXZ2%fn@ygZlXI_w@xZ1=WH!16{FP6Fvk zNz#5osE_%E`?iDoHY5k9jTBAVPa&Dti2n35p||CD0vqu%+;u3TNDA>X+;!M3p%QNi zsW$?>yTWkSVK>kbz@+=NGdS-^SBd#;Va|wbRXje38Pt`@+4T{f6&L{Fr5#mxQ(yqf!G{!v9 zNDkssG-=n7_j{i0i*P>x@p8w)b>#h?`<{hLAzq?g$2sOL>+O&IjVgMLKuzJ+H}AWX z_8K&QOJ(!W6zZHD=uk9iPgUZjAa{EJap6WC+Zburk$6G~2yze??;b#kwChMtV24z( z*CL0U+aX2TbFK(-Af;&1iH^?)l!sKhhIXa44{a?-k#-%2n~#a#B)o3 zjP1Ok0EBvLA?-Tsb`8A41Oz#(4|?%nOkN-QZbp%vfOyp!h@xan3_8exl%h#{s$RF# z(c4|zzKnbnS>BLBFUU@2+6Y&+5iTIefs~?2yAC@MU*?H;^ck@nKH zQ}<<_x+e!xiYDzk@_r!whC+xd*~@|ycfuTz_XFuWUMi(%Pt{9X^eXSNd9TpVb#n4VS1L0pO^o#rEEKJ@e_ z&s-v2hP#g6ZqX|ql;pff3h^@BbtE27LMx$%4aB7$_ei@AMUaDjplH(GKg_Q|+5C|O z9rOtXj^1P>-4a0#v@4plrz(Hn+0V)cMB@7ux#f9!N96B2yN6gv@uWSZNPAf&GiM2X zkX}`gUOmlE+Vhdj&H+IV;#D+hPgVZSm+Wg8zXCyu->DptfAht^RH+owPPFI4Jn59_ zdxzeWkY4pQ$Z*%8h$1OPd(QLsg#Atf;?fc&?K<-JgtOZYywdy%odp?p?YCvE$`r${e18dp; zE_EFYcO8l-l0v);cO4I1d1ks_!h8S7;nY4&cHYDN%MLlR$xd?c9jy8nyQKS9Dy3+8 z1oE<4w@S~2XYs1k3B8)^L<)7F=KP0q;TcB}mmO{~z2>iWQ5yd>b}l^QD57omCOcVE zgiwwm4%)A&Qai2)p&Ugl>eOUsiipUc3(q);$oq%Oa)NW=8A7FY*wNl?>_#1mP>v!# z+p5XVUlk#gqlnSpHdcQ7miujJel9%YD1x5xyv{XM8kb7VS=Cq>Jc~LMp&UglT-I3G z?e|3pg7`L-U~=MfgjxMC8wfH`>WX=O}{S zv|FZ1<5DSqla)I1=fWH91g3Ko;qSf@kv|vSXs0||BIy0QWvVnTl{)B(Mmv-0KBcpg zLa$YhBH9dYv~#aSUPnuz?l@J2gn?Hon$9TTs?N50l`;Tb}u zKreiXIt+27r>rJcjv|&VYDjfQk)D|ILOF`~eprL_ z!Th=KjH3wp+0WMpa-NGT@!1cl(Wf`0BSsYE&xH#|5YtNy>8KP%`E%jI5k$`8f0REL zo*`6fdbfsjbj?Z%`B07`ChumgG{_v4VQOOKDB`?t z>SZ3h>;pd+j(jLb5qx2wWeqAqr7l}hzlqsdIf{6ANxj$%nh)hD;;5JE#V*O83(q); z$iMEGKNp@MRLb8IrtOnI7ha#*QHt<4i;2*DC`S?B&!`tW@!NYV>6cOEC;~4v@x99^ z%AX6*;!>$SAFMC1UNK%NM-l#FI`fe~7ha#*&WiB2*J*`+^^l(n$9ZbyC}Q#-ET&|g zkd+i#qH+}R>|OP;nji-GP>v!%^Q}F~;~ytdGL9nnvYfZ}eTSVMzJ^1Ga+)Lf?m-ld zdU^kJj#7la`N0=MTJ|VKs1#oxYl%>fBKR(uBRcPKQrfPR(;PuRpi%VvxDV5OC;~L4 z`0i56R4GEG_Zw(K-HO_g#K!M8aa@#(9h)34!*P$|%Of3jt&l%oi|3-ZY`{wit| z_4vW<;j{?qTsh4VeBUIB&gwBewPX~*_ePKszN6}?y0FiHv~-oz9KpA9qv)vNgVUTV zg72mvUi!IfnR7*`6lnT)%J&cDD1z@XxeoK_5OR*PQciOO-#CpTJ(r;f`tC!#c-sjt zp}Gz|m!Sxi;%iWj&~q8eQ3T)fa)h4CP=reH)h8HK-g#QVT#iipcwK&q}K%R)k7{&gQ7Ot-GZ; zSB@gomu98`rK<>)0?oIK^9bcA0)9F1;<1;NSpezmteoZuS_4sJRz^CjDMI~y=KY0d z>4G1YOuI^f#=E~Q+m&(@0bjFtRoM|{k)`=iPIE+N!qk0cA<0t~V>TPFI zNB$mUhEOT&sxSJ0h*Oh$kVutkS1IhOZ|LCfL`Km~%NC@)RuL+NUG*RJBVzkAN2NVV z5h{f}^4|?3f@OsoRD?=l&l)ctd%MctgUmRJz^?k;H&I9a9%P14DeS739w%bjf38V; zlxkNg?2(t>B0}?_2$jN~^)dG_A2-igm+DZCBCxA|)n**2_dD*QLWD|TSN-uWM0`Kt zjmz>;GUF%$yXrG9qK^DM$PA%U*dssWdLr`o zATxwYVPAau8%$OH9%RN*1oqoI-9{bxdys+722+9SE;beZLcbOSt&v} ziomY=$1!z`>#g@78||c%$E8x(Bfs@!A~vN%rLfD*cb}WzgUmRJz^?ik%c$doll&ee za;|Zy6!yq>SwV!RN)alBU2eYO97R_p_aLD|If}rp`ob@$BYzJvi%X@j-#%&$5t^!; z4v`9bn)y2bsNv ztqAOqXJy5lqn~SBDurF{td->NL1r99U{^h>b898(c%^Zv6!yrocBQFOgi3{7?zBh6 zOEdp)%25P%)wBMQzX#cn_9&IY9(mRWnJTnI)sd63UG8l3Q3PKHMolRK`|a6SlD`L; z#idf%Z_mc7P3cf6>~d!#b^ab?#!&=z)w6Loe-Ba+B85HjY;4z5sdkmZE_XH$=I=pf z97SMPJ)5I!R!iHJ#-&o&BhThRO_d^43VYU>mGR&M+3kMiC<43c+3ftkm3Py*RuL+N zUG>anIAg{&0f9cK2$jNqduEqtJ`|x+*t5iPBYsN@2e}vyczE zOz%Nv`_w9hUG>ZgU$EHkK{nT+QrK0`)&}`|keLpZ(p~i^O5XoS&PHV`EUrcTY?O!l znWE(VkANtW!brq$pFffpJ##0WaM}nj!%P|F=azWV$#o>Jh6Y5Dl%oCI(kY)0i1)4d zIZJv7MO?TMK~JZoUB|ay4v1ISTZ(8cc)UG; zl<2AHC|dpS{p_`6J;$!-`4`kyUbw_#ilV1q|2&+(vTrOogi7g2`6&9^e!t>9ud;F! zq4!&|-eK*ktQ=*4+XF)VXSuNX zysQY7%D<_XVJznxviBJkp|A5r(R&Xc9QLoELph3=GTZ#H3~HV#l$9b>3NIz_jpQs% z(4ibf;7x*OF7;QHqiDo|kEW?ojw1G~nOOPj@0zCyIuxN&coCugLF(9d-jK&VZ8c@( zDB|IP6DxyWq>hgN+$C)#icl%Mw%PR~>R8x%yR?-kM-g}(`20Qm{ACo??YM8+N|d9B z+gnepys?3)%F4Hg0m#zgZQ4uPIcgZjY`zWfZ zQjQ|e?Gp8t9CR3RUVP$|3= z%X7UpJI^{ht#jol0&fZRx}>=dq)HJg73h`B$K}}ogi7%oa=u+5 z=gLt;{v5KEZrZMtqlotouh~SMD?+94eq2`P%f9|H)u9|k%(Qz&S=-%f&{pZlpa_-X zDervFQC7-P1Z^KjjBR&CXjdpJymoU?db!FYvK zDMF?2HefbhX^&ElBJjFnHj19R?Y?PiSB@g~I&Yke?f13bE{yFcT}7xA?rdaZ`<>Ue zPjx6q5vRO+{U+upMW_^RjAU~Za~}G+a1?0oD^ZRjcnblceA|Llog>;ps)XcIuxNCMYJD1rqb%{PPCTVosgzVIn5CZFK(VH zddrK9i2^%4v>x=TnYX*PQpKG*yZKO{qoEm`dA`L}<@+ZaWg-}Gggb47rrRQKuER-PS6 z#2$-INXHUIs1)cnC-__FQ8e~11JaQ}If}Ts;o8cTpS!n>e9jf2QlNkKJauFkTXPCW z5w~A;ZRO{e6zNceN`b!gG=IY{(}4O=jv_An#kG~gKJXo#DC*lK^$MIrs1)eCUoX<3 z97TM6@wImDl{&I?)s%0UQ*Z|VgEr4+sP(Yj5PmBy=5po_~& zIf~dYy>1hAt_YO^oz?l9r%zAYu5uLd(6l;fyX`No32hf6gCbN4bk=tFSoCb#c9o-u zU4K(2eb9PTIx;AyIfA__t3RYl5uhn`&J}esG7SCdfHddIX^to!eG~zjQgvt6$(U#( zT&hDk%@G{!qG;`N9nz6O5uhnGr)Qmv?O*SUN-bVtFMXzS?Y;vKN?VB{R0?!9*Df0Pbsx`7O<6gL z*eSMGdr}J^%X=Q7QlK*{g9wzaauk96R4GRh z*zrzZijMa0ntE0(D?+8P-VZFIr9W@}!>JBMs1)|ENB)5b)<$z3Duq4k|ITHq?tW_9 zH0R1u1op2#x|}-NK0Z55l_FFMJJ5@6qYkDDHK-g#V8^@P@zinO3tNX)(j1{u*uTDa zA0jrTL#421-E%Zkb=1<`(|jmL5&8FockljWT2_isDeOS^8$uo14mdT{p&Ui%`^8c8 z$<7C+IuxN&*uQ?`EsoThb492W_N=!!i>W$t-(6E3%25RNuRnQ}I*uPTFU^M{R0_M% z(@vv~6|G)McR!TV0`W3+T)2K=TIY%gbRvcQ>nv5zkC>O{LlG*4J?mV~(|jmL5!k;j zE?q^a6!xsMI=323btp#>*uOsGGv-`tP!TGH9q6p>uI%>bREKgDfgSIYw_yLU)}EG? zB2)_d*DZS##u7!S6!xsMe!gVE)@hw9M-kY+&ieWM592gdicl%+KxgBXmX&f8fgSH` zyeiM%Hk1|ep$L`2{&mYy6r+zKR0@06+1PF)b(#<5D1!crTFz05P$}#{XLD4?&PSv= zl%oiGPjVe=R`d%wM?MsxQrN%V`o~4{xgt~wd)C=}ZnJZmD&;7G9({`mCMbKN9>p0@0E+JK@b492W_OG`)i2FX;t`wnC*n!UM#9JO%o0hI}6hR+b zo+`8Y($$?JREplZ9C7w{_ZI3NDaMts8?TIeubvvbi}A&D#HH_)lXe{^Z#F7E z{C!7|gY+tzwCCf$TlOliYULgm_1hi4u_0cDyADMZNg?eF_k5hR`5~pJj~^TALrW3w zzo7mRFT-8O&RZW+nw%htq>y%odp=$|@PfGW+wM)5_wEpv-j5^gIX+;vp<8BxA*`Rvfo^<4n< zj!xPUHT#Vy|8}t>$boi6llD|4zCS~qvn8Sw*;64!+Dlgv{{5 zfp$fc_EcToziWK#*8_qM_+pIa`HSN4*m~Kzqe7iC+z~yF=^AhN!VyJMND0F|RlVMw zTDoJiQ9%b@QA%I?HvhYLV;k`@+;x0wUjF}-AawSkRERf0yNUW*P)0aDYOiRdn;M9WOnIDYmKOL^fkV|&Qu{@hP#dnUY}h$V}C~!Ng?eF_k28e z|G0SO-LC{M&G5{7+U)+JeAEjmY1d(%pyR_Yb_6+yOVOlVhm9pw8%shy;DMX@fM@Q} z{k+Z@?mEV-SW^Ay5JwbAAzp^Nj>LOws1H58qvIgMU56ryq)-P8_xebD_J@4%Bst=O zr+mIXL)vvDKKlcL9Hdv#q&*+zjXkC}c5v_x4&uTIb-uep+I8$~C*tYxogC^QnlZVK z#Akm<6?~8L?QXRV8SXj~pZx(*B!zexp6cj-nY9$OU40>s@6sV&hNn9Ek4O+jQizw~ zuET86Ds54BtB6eR?J5DS5gP@iN?X z{B2RY{x2qoA}O>bhI_kOWR~jzZ!HOP6um7VF13(IyN+iL86I!6K7v${gY+tzwCBTo zm%_04^I0HwWL5j5N zILHul5(GJrQZ#ATk-WzeS|Voy#HA@A?K+b8SOS6^#HDD`t|PJGV)Q{+Wbd~-CT+W% z4bVcf_tg>`E+EK(c14r+RGn=r;T7*q4W)~fF#9%Ezokz7gFe!Z*uqxZ<5xR^9Hdv# zq&*+U{Jed6ShDic6Tdo#Gu(AtdP)0o>ur6lRwRY7mf=3`USey(`NMqW#Z@ZeQlBiO zUB{k==ri0AjAc~|AFT-7j`G}9{BVJ!uz{rVr4G}NHU5ELIkLe@6NDA>X+;!x~ zt2*=DR1Wd#t_o?_ksq(>%oCHpAjh{SAVu1BB(GqEoWnys)*RsI=uFxX$x9mnK@Q?o zG-*%OZDxg^xc`V4eGt|*-;mYyGQ%Aao26gb&k;pZND0F|RmmDB=+GB$bMeZ1BTC<+SOh^L8|mtimm|}?m84vB!w}G;XYnHKWav)$FrTw+u92# z{iZim?t8UoD4$OMZm86}(97uBd0jtjsOoPtJjw%?R!Dcp}Vp=o-^EaD56LT z@iN?X?ET+0{r`S(kMa`B`T0jTR&Kn;b9j88#>!)3y?hp)(pWj^Dwfrn?br6d))12n zp;C%IvU6kQ(+MoAD~EP0UwrL?(&1Jgr?qXUOj?P!>`e>v`|$i9dx!e?a%4kgz&NMv zOwo{z}7lxnpOP4mBMrrRe&VcK`eg>UeR@#_EFBQTYQy^q$^Sx%fiQ$ABSCm2pS8j>U0P z<$(qdkD`BW7R8GU(Q30^u}UfWh0~iVzu&{rQ8a5s&v<0-1#{Y&jv+IfDrbJ)CzQ`G z`b@4|*Zs(l+fheOPQsD%jw^e{HE%4KGv4Y$r4;?g$D1nA9zfR`;yRJ9}$0_}5&GH*F z$Gj0-g?!vFZ?C=$mHVIaJe_y6dB3>b=_uNAho0pVR@~bEM$@5EivH=W`bzhQJ*Fsn zU}%r{#+7UO_qLqxa_Hnr)Ymz~9&JkFJ)!61RJZlo^Lxaj4Y5nxUa?9k`tLKEDxH7D zRIUANef7NkE+}KX(w!8w6BzC-@h5B6S8wg&h$1PBgADgE@sOcC%3FQ8rvD9=kH7x2 zKFx=g&kp4VN!7&{_9&lHS=)comc3$?QnZ$vc^KchXL)1CDRW=4mWa|la9x|w8X#4B z+}5FP5Yr#`0gYC&$M!wT7cReb?v z-aEB?O2;--9vH|P+|t@@<>GFo@2p*^l%loVqA0c<;kn6nk}Ywv83(WmuhQThCDHArR~}}in~rd| z+UrI;nFWjfL63_l6J61f_OiO#%IO6wFCfT4KTtGj?;rNoR?Jr_>7@X1sW$=Au0s*z zpxhNr+UsMW%~8)>v!MEd^ z>syslH0F{{cRD(XzMQ?ddU2^k`2y3iU`$ixh#h^NIMaM4zWu%TiLSRcRk|PP;ZgMV zkePg z?_kq~8HXdX&N%rwYKK)lZ+Gps#HqRhy1&~^80n(yQ1idN!{Z&mjARg z*J|*#JttTCKILOc-9t8qC*#NK2TV@Km?+x2v3vaJ)`Lrbw^XT=qL=@vsj}H_9DS1g z#4vwg7m(j^u!o2}In)8ey*`rt#DFN0LZ4u`_m66)DgBSP+4D{tMHimiSUL9BKJKdB zRzIY%^6x9yN>1H(O8?G=cnAow?i8)|oO#$V>v;ETXH<_j1gxdcR(rW?3)hw(MNgQ0 z)pzWS>M(1&DwRWlxeXpI%@3s1sRlgN5+;!OZ+PVB*TO@_F zGu-nre8<7n|NBk%@(-=dj$PfDT3+?w~N3)s;509;H%>MjvEPGY|YX zbT5Bi8C*TXQiXZD>u7IR+EcX$N73y6>0WNN%i!u)mUER-H0JhW=dz#QbzPVEk#W;X zQ!O7yZaF!%=s&o#DNXx%JDQ!CCMkL(h+zj<0|x{W0&rRbU|P3g)aijs2xp(Wz$ zJ-*kWru4fb!@bUva{vKRB&BGtb35--<#`|VUqa6$h?n86LlH$%Xs-*%bbcCajCvn>0=vQ#NWtF3MJ)rV87A4LA$S-&FTElYfZM%o$f`AFWi3}sa$ zh4Nvzm(`QQd&JLuwq|YzOBJ+Vd%UlHVCmogCtpV)g+KkJ(@}KnkRI{S&)3Yo+H$T^ zipJWY{?}YbHE+8cr#T0$a>O2<547F;o+jcP>wl;0G`L!CtzD(ic8NyY-ThsrYV{>O z%IAK&X6^&u^$d0*^8pKx`GB36rE0pZ&0qcD+PS^V3RfxEiA2Lr%yPcP@HXXlHm)kI zwH~F`-TpQ9647Aq+iDF)QSGnWln-9Js#LbpRVhU;?9@|OJI_$&c?RwRqNa52 zW4PD3oo6WXJVTL`qP@<0zcRae&H?^aUt5EIGiSK#*!c47>W~CcB!zex?mCWMzP?np zch)g~oc>r%x`(WNo8hiw>Bs9!gA+uN6yjyL>zMiG?CO$ams5Kuy#pa$hPw_$6iK0P zGu-?6Qv1UDda|FW9)alV2k|o8b^PU*Bdhx*`-w$Th?n86WB#ngr3GfaeqybC!&MEb zy*uKs4XM5RX51jw>zjsH-@ik7ko7^8QuNfHHHd|LjIAEexN2JIO>4WlTch)m?(Ucs zeodEh@9U)rD&b6qUi8nw2wz8HiLTdqX%u255v8zwlKtP38F{}^~`Xu^TqET zS{^*CTXkFOwYu)pnM`N6D4J=A4}RXQ+Q$$orD$CzM$yUVb&L_Py{zmTOWDp2 z=6V!3ltTFs?PWFc`MT0?&CRY|@?&MUaDXS2Ss_ zkNo@R{wfLL(l6koT}S@?^X$bCzEA=w(yn9qTkYolD>*IF!jG4oH35R*u0s)e@`O^T z1BQEjH1C6)Q*}nxnc8+d-a52Aa%i{e9cJ&Ul+MUH2S?F6_1&udmK_>jVq+q#?c2}B z8nAX=mXF-6gTtBb3v`*(<6 zF&)@7c=m1BBDM3dYcT40UvpxgVa$C_N72wH7FQ1&&>g zpZo0men**2jh1-UWVBs7<0I`DZTICrc$9rD*N*QB)rdu6C^N9-m<&16D;Bp5&#db%1r$ zoTFJEk8J#DbqhmWX$X~4wAPJz3bB2R`k`Ip^@dos&R#?~%5`YG9~{(FIdMPgc=h?Z z>Ndl>#!D?9Dy3-E7exo0)2+1cJBP-TO$W+^?Fu{eY**OR&ss@+O}Elx)~;?sS&5XQ zQEpjF{PD_Fr4GMt6OT0=*f;F(l(z=V$ZSiPwb|aH=;NKQir+%euCkq?d7tzwU*2m$zg9L6qFqr+(P&p5jxq7f zWrvnO8Pcuv7wb{zwU7R1tI&4QYmYzC+bjC{D|@o-wzjV&eeD~_Hv*yWj-I}?3 zT-+nR#t=Hn41Kh*viERLyN*icJG%ecxvMVf5qB|!N-6s5|7)zA|4T0sTMzc_5I^+7 z;?m}pkFQ^CN>>ePS*XPkMOXLh5I_0k;u89xN-6q|E1J^POB5ZmOV4=Tr?<{ME?K4W zYnZM9_3K#_ZPC7Gd~Js*bHB51MJlD=(sXSYML%vexb$lq8PIDn`fx1KUZlM%iq3C6 zxb&UvLiVwIsFb2HUS*@tt8Jq4eP3^^&cqI+?c=k~wHImcilVlyqVj>?Z>%0*sZuFL zW8Iduk`F#zRl46+ct;pQt!@2Qpw@X5Og`!#;s8LhLtD^vsnrN{>I+Io{Lyhe|0L-{?1A#n%4iwOz_LUNx<{ zlj+dCVp#gzb=2L+D7w?u1|N)>R&8r@lu9XD_m-n*e(kic|*t-GLO`2kCn zN-0{`R8jON`+okTt7e3q36#nFoqa69&h6Jvg7)wAOON(&vn=OzE+1%!EvX* zibfg!&+j}YJ4e*)I}X!}FEo38?J2=`oZ%NTA8qWc!6&r~s%Ke!s1$ayiPro@(e6tR zjqkaoTXidISGpsFZw1`B(H$h)3xD^}xSy@=4zrxAl%nxHfqOvV%TLL^{KWY3qjM^1 zjW!%=HnYfnR$W}$s?;I=)bgQHiq<(eivFR^3p=W%rA@CJ|BQm}MT>L8^+wtAt z^bJ=#>UVvY^4?>n zm40Az6h_e_4t4tqqv*sJK-bR0DADduPTRZ*^}9>5Kj50z51eiyMh>Y8q)f0(V<$q=xRcRt@o8O-5F zUhHEOZ0fhq;du4k<=slF?YzM`)~-}a(U|9Nxs2o0Q?@_$)YFTrrt(%v`>ff?*Cd`U2mh0N-0{$G25YE^z@t|W>=#Ihm3Bl9DKQd6VhI!y(@}d zUHJ5z^@jM^@}W|S27Tt`{G#~UuVz%w|5xWSS|aRPp1Hek&!+UuU5|^JCKw+bieQHd=yfp;}TLb=5imeJXIX8ZnO2~4t753VMC~tqIDcIJJD_~ zpJ?Z{vA?T3rn(o(aPQ}>-`Oz(6<@x{roB0Z~xiGRn=Rpth8>`3RCOM*3Ki^ zlv}S}RUKsrl~S~}g(&*`b~~AHZpZj90g*sdPk)c zjqhr-KBA~ohXr$R!tHTOm5#_-n>vC=(VV|NJ?DFCCD?UVspjZ2FJ~*c$G%km_Uaj> zw=5r+>6iW&{n_q5$`}P};OlW5ua?@^@T={#;eTyDS1Cp7*cC;;Fw1rPuo=}qnhwn& z_FHLRX^Gg&Cks2rSO0WI^*O6Sl~OeJWND+=*uMDC_{7QGN>A7*s^=E;M4O&;vt7;) z4~>6lr>Rzc-!oV;Jolz(J?CJZqR-m?-`nc0m!(Sg6Li*BYrsy0ZN9euUABV!tJQ}} zDO&d*!g$q>Jc52c`hA>{Kl%n$|Am-aw>!gh82C8D|(euH0CIt1h)6++pnE_w|%+9&YjwW*froe zWb89!r;2y6ory;c@s1%>O3`XR+B#~(!Bw6;*DqCSw=vwu_GiC2xH>R7tzIOB@tom4 zw*PumoA|ExS5>k5fgK3W+qw^fT?)?aQS{Q~ZQ>n1TUG602$fQ_?$1O~?;%~|T3bu? zwffL=3wrWMPb7tt9I>6I3MV;KO3`}G!S2qF=vLj{ESY01Ra)+PLPSrFn0J`bw!SgM ztyUi@rD&}u^Pf0vL8+6?I2Rd0*D|__*VVnP4Vo5|zO`>st!xxkDMjnr$5J(}OZonB z)2jQ}8Aw=`oTD&0bB@v#YZUD`x{I9)pH@8zvw=t{8n$RQtL@sSLwx_Ui>v2YePB0= zYfG(X>|b&H8AYeqUi-d==x(V}DMf4jN6|;WoKaoyLg#p{^>dwtbq`TzZ5yc#v9FCl z11ujZrD)w-jG}EOcaK-E{Au-Y)1j+Tv?ZQr(ABG*h_=0}fm;r)PO?^_Qi?`<%T7St zHF{dL$-dd5*Q$N4mY!OGQFNUlo;Jik453nrR(n2*Uc9DF`~%yo9&M$o=kaw%P7$I42j6s_m?qv$E?gAcq>SN*FYG>2;MXo;A8^^30YVK3EH&#=-}DMhOt zWHtC)UCCA~F;*IO&yY=x2_NCzqL#ULZbM*@^Dp?^ zhZ_eXt|K2CUy1uhK?iBqp$Kvim!e6#j^qqWC@Y*iIcMCKULSUzW#S;WeHreE9}IWIORWznJ)0nkq>vJZd#da`$npirJujR{SaqQ5(Dur3*J1BLmZv6&A}Pen zaMv;3Pk)Be#VOA=n{5@!3TH$Yw)PzlhP#fh<8Z<>Ac~|AFT-6&OFu=P53OgvIqBtQ z-zHl4DRK^_5HHcLqorSiDC7gT*XJ+vwoBR(E&Up}l>0JpG-=Pd-7GHiW-(g{;$p9b z6lvG7#ZH6D126Ks$mBpu(WG5R>F>Lj?@v4-pr)d_??N9$JwLtocLO2Ca7T1B#DWA- zB!!eP+*8$Q@%ZvK$F&P%$^65{+dBq6mgs0e+7UQWeAhfjkOS?CChe)RJEJAu8O^oo zaFf+*li`lAJEJAu8TH$;d8v?+1nsG6>DQojTIcOQZ5{eK>KwEqTKY9`DfeaIQlvdq z=0TuL4+6MZ{K=%2^GAL*IJaG|a+9rTG5U~$xD-t~(J{Pz`2ab$gnCALF{<71?1oV1 ztU*V-GOT_1!URzyrD)Ije^#z9)$X629Ynm~pcj2U+I475w(>H>tOQXcrD)fY+@lXU zcfT<{mgqRhaL-3_k3JxZq!2H|T}Ltx246^idwH`^w`i5!+xt97+7Zb-7!c$@yP`>Z zs&4PswY)L$e}x)+<1?=h?RN}!M4tg&%Wtf9|5rs)ND0F|RW0vrdpK?2auAoINxP1g_vn3W=SU4Hzp>7- zz2!Z6=THhMA=*>b@*chGAR?qh#+9Ob^oe#EKZtf6b~CKZn_;xbz|o#c+7Wj9tjybI z@-+^Q?MpYrj!dB!!eP+*8%ummb;@IOwTk z)_oiLhqfO3O4iJmUUMl$yAC`3S$=oT!J!5*zGCeJj@BA!N7xC|a+jSB2?%mfCW>5UG(yl`hOVIJ@os%q2 zy96DiU5Bm*$w6F-Cha<4^}RQ*U2f(?Tx#i&b{()RpFP$Q z@5fFdAJr!&nccoq$OmcHp>{hth)dC=T}QHx3T^l6EA5W^yd8p$K~w50@87&b(7|v= zBL)fW)tK)a$zd#ZFy`I_w@xnfF+9w+8DP z>}x=Z;f}C-EM?wfDUw1;81AW3n;NO=ed*4jtdNq^X73zykamRH)Z{?BqDgzIbnVR6 zj<|H>B<(tM?Mx2hQZ#ATaf{tGxN<=IFzycRZ+G0S4}$Y-X>#a;h?le@Oh?R-njAzcZRiJ^7yuP1<$j?^-sRzfbRjA3fY?cP+gS z9@OaJt|NcfvZWN_CE9hUojB^Rlgv)^I@ekw?Fh9K$$@r7llD~o(|mF~v4;MT&6`a! zf54;QrR%)h;H4Sij=0b~LEmB?Dq&w0Ng*W+_f*+F9K2@7Kfp1A{} zNDA>X+;t@W6LYBo2c9r6mmprI%5^0E69b}1O3|(ZDdJ8MTO#5@>!XcA+I66{&m7Qx zE^LNsaDk@r>Hn9j9#_iIe&^By~SxFhnuid#w{B}99wbT0$e-Sj?gQ>#@> z+7Y^!K@PMlnzW}X@z@(?PMx>mrI&UoX-6bpfdhgZXje38PnE8=)mBqWk911}Inb_X z(w-`9S8R!hOLI%wb!fXH2XQHywCk`jvCJ{?^t0;2IEc8^j%K(cY)mY3Oe~U8w5KZB zNe!b9tyFL{UWU7lWVbdTilh|nI&4)G^D7xgAH?N10NwT_?K&2iH})Iu@$YKnATC9d zb{+ZstA@(-H+BzwaNxcT=67;;pEGPELb&V5`+;mJg?Nc}9r^jA!M@$>5p=-DZL`@P zAzoOo2zMR%`J<&2;w9R3wDiC0V+rPrpFibeiF;LYI*O9{BgWWXB!zex?mF^*=o?d8 z%VHnnS3Rww@^J(CrewR}?Ep5xB`pt2Rp$Ql$u$^1H7-cSX_oj_;;Al%ojvl%^FG zMF&?8z~P*cY)|Ex=OC`S?SnvK=HmsR`auN5Lx%KdCp$E@QwpNah2dtR|} z6rtmBzN{3XQlL4nwFMaw>@ z2$k|1;MCD`QToPVtQlW%a}h#0ia2P$rb_L&B7|}jv8Yp1<>)hs z7_x9>TIb49#HQy#MX1ycJKFjEZq%VUSB@e++sbYnw=O~`M-ijHZLIwEEzSlH{`k*f zyu#?C97WIqXxVlZp;B{JHC6`Cq7Kc6aul&}Sz~3l-xnd2qlh`?Q(^7ZM2vX5XWGw| zqlo-oMlMwnmrC6+*H%mCQimdxqllUZ8!Lb8PsEtrUP(tdF1 zeW_!^Gqck8EB#jz@!sjjq^VMlBJ!)$EL}CRB2?=9;~Fd1FQpDeC`S<|9okrV;uRuBAMjwB zD&;7GtL>IGs0fw%XxGL{tLLbLslxoB97UYes3psnMQ~5QWzH3$Qp*-KNIo>@%2C9z)dnf6&kua)F`!UZ%27oA z+XQu>?J7d0mfhbVb*>2IDB`)_Hb}dA;OOK_I9=YwM>U1RBC!R^JtxpyID?ZV&y1e@^1EJD;?YCz125Om2wop9r}E0M@v+M zN{wjKAaj(aN;!%+@0)s=2QT~Jk+cStqlo-h0M(%gmAY(2{U&B-m5vM;^FP7yQAFfNsD@CZ(uJh}~S~~l|c73TsIf^**iF&c& zG#|=Q#P>7I3vp^EetT~v9e0(Zi2Rr8C2#GMuILq^QhPpFUtqnWT`5Nq)j!pXg?!lD zi6Q4eC`S?R-D93GQY-wchvtV=eQyZmC}Q#-Oh>vl(6UmFBA&ggzF_@x4!1 zz8-+JJaJIb8b_rRtt%P32l?n0Vf}%8Xk3cMDx>X8u0L*hZO62gC_<&M%2@OP5vSfW zF^mkzhayx8tBegDxL!Rp5jw9g-3%snmDp&UhEl`-=o>KHI$$3lckVa;&J^+cSwtZ&*9RfkH!>gOK0 z`OIwFJ#8h*Q3O^Qoo=I!iC5f}>c}BP3TuWT4-vt#f|a2Nl?qn>N|u!(l%oi&GCq!} zV_ffx)3Q>8N@2}#>&rxJN{33p>Yw=yQ#Jm_yu)bz4D1PRfs?g6>M^4JD{%rJ71lAnnC<3dDY%Ez)b5|%`)Q2Ke3TuXJ zyxNowm4elujnrHHv$7%E;y@o7D;tDup#eHV{w2Or30HRUJ*tBh=R{@=>GeOymXtO%9D zDkHNQo}Y0|Aws3FX2|Rk&4=nxDcJCtE&Au>Z_Z?@l%oi&GBRuF_I6LEtwa$jg;hpo z!v#a2HFuUE965FDg_$%O&qbdX<(WU5$>!6q2s!xhlpvB8K~!B0K9`J@+t26iFdohP#gZyU6e=?`K4tpMb$RQrD4x z7a6b1drk3_4WvlB4mrezah)dC=T}R%RMP_r-4nn-N?OaFRmxWt*DusB7b{+Zq=h=M6IT2{m zj>z9X_gNTHI>V9nROR1y&h}ooO93hFiZ~+wzO#LowN;!-Atgk6s`MUY(Z~t3j&@O` z_aMoEl%h#{s{U@TpI+0&U%}8FNbTDUcf{}Ph1IK)cQcBlkamW9KI}$S%$t)u6@<97 zWsr6qc55rqgJihtNXjZ8ilh)P!(B&m7a+#`p}T`@iHMisX+GwT zNW2>tNg-Z_yN;G`zWDtpoh?bbj+Sq}_*~0VvydX~I+8QnA?MirNWcBs9uVhRhP#gB z%yvNV>oho&3h^dr*P-5%&~tbLV`JGo(nnj!EAiTy35BHY5j9iYDzk@^{0t+h;6Y#LI8c zt|Nap+-p#!5HHcLBe|m(YEW0$n32&}fM&SsNbV>GM3EHYWw`6ezv=C#)xptzhZ%?W z@uDdIrnmQ6Xs48-T}N^&C1;TV(foul&LMj~lAA99p;ENxAVu1BoNZo*SG+g1L_3jp zwe^%YY1gsE#w+9Ts~tfO;?j|mwChOPRVZDw5{`+XWh8fl8SXlgb`=msQizw~t|RaF zBU|gMg+$sBdA}cSkwLqz?n!&9@^1tBtwzL!6$I{DLW<|_9Fcz;u%(ouJymwcJvLuq zA?G?G^TaRWWw`6GJMOXh3JZuLDa6Zg*Rj3TVDHsaLo4CB263U*a3>B@q+Q3!)=CaH zuhwiOlu|Tl*YTX)u9`I+8k%k#k)s@|!2(Ww`4|>O3Hdq!2H| zU5DNc=WGBDcRvs>X-DYYaB?7}Xwsf4^|w^Ciiec0yrW3{Es+B$MU!?N>W4-58Mv!aw&CVxboyj?aGmh)XzX94(3h@%{I+ACL=btK*v0)iaGrD)QwBR}p=3_fJQdF;)J zsh=Xe$x5#=c80Uro2>L^L@7nPj%3^oId6V%0^dB4c7}UCl5sa6Fd{dXLc9!j9r?Mo z&ek06sqnF`b*Wz@(yk*v*Je_ebjr}AT}S>7@5IW@SAH9O@7&#QV&$+p_q_u@kO+4j z`8&KVr4TRCu49V5Yx#$L-3Q$z-%SjD=fHV=uiDhl9m8G6P3zWIzu3nSMN*1(9gXHo z_T0ql5Z-I2?>4-|4!=l)i zDwFEhH$#(l9eH0Cb*YcOXG?WK6hCM zkRt6m%<7Bj?Ts8rDVntFIC0d-Qcbdx3h$IZTHyTyJ}h7QL((UbaMy9in31I)B#0s@ z#LIBkk+(~{*CH;|LGMf5{~2l5k+(}SDIE<+yN#Pu zJ?)6=%~vusY1d(E=lHC|cQpGpI6W_}4Su8%FT-7jt({}~jxLf?wChOreZp*@r+0W} z2Jtf7b>w|!`nevJLcBz~j=b&Ttpo`4)YE2ryCUs6^0rSVrLB*&>&V}uuM7UEse?Y& zI5N17{5^UfKM)uCHoRLyinQx6znn4sa-wwU8&}73hPw{)%Nf%zXOR@*Ww`6e&*xsx z;QV`FZR)2;Yc`7V^La}tMZ1o?FQn{@huVg);c)iD^O5(3^#637d7Mwx8^@0^mTU=$ zvKvB@7?Eb~x1WnpB2@ORNr(^$S!SbRC|Qz_B!r4KlDRjNq{W)F*utPliL%G-#+K`<(5bd!F;0b1si8Ng`TwU!mE?r2TWP!f_)ay|ybOG9qw>R<7Ab^cnOBksuPOdSQ_bKK;b zZ3NGgF0%xda05gfbJ#F9T9Tv z+ep^2JC6_vX(27woR45^BGWsQobH9avs|-{U~Gc>bGjGxoOGf&X~{L)2+m)zH$f77 zFNrt7HiGk4=Itd~NVAP#+?hvxB$2lz-51A<`kUVUi@9>1WtbMyY(w{n+0rLsPlod_ z@;m24_leokCx&U!edTwyL9K)T=wu`Iut_5CKDrLR)kL3Gg`pPG;!UuP;8{rK&52s# z8!&M+a2AsB4Uh=>ADAk<7itB2>fl*OW-bGXpzjeCJCkeHN0pE}RIIAR!}}ys1J0wWMzk5@Z7#~_4Koy{Bw#> zg2dd$8G64n&ygy%_~niM`gW8cLGKm$vWrr|vyjZaP^(p=4803mY)I)+YexwZgYMLK z`hjPSj6M-4L83_A485B?j6ewzb!uejJ?>!yN|4x9Aw%z@7vkKD75sJKC_zFZ4P1kL ze&b#7RD(#MR;kh%dUwCrFnLdPQG&#ug);P+17QS8kQj9-U7u^fzM)cofA^c850oGw z(X3!gr20Stwbq|Z*QYIr4a^5hkl4CEU7rCFMxX?V^;^^RITJzz&q6X1BxtNfk+{71 zz&OcLZH2lMyQ-l&E+Qg;XYbFaZy~Pd221t;QaXXjQJ%O{3%)L;HuIE25HZksuND2gjc8o%}xuNS3!pacn-Bg@-%kwC3#WA#^Q{O1Exg%TvL^h<+hP@je5 z@9jeg5;6~;H&sZW)~F6?(3fDU0+MJHfbP58O1nmX6_5ZChzO`9yYVa}b1&3dep}i# z`dySDF|B+W^zFg3kcDPk;2ni!g%TvXpHGGN;IRsQ{dR>CB;-3- z!BkO8L;|%2{hkVM=Zf}0|EWa@5+CeIg)sx>10_f_-IfaD5`7kuKgvJ}67p?8&PVVp zBy%s+Dz`BeMoV`F&O$O0Bs#52g)toF10_gYS)B^w#BP}tymu6pE=rJ~FNVlmrm;Zp zK_pPC(u&lO(JR?N2@=lRsn-}GqXdaVZ>C;j6pj)kroEwU_`X4{Paa-JxuH`}QG&$g z1*zbFNZu(Q=&_Jzv1>B>12kGTU)2?Y$_llRMo%X8EF^O;q{+)DvR3?$;8{q9KrQkz zcI65YJPXMXs6}4J<&r$VuT=0XBtxJUc^Pe!gb1F6WC+wEpJ7%%A+W5l6j6)D@Di2N zWg0jO$w-hOFJs|LVk3AKk|9uwybNoN5W%yM41rqYGeq_Yf%(Anq85$eWrc@QdAg1n55`^Cngz*$I!KrQka%Kk0{rV6d27LEGltJ+Ha{z8u5+EIc8c^TVIiH&=Y zb@SiONT3$^A0z%10#k(qYSE~lzVFSgJ$M$9k;D>l=fpNh=g@GK-FL4v#t)9(h)LIMJ`$Y(HpJEjV)qZW<& z&3iC-7Lt)5L0*P=M+MJ9G6ZUo&tTqzm@2f6S~P|?ql|~&;j@saC87ig@-ocZId~S5 zxfg1Ymtn>X!LyJIfm-Bcm~jc_15<@sG=?{0(coD~MuG(SA7-=^JPXMXs6}3e8N&t7 zLNWwuky_ADfmD%1-1KVog57J4sARold;K*bWM75v6J z)(7STwdmT!ii98=C_y6l&Ejhjs72S|F)x%LAzxDFR)RK=KrOm9vAf_|NJfH$eD^u8 z4ZIg>(Y1*|2G2q=5+vl?^&9wO!yWBqKpWzKb5rhxZJ^y-& zwd8ApOyF5aC_y6lHFG=*2?^AqYgvD%6rP2I5+vw5+_ED=DLe}a3DlA=cXK}QEF_d5 zLErS2)$!&Dq&i0ewd5<{Yy;0iLJ1P`E$m=@kPReIi>_&Pe2}0TLfJZG`;4??bqd=Eo|nOU)JRL#myniR z2W)t|0c8z~Xwj-Lp=E`bQo(bIc^gjUl?3eC!z;QDr6EkatjMnkUYccp^s+s)b! zSvf*la?SbB`-&XdSA?-NiS`j8zq1X!ugH;oMPXWWU-_MF1ov(8nj*TFlv`{mC>7kd zZB`q}>L#M)nr+m1qL_PY$w$1EfEZ<`*+H6bB|?7ZeC+5~%R8`R=xcczziJ(Kp=sLP%W`JHW)I=06da|aXDUSqY8W*fo%=e+ZU?uDz{J7|o4@|Wx~TU|nbN-sV|a?SZj?OQAI{WqCT>+2f1d)rL0mweg8OMAb4lkKjZ z?)IMAU-kLB5B|x&>pAd#wIcJr$aIG2e4rN6^>$9SpSp!<{pCe{LP7g{yjKRF99aiI zX_wzQ9}5o6b^1n$FfB^E{LcA!qTfxC)6Z?P_Urn2I{8uXcJf47DApB}HT&(Qyzv@&uwjhSk9 z|4a6z{{H$Vr-CN>#5ZzL3+W}5rrOJvF|E|Hlm_mkSlFwBejiV@ zA00v089A*Ir`aPP;@_3}s&51Lrc?hW|E*JnT1c;2J=Jd6nrWrp>{mF_;Oa?hjIP1s z^{3c7p5Po}d(E6S#a>!g+HSrfg(F-3K55O=sX{HJu^lT_dQ^2cd+h60Q*EP3!D)8G zJLp~$b8_eF?>~IU_w8O<=c6D0u2kAH)!qIxU$>sg-^fKRq*G^3wTr$jsmfgYi*-gn zhyUoDUw%e^Whh$iPrav4{NBSQ`jb1wuN$SxtpCLt9w`|ar}KeYNYCvt#eTR9mxxjo zk0rXZ8*WNkTBwoRzwtEt;b~m%eb-L4$9~HtI-<$6=rz5gs{NJdKD=*J($iNHUDQH) z(HgzB{tc;*EBgM!jwePs>Qrs*l4TEW%k8J{s4RQz{hSZFe&l{>SGCuFnKbJ6#K<6> zbJRk5a^Ecb;sZ=8^^d+cjk4%}tw)F2+t;1)`tw>p4$)DoR=RF7bLe-zrhEj57%imv zI#Ux)g_+4MOC?6;$K+${16lUd4{=I@soGd>>iRFdsed$+F+?C^@fl{G?TO zXyHh6-L9~v&d#4=e}0Z_V9n|%+1ZoUZ%-DEJfh1AwUEwgImOOOBARmEXxM72=GPS? z6*ZBxe2Ts8eYRd<=M?`*t#w3yscD9kZoA>Dt#+Cisq=waNWb#Z6u-v^jCUhTZp*Nr zy;$D=W8%sOZ+Wxllq!@U zG4nIMf-WVjtdKx0iTvfw2TG8TI9^@?B}hmdFE4=-BqS=wL|nl?WnEtcB}i0CO}DGn z2+KJVs3p<9ys1J75)zeT;^PYQy!9niA1FaWqH;`Fedd46EjTrT5+puorq>RhEEnw= zq`i|3Bv4DDa>0BMff6JnDi4ZYubSM3*8cL88ZkU%YovE|JNN|2C7^ z4$B7;s3mbVwsCOFhyL3DB}hp8E0_<;IZBX__*Y&6B}hm#i-`tPPWb&UN|5NgHr0N; zeOS(sKrM-X=Be8Ab|C_zG^S$PSRAR*DL zyu{2EFMGZWNyrQ9^jBjZUq}76yaZ|?O}?7CrAf@YmYyh-AVFUE=$2swN{}G`eDW|M z&RyX#1KB_c5}7Nf+E-r}LPh{YpahBE-k$2s?gVpAJse7qATONeeVFKca-`q;paco> z&o|z9cSu>G1c~onoNDjAM~IK6_wYtbln<03v3=ZB`-$E{)Jy5)rwS!V%o{q@zB@w* zEGv{Cac|$LcJ0Ms1WJ(juESKj5;TKU|Dq6E9!&Pj3MEL; z+)}MlO{4WO^0p+utWbi)+@kvH^0x|sWrY$X_Mg+=oNO9KpahA@hqLV7ZNdnYAR#jo z!M01S1PRpoM1QMs&ZA*AP=dtRPqXY(eS~=7r@ekzp#+J4-paCj4iEy%3MEK1nU-bm z9vnuX1PPkm=`A3H4VfK_d73lxws^lpsN~IHt9itDfzTsZoLi&F+{d>g7To`aTXykf0ez^VCXN zQ9e+D1bbxnhV-IHpcc(|nZBf0+6q4(C_#c|!ovG2lpsMf!lq9gmcO_+_Mv>B1PS&< zWAhP9pcc(7o1S`KpEvx{MF|o#r*GZ{f1UQfcNakk5;WIu-Z(=ac-^;w5+s^+pK^`2 z8cL9mh)Lf53MEKL^dv8V5+tnVQ?4-rKnW71B2!?L(V$8pZ%>2%l5zwkNbrnBYz*l&p_L88jtQ?4<-LJ1Omn@sV?b4oq7GM_&RM+p)hISeN|4~MN!}LCdA_8OF&h={iRV5;X5??Tbi#)F0=k3JKKWuStpxEM1f!!QX}qBT#|_e;YEEptg$=B>3Bq zbtE5tvQi@`L4v;x8AhN43H~;u5Nn%#UlFLcH=)FTc*w25M21#{IcEa3&VHO}KR&Q(G*w3@753gy)OImdsP)SFOuK$=l_=49@Kt}V4++%T?9iEq zLSTL1eKA#+muK3;|B_T8ff6KEzMg4se!5yTRY;%&iE=Mw+Plt#5hy{T^UzGY$kWwB zY@h^*%ubp1uYZIQC_!R5T1N|4~Vh}aN<##bmog5x4#1WJ(L zC`TB95+pdvA;i@U{+_sK{DUP(aFj!c#4Bt3ktIry;FyIF`h5tJao z5eRwL3P3FpB}i}tB9@?*h!P|?0ue@_1PO{Km{G>@Wv}{mjuIp|o)BgOB}i~QL3&Zi zIpqT-NN_wMj6ewz98U-%P=W+U8o~&aAVG18Zy&D}^H!sLpah9Scc$7iJBJY{L1L}m zX)&)^7=aQbQo2pBFINvEP=Z9~U&h-%UcNOXA1FbhO84>hBU{1Ren&L}~m$>gzim(RoAwJ1U2a@Dcdcsrv6 zi7fXy7y)2wM+p+WAA1hQB}kwIiS5OogRu`1C_$pRJ0@g&MWu@pB#Mn117o|1 z5_6sz4gLq#2TG9W-G4OrAFr)x&2MH=&lpsOTOxkb2#Na+086^TGNKnL-b}KM}(N~lp zK~Y&+PtQch_yPWy8YM``n(bgdsLoM>gslF~OP~Y^ieT6IS5jqKR;m}<76}p*CEro0 za5NtnaYqRfvW7lys!)Q2tj5nvpacn77ak<222p|pUDKNFAVH-YONf@NNoS&W!hQa1 z6h6=R1XIMc$z#%XzrDQKAN3)DS`;xo&{>G7drJDP1PRolh$*cR=TyD=c%e`ms6`P| zTHnsZpt)s23DlC6@=UaDdB$H^gQ-F-S*^~*mwTs&5~wAs*qJDGTO>49s6`P|Q&z)^ zP71YwS`;xg^^sI`-zVJSQzMuU)S`%~^x8^&-lBFWfm*pbmTG$H_YNk7rV6!WMLg%c z;_YifZJ?H{lxJde=@%P^l`iE2 z3DlDPQB3qMIKj_35~wBnrkE)9;4OX)B7s^IF{K?mOmzC;m_J*K1Zq*lly(d;QF6{) zzjTp6EsB^*pRZKa5wC|5s6`P|^EUW-;&q|3pDl1`yzV*9bb z{hXr&35uA~o-ZaYeVOXj2leeppcX|;Xt+^N^XSb=y$i21<~i zC@Gz}%*1_mE8hl6kf5j>o$Jg*h2L-UYY-(!P{edma+xU6HpxW8kw7hqn3n4z#FMQH z_^CnywJ2hGcBBx)HYJ&yLwZq*BBteE72=WI%5PU_1GOk(+U-*zK5X!l|9l{US`;yz zzE6mn1KtR=fm#$XeI@^m(Xx6cYj~&))S~!j{o922taZI4dJgZu%sXGCrcjIGcy#(V z*I=u(eSWG?f&@iO@988q>i+P9M^G<{1Zq*lG-JFF|9t$S*Zag0s6`ReUGE4nZpJA; z=V$}9C}Mi~2O&oMa43{OEsB_Kij!y`_E%^FwJ2hG`3@oW-SCXpu440nS{Ms67O1~M z8>mH5QaZn#>%%a-KT0G>P?VI;h|f!)1PO|g(#iEqxYPRi5k-_BK`~D{9Y3!PlpsMd zPdb60iGClJ^~cmGL4snQbjp8T8z@17VxIIRfxHAtkf7KUonaazs0LAj1jQzwY+pHs zpc+I85)|`XxLb%_h2QjBB1(`5Mn<;}E9AE;OcmOr_-BuAD@9Yas!ygr_CW%*DE?Wv zl@O0FiT9pb$_EmtMe)zen<_?aj7(_a=K~4UqWI^gRzeJn>k>+!7R5hLZK)8o;XJz} zlt3+tf5ts3#Q9dOLUWE<6#pETdrQ>D$Aw zA;iy*?Drz08yrRi&Do&G2oY1PO|NHe7jgG#|BV_V>#Q3DgSimVNcJIi3w_ z?dTie_?qIMbUHpiA1Plx?!P&aKrM=Y(&_k2EPbg~D1llO|D^NVnK-umOFtiI1GOmr zNoUu{%J2_@@~&)ax-Tw5(8z;-6;BaN{DL1BkVOS`_~@V+Q+!S3_GO zYEk^tj2Yruwh1jO)S~#O88fWC|JKm@KrM=YhL0Jr&QXivpJvQZbXIuVMXhV^!9p9T zg*&*E>T{s7_ngO;E^1Ny)9e6kFgPQ$m7o^IKh56PPF+@o);VfX{L}3EUH|liP#dU4 z@lUgR`IoZGLJ8EO_@~*oed+mx(43(Er87R5i! z*$Ew2mJDr)s73KlIk7^iQLi2iwSig`|1@V=4DEg-G#{u%@lP`X=(;g{mJ_uo{%OV~ z`3_p4&md}1{L_qmdi5v}nh(^X_@^0P)h)d$v<6X&;-6*=*YVzj(9%UMihr7M;=Xln zhNcR&DE?{2qKPA)4kb{F;-6-`drzBEq4j}U6#q11>gP}I@_L`xrxvv+{%OYTue?yA ziHt?DXFx5Ae;WT|_e0x4%L=t9{%QP=4fn4J9g(3H#y^!B+_ICO4_s$QXNySeKe*=Z z%L^;Kb6C#kktJ#&%|1ieY7rz*i+wmDzIv^&@1-JvTI?q#M@Pu*YV7rLPU8|JP>X$0 zA*Ro~(XS6AP>cNC^zlNNw{2>`25QkcBW9JwfCujMZJ-1R_QJ(R$~W)%HHZXiv8OM@ z#JR?UL;|&Vo7vA;T6%wdLGZwGxONy3m#$O}-R)Pd-(M(v^Pldp;LISnuWD>K6 zrPBMeJsVVmC_#c|CU1UKY&@FM%juIruV~zVpY<&LUX1|pnfm-CTcK=d{Cm!G8*B}z8 zMQ53qwQ56e-tZCUMejZX2@>SvZv8@RTt57HVisRg9n)Qi?w!G=rAWD!RKiWJ|J%1|i_w7ia7W>ii)D~FK+b=65P>cO&Auu0Epcb7> zVpe7@zG;w`4=O8^Ai7oP)^3}~-tw+JMPy)5cS2u6YHu*mGN|*W) zw1HaetION@zO}{tXAlY0VqaZ|{f$2gB~Xifbs?I%jr{sR8>mITx*7Y7NnIP757feS zy-GFAf4d(AKnW7;-Ak(eXl>4*LjtwfyBDJE5BWoFpcZ@gGP1;0f;Lc#y?Y^!7x>Y$ zLHoRrKrLJYtxtlU@uIhv?3^a>R25p0RQnvqnuDv51}sYU#?+TJ5vwI9x6toPzu;3` zOfINhA%R-7%4$)y>!PiF?DS%OS)nABs5d9phS!V2y@(bqTKn~3Td^_W@rV3&g_2mJ z;^0^tln*56TC`|ITCGuHBeiVOr<{L2>qR87#Ij~$qub=pe$Me;bS+x6f^OTJVq;{> zj($E+5=-POFE&h#@R~ch7tx|ctM^8JBQ~<9mhtjIrHhhSqU))aAiGNh~qGX{-%O72b=kMT=I@-u;HyD7UwzUsfoIC0@NH)&@O;NYJ%t z(YoHhKNA}lQdW3nMFdJ>i33*}MO(?;9p?C{LV~VEt8bI3dM#(!nAT1?M*_8IeR7xG zlB##J6Z|I%wes4i6ScAH?TFX!(ym{;7t(VZPla^=*mjXXtyYbu!dioQ&u#H@js$8A zx>MWm*E2jn+42a=ITEN+=_l)<;I4rT!=bB}kMitxtjSSH0xx^on1)NTAlAh4h(D z{>mCm6%wdLtMOCIN~$6)@APs`^??#3MqSE+^*)b&WmcXcfm-WNX2F^w`}?JSK9E2y zT9f=jO-WVjo=f~xp#+Jo`?FxB)0O>8d>crh7Oi65&`@lQ`>nKRgPwDgAhBK(X8qNc zN8>#kR8~l!*1YU2SmTBDfdp#NO6i*|N!6Oae)d}lN{~ohkp(Ny#0I4b3Dlys)stF? zjb$4-ACz;HAdxyJOUF57jhEQSLx2{o#=g>8Y~*`#WMigMBPhZ9uFA~P(bq5=NT3$4 z-xeFI9(&QB3r7hOb%thXFST?`zf1W*0<~zxx5-C#%MX2D4JAkv?v|y!ZL#sevU+~I zLISmDjku|gL2h|JA1FbhXNxR72Ou`2KB&%-KrLETZratrNM--|KnW6U?#R+J6Jn#= z%7%VEkU%Y3hi;yzd*;04=L02394(inXIR9B!xQ|{T{a~$~j7qXcL#E z=Y7I#Ac0!BdPThH6XR-i{g_flHc*1Z%o9`eY?Rm-aG&Lu6%wdLtK-ev;9{@Ne!D^m z68m@Q?;iO17|Z(sS|Zv&0<~xbz8NR>ZQI(9d7%V}Z>CQPd7`K#B7s`80$)b8N{#GT z+_!-eB&v^ntkIWXi8?R`g^|YUJlprxmuj~)++mS#m+81EFJ1i@dAVK>AjL#_qJ+&x7g7yW7_o~0H zQl*365>bN0a%;*p-h)V>7VRVuzg?*nr>A@VIi(6ENYK6jGtVITpq7XdBxqlNnf)l< zzHJkx^bTo|Ac5=9_4in=ztNk;A>SZCz?yd2Ngy*iCQXzol;C}Fb-YqNO6B*~4(``B z*n?ot1pN=b7LP@&P+6fC(saFRa;zUksX_@7?0sd~QnUatmejtmL* zaafDImtDDHqwZ|>)hJaci6t)oP&;H?f&_a-tVQ0-<&rl=iRX%%^JGvGOYC|l%mxzd z6|oliJ8hH1Mx%-8-g8d%fs$AvW4zc{(&k6MB_hFo6l;;cGpnE2m^#etn?Ok{aZe|) zA+3Z;7YX*GSc^QQg)fPX7HchkOpTIQqW*1RHjrS?i?zr@vet-=TG!R_bB>Z&;+6bi zHjrS?i?zt7itG~`KmXXyw}FyaV){Ob0!Ud=4I;t58f%eH^-R8U(RTIJ%FMMy5rL9e zqT8pjHmE+3U|)^3$fsIUU2Hs7j!zIE8z_k-%D)ep!)! zCX!g&g z?C)Y@)34`!8z_k-*6k1*hdVU)dIm}r671cv7I|S?Pl=5somTl}g_2kz?i;Zo{T10j zg1x(FKD2i?;$N}RWaYDdyCVNgB(X&IFT-pg!QLHfkrx(sPHf!&+f{#c0!m_utzU%M zK!UwH)*>%VQmfP}A6)gQ2lNh}dwA4ssT7R`tD z)l9pp_K(>=NZyu6VhPi(u+EWSUyW^$Pi3BuZqJ?beP@)!5_z8w>aUPsUyW^$hh(1f zn%&;_ZJ;EUFwc3~{cZg>Clc&=u?_N&On1RHw!vo@%X8lTH}ia;B$fz&pCiG0c-aP@dMq|tep}lwE0n|%W?XVp z_H%v>BEh?U*#@7JEH-LQGrP}F5=(@SuaMwlrGJ?9yC{hzj6W!S3FRCK-XYC4_)KZBaZim@e+-9`SR&l7MS}NKvkg9lTKw~; z?E;=hPkjkWVu^7790}fq%{KVlYO(Rsy;HoIJDN2>Ni1RJ8KkTzRY>r@ZJuY~ldi=E z5-5o!F5e+@8P_6sr#EZieqN|Dwl}7xRG|b3ibuD3Mr>TD$Y0usB~Xj! zAH>FcKbP_Iff6Jry1a9!*pOD@+3;pR_+F^R^ABQU(Yt0}5lWDt=yInau{Nl`LISmT z{y}VHkAK8}pQ8i`iZ18P2iZUZwRrwPYWF*jdk_iK;`s-$ar08M3JE1hP&`^jA4<)hSH~}1Bv6Z@ z%d%omsquGI^~(wg)Z!TnNmZdV*P!hZ%)f&|5*WhJOmlh?oMl@-}Q0<|c*EbCKEswn43pcc<@ zNUBEc>+RPEN|2!FvaGWW+CT!eXqKYyO0jXGh1o@i5+o=dE$fB#F4OsmeyWf_Es96W zDrTkPclGj17YWp&=(4P>R_eRE7KGYBEuKe_eAFp$#BU`iL4xAZvPN8~ZQniQkKvF& zEs96W%5|j%T1`A3hiVWB)S~FJtfyCM!{B*-&XGVZo~x039NrM``5&GQZx)9oNKic5 z>>lVEU(#RqiuXb-id4(q1Eo^>H;DXj?%(8yYUIARVX|HO#=>^L!4q@H2A$E@Z*WEq z<%!M&q-&*SJk}uc;eBV5AIRUxMJ=Sqte;LIF3 zVSu2?EDvR>ObJ3GrB+_r$14;uT>`Ky%n zl#jFQ_dD|MO1)8TW_DXmEY<{SAx)ziI*XNa{##0|$fw_BS|1c_2(O zxw6NE?$s)Bnw`<&I?rDJ#?$P@h51^k_ev+aUzMGi-A30rY9TFqPdHWcy4~c~p0UZA zr1SCg(W&+ao7g(7?5A^vHc$&`TC-2*I8YhtFG&kaU8$3k>qcHH-_3e6u91scNdK{Uvin!=Kd}O13POf~FYFFr1(6e!VeX4!_bOGzMY`&nDQXGbA4g z?drQPw@9#_i)$1?Eu=9|O7(m8oD)|$J~E_Wqe%THQ|()J7x3~id0?u&{7KHoq|8+N z;dy+m)B~yKoOde3M=I*FLM^0ww@bCvBEFL@-Q`D|NB$}rS+2`!$qV{>B?UQ$c;6xm zQ|;8R#l|x$k2qESC>nV|rwX-@Mte$~y1j!_ukr1Xp1O2LbV{>FZ(|#eB&FH2^cnF~ z=ly!7+4oMA`q7i5AzF3+)VF6p8b1~Jf(v;I4e@mL3_Ne5e#?V>Lmq!yKA6`w2pcc||_0Gv66C@x1 zEv)RWShd_btMjq=$OQX~Rcsy8Uam~4-FdR)quJuhuBC}PbUsiEY0Q&Sjo)AHR9{#* zQe5W)t>ZI+snw&`Wy>9FS>;HoZo8<3G(IabT1xfaQ=Rn=;vUEI+r92c%Sq4T>&jIo z=9u5o%US+9)329CV%>AsH$jQHZ(2_Lawf)ICj^Zuw;m|F79~hH zYnaH$Cj^ZbD0L`7LVX#vaf#lw{Ko`JkT|}BiB{)g36vl)Z$A^?{DZ{6msYGr2@>`7 z9(OAB^Jj#hoKxyhf<%$7>3%&$vk}etudP`^wT4>e8p~=~r{~ugNm>rlYn$?&f;G6j z`Hzi}K&_s2nJ_g-^-*b0*|kWZ*5XP`1Z%M0fQkVdsMYs|s13gcsjSw{`zJu4)~I+U zf;E_L!_okOTAR*=)!-w;SFFK&pcdAXQjMG*?u~n|I#e^S+^A0@crebU`WRna-*;e~ z_jH+Ss*iCW_HY*{<)#)t*w{$Ya**cwS01g@;SYMaOYDDE?Cj7<+lIo^?(i3+IeT1o$*ILdz@E;_k7mF?R)g9Q>0IsfDP1Y*(A-bu{)p5HCSUs z54Xhi%6p{psvBs ze!lAT-m<{Y&W?@zO*&lDS*b*fGmS8mtUI|B8ATGJlVZ&7^;E$3s9PSvD~SDp3y zzYW+xt+>u*M2fJ>10Kt~&1?m>sZz zTB(og6BqB+HoSiK5#6rl$0>K~$d^9BoTJuzgY@Z?Rq{pK)kE+0aPKdw-0nRKHAVup znvKw?H zwU`go@}8AC@>Vf_nb?;MNMMiEc6-X6o(KA2mN?bG_ zr}R@h<>#wbpZ7-uY@inPD~*5CJ)BoorI+?_Z!W7MV+*bh)H!NV-}S#8(!<%h274U1 zY7IPCHeds_sDB*usq~_YblaV#+wP^}mjZn|YEd6Nf1&i$mo#xEUPWH({d|BxE$Zic zOyc*7Qe$+^tL?dJ(G!LBfm-HwdOkkt_P6!emwmivFr|b(Py5W}X5`&%{v+M)wc>KK zFK1=u$nSI=B*L_irfa26cmK#zuMY8Sl>8>$9x;e*^jnf{=iJ3Mp>%I|Dr`MD91gYPpDrbYLa-`U2T{C7nD*wxg_N8Ixn_VCBAc=gfX z$qYOBzyG}Ykl)z`5@A|&U-_MFjG8kfQsd!|ynHk(kZI3fsq*9_m?|VhLe`O%YfjaM ztu>uDXO8vqQTL5ByTrCjUOrwKon{|CcFD_!{LVzbZ)!T*qC}V$rComKdGWF2X_=2Y$ISIu3T+rqO!KKb+WI3MJbOP$N_d5JJB zN{Rf=sp|B7(@2{FcjU<+IiKxjS7j)gHC!s#pK=JKH#-TgZdA zF%hOk_m$t-#{L;&-D(GG=E(=mS#{jW&%9jcB}78jCAXv{*PN<1H;#ATTe&%#dg?L{ zOt9-!iu1|}Y5ARrH#9NuT_(b`$cFsRsXBUTgnN1h_dY4lPw@LFDN(wwTr=V5{;=*M zCPYG7NXs>+>g&A|+~JXeUOr~Fp5Xa4bT3T1{LVy{CQ7YgB1{WuPF10L1Kgk5eecx= z&F@fuMG~4Lx#J1$yX1Ga@pJtF?qHjVFfF9n2Gs-qrMhuNGVMmy$v>NzL)Q~m^L5># z`fCNA-$rlF!uvD4h>2d~M~GsFI@iU z#5SY`Dd#9b;+s9`UJQYWR!?lXi>Xu>C9y_H@}cKnU6dd(h={gf1WJ%lU+Hse>kIK_yXz$4?xF;VMH|!Yy`_ct zI4#?MN1+6XM>eF}bI-}!Afw$Y{`&(ZNL0~ZmfO8Yh+@wV^=weiQG!JLT76cro*m3v z=O{s<*xYox)#ljxAR9=aR^boQ?R%GqjlXuZ_49!eB zzSzK=qXdbb2%Y6h@!~iB}TR?He2+>OB30pAVEEv9UzD{cM-8d?0~ZPnXqS zid`c%h8H{J*9S_Fs8%@L{`>>>EqmV$YRTt9i-`*D+ zSh^@dg0BC4Pl!p+eeb_9rAOI z5+qK!dS2A8kGmFa^!gHdYEgnj{l#h5XuC+D*7ntD(5|p_QG&#uZ|QTk{kGfw{?dLA zhY}=8>eIhX&v2si5kKchpjOw}Y4Ajy9)8>}U6deE?Zq^B&M_Y-K_VD2IdS?%FI7~! zC_#c&a^&r)sfR-XwF(Z^sq%X`OchFyXqu7+{jLy{DwH4*-z5$D_RWv;X$#)F79>c} zx|6(bXR?9!Lajj$rd{KWgAydto2S8hQ1U^kLJ1NN-jf#ct|bB`NYILuyraHY0=0f= zkamp`07{UcIE5KyEO8t8qa~Ce(KSIwu>6sXvdn^kC3ITs0LAj#93Ms5IPD+2@=6LPM7n`{a!S7q))4xXpD8f zvGLbG{5}y0)FKa{%03~c-Tt-T?;?R(3^2qV>5*y{_|KjHZ z3DhDF;IlPClo&HJ)COwNcs}79Auu0k1GQ*;{p2jkN2^2meH$o2f;@mCd&I`EWlx3@ zs8z)C4TPBV{S-gvXaluqJYVFz5SR}nP>aUb@o!2#e(bf#PZdg#AP*ouUgrANWe)UP zA`+-Y9zaqFpXlbF((EFES~Q-2r>qc|4c>s}$Vx#Db z@Az*VBv6aS^B1ZLfvG|QwP>u}VY#I0(#pbq>7oRQvRBjW4b{cQmXG-h_SB0afm-A< z>_`xz(vZtu&SMGGqC0J@A;jLJclqrKZJ-v7$W7@E9C}&ybGj%&f_w&(s-+8G_H&K| zYLU-iO84^@-tpTN5~xKUfT=;L56U?bs6}IV)7m3t`g-}Gz8xhln<03K|X_d2Al6G@0TtTs6{@5=^5g_pAt%- zmRU1J5tBoo_~(TOQiWPHA~$_|{8OpE4U`~3K7;8K>$SS%&jBETTI4gBo?7?qYq{Q2 zT_jM8JOJ}HkXAxbwo~f*cX)3&tMdd-Ai zA4s5>uQO=yfuF&QXE{?JG2^ccezBbdf+U*@?(DJ}dEqZv!Prtk*j=^R7aoXAlY0qHD7X zse8?M@BKlkLJ1O|&zaz_nWD8(`MrJHG)IO6YSFc&rOj-xM#H zeMGM%BZhpADxY2QR{!0s_jXnMoL892@4UwAz;y+)k4A|wEm}J!zwUpDq}-|O+W zxAII@72?`4(vtOMY{S{m$L%nH36YQ%(sIo9lv zqc%R?oIEK?glW-z<#)F6!i*tq_aVIESJv;*y>Qi>{LX}$J;eQAUnat|kmghkoY>zg z)qb>>4_r6By?eU9;#YoW;)TrqR@EpGrbQ`{-#Jx9%e8k0-g2X7BcY<+8ya1KE9*B& zORm`l5+Wfjq~)4z==HmDAil>OZP%8xn>)Bjj$_gghfL4LRzlbhF%?Q$?9m# zA=b0}&NlSwXiHW{hiTD$<#)EB*YCQrepjs1y=XVFtSXn^^AcfNNOP+6s(VLP-P2BA zT4_)BqMg37vR{5@La(}aWYv9`7Sf!mw=3P~es*Jfug+;lx2*EU718oL+jv+LXQD)y z7Ts5VXB)chI?{G=jX9=WerFrEPU-JB?YOmvY0-V3b1KJq);_@LAG&Yw{tObcnYq5Iuz>36Z$ z$6X2XJKJzR-kdG{ZkQI`SAJ(3{}w2id_4Nb!5$gkOY%G0C=zFgFfF>T{LVJ?E(lk4 zK}ahh2|g3@JKOj|6aV$&T@YbfNVAPHH51*g_e@LvGJm58tudFA8{|z*=K;ujp01Vp zMH8z&pPHPm_qd}L(zN<}$|rH&-V>$fo=kL$FU?LGp>3c<-uiT3yp!HjdpyxSbtyZk zpWbq0_I77+(PZm`Gbt{v@v5*O-QT^6tHtzbB=2l@npQ}*{`)({MJ=RrUQLIc ztn*sU%5GQUkX8Itic9mxvQ~xnJ1cKj8?J3pYHa+h>}ppJS`&0WPz!0^`>dk7=+@`& z>})vywN>Wd6qomdD{rqQM;dq)3a%Vds^SCFtr^#?w$^9@qxz|^vlMrO>hm(XOt*TJ zU2P@koTC=f7`xZ!cpVt#d@&-&*>o<&#h3?1Ose$N-=mN23{~p6|Kgo|ckFQ<(>cdI z=NJXRsDo1f-c-Q(H+he<_pcNewUEZW=t|9rd)oQ^ZY*M2FruxnMP zU!UF1dfiHJ?>wdiqbEw;I=HH{ckpgU={iR(q%nnh_dwlQ+0T|d$)0n12F-5r!zB(_GtO*FPSEWNwUEY0yi)o9J?ONbG%I_BCXzl)_xDs{6d7aC zO1*vEA*XBGS=qI8OGGWCOMIZ?wb33!sqJTSt=iR}TK|TsdG;ZTHoPVu2n$i9JP?9 zYg%W?Cu~%&y~mni6|kPtHgL5Fwmv+6K&dVF?Xf;N8E+NVPZVk)jjd9teK)Um*0rAQ zY|yP_SEhagM0Z!+{+WF!B>CPB!1GSLuJw6?FdjDK!wbixZbf>Y-2kzCz zxB>3^R;qmY)z$-Dr#qu`4Wbs(7!gn^b4HHS^2cG$x4I>c(((Qtb$CZNt{lL12TJ9> zo#T|v8RoRo`9LkC>rK&bHGenx^F^0hx38Gzbk;S9>BWc%?sr#eV!Nf*?=$8(zn@HT zQ449zpHlPl9dc?;os~RJ*9Sf4vMQZgxPL~5epbxto%V5uobmls?aYs87Kov+WQL|4#pEFR-(cwUZDtBNFBeLmRk{6O`QMQxPNHNe;%o|mIk&0@*c zAB(p;-|IR@Eu_(&o|CzIkCT%dZynM3z!mXSYtq-^+IppKzH5(D@p!!TI6Z@)g)}|E z<`j=@Pw%$=eXgoiUq9!##tWY!JfB0Ke>HHowW3W`tE)~GY9WnJmr^$tpOw7v+(GAV z-AeGZ9*hYe-@#?bCu|(8IV*XyuEk`X57a^$qrG|`{mH}Dg(D4<+vuJeS8QGTR2ALt zTDsp&rhXT-kj9l^!FlEO*pGT93$d$u2r~*vZj3M=hiS^`v@F&v80#8)j|N1ob7d+rjHgmh)*X z)I!aQ#y0QgIEkMPvmD(spcc~9`X==DjXqGxa53L#uyq}1h= z^PCR1Ep_hEPc3R8eQ2oe8T@lUtd;Yu^LH+FYUn-@doqk7(>T}=?@yR#y?obF=cI0l zsD(84e0ub{d6;!*NRIR1MIMn!WE~^!c$SG$>+V?RJU(KgvqYCJ_Q?2N!X8|y#U9OdUT*pdyYW-$y14kA(7RjZZNdDfX#k%)dax~tN-bZ{g99iHR zKRv#>ZI5%}bi6ZDrwX;GWeANU4y86#8M^+P3%O1mUFWgqILY&YYi5*cFl^9z=XkDD zOWVNbBbGMjcm&Vc!sY zC8gRPO|qVxy4|XFN#1I#g*3gR%s!S5t(H3Lr_Xcd>Qvzv2cJ6}6X}u6jZ2*|bLKhU zYJU*5kjCdxsVe_l>P&lSp4D2{IT5nshzL1jiENnNPPNJ}bvn$LXZ@*dpcc|(!<@G? zVqT8*MD8%Bpw0)LY=dhi@QfU#Dox0-&gFaBX{X;&sD(6*IL#`H$>odr_Zq_`@*3TenAx)ztlk>RKhpm?N6SGh1RG}|}YYp%;8l@T@ zIc&YRuwnK~x~xzOY4nhk`s=BxPNS6F)*U)k_zNYnenoXT}xj~V{geYbN}rwYe|xGD@! zN%ZC!ESYCOEu?Y$sMJfj1+p*gHRlel+eJH}({m~*z3=MBtIa0gcE5j3zXu7_qW)26 zxh7isgW6+xqxp2}1sd-{i=#S_lhLq+Ds`s#YOCf$)2-6lOGPcDsh-TP#v{CJ_-7k1I~#0+mn-Y4Wbs(I1bid0e@?rHMzd_L3BQFo(i8koY&It zs7dpzh_3TVx^G7f6n(#uvv;bS^YpXARe> zLM^0mW=fyXr010ewykRQ(K#poTz19c=pIM?zDIA7M~_-a<6NeG8$2`7+L5@<8mDdG zOcBlq;;fNUd%I1vDmPhYP1JRcT1ewep>FNv3Ru@^KPNxs1I`h}m6>=ZsP=0w##>vO z?{V7bo*K1~#^=WC864d+SkyDn*hg9%jwW%Gsn^_E9KrQ5BZ&61t&y3X;OGh9K3C#EUYYvFb)_fV4apMHO! z7SgzyPN_PlbDc@mo=R${bB^N@9Jd8WGS1Q*D{ap(tFa!1Q*SBbcJHkg9k)}DYDVEX z&*WHz{vKvMsZ)hoNYi`JjPyIGZ=9TRot@kC`vd2~=t-5gCC;5G)m#(f3Uqcl=zO3S z(l|?@)PiE$liS>Iz)93C5!+9|Yt-uwXw=6i$~{qVd-Bek4mcm_RG}8q*xr_nC8G}CpCT1ex#RH;Ja8fO1<_OKJtIY$Dug5%wJ z)%RF;+)==JNVh~PcNs_H8b~}PPoGsB*<;;)Jl?rWKZB@+G{#$$`u6nK)}D=zIyY;N z1=}c&cW@k})PPdoSQU;v>iM;(g*3KleP;i&iOKI@J#4kpWko)x?7U^4lVcw2rSjaO z{(}9ahRNs79=7h%WrbQulb0&77oGDFyRD8{Rh{a(wPTs!Q-n{K*Y8@o-*u?pMJ=SU z40WAfzuK97ua27N=L1Kn*neQZqEvQ`)z0e=PPcy5JsfHwjiXwf^Zeg9`73m`+UZo$ z^C8a~#-Qklg57{uzjki9@Tm2$em+nOY4pOCDm%DZB=Z2Dd6rU3pQhO_-lnlZV!1SX zvUhrpK6NVkJC8DY^{W<%Kf*+q7ScS*c>K>6k<(rIB(@GG^-1!7<@apN)hky!m!zE! zI-(rCX5xcmEg}^jV?rdPg|u9As&ZO>Z{4I%o1)b_>-9SJw?E~4EbF09Ctb!i5F0qf@#>wnxuAE4e$>?y;QnQR$#wlemTE7WL>Xdd&>W$kzw> zY(uF*k{mCbX8&G~ZOHFzp}`jOTpF?`#8!FfF>T{LVH?wjUjNS+7c=c2(|^R6DLD z*ZCu>Q|%_lXzycsj{MFxinJXa8SyC-VOn%w`JHWi`oQQ&uG8Nl8zf0Pna_JZ=)P+= z(is`)9znme4Y%Fs$eGDZglW-z<#)Ex@#{X3GY{~3IB9VtY4BaDJ$NFwUHP4D6x`M) zvam4|VOmJDjhqtgBRy;JsxWyvNrEk3erFp?N>H#{O zWDk=1k9QBS2PxNV0|}APy^xk`wz1;!h{%y?Gri|SQbiJcCggXvap3%j$UjS&2-8BE zZCuD2l(hMuTXWW z%1Uxh>21DSpWG4kw&j}hk^J7~*(BIU+H-szMgp&TMD*PQb^Pv%;O z6P`*Msz)*y)yJ4lFpi@~`q_Go)%nMtFcGGOG?&%4@w1ZmoIYqx)c!|cTxMHWT-Pz!1Dip;pZ?oI2gV`&pDS|@|EXXumTY@5zUgLPK_ zkrS=2wGGrl8hv#g=S**yef0cc%hk^ZuGqlUX5`lzKWfg%#O#)usG$keLYh5R@zs{; zJbZfhI_G^o8-?YLdq#sXuf828T9=xv^I}D)g*4WaewF1vWTm>ZlHb%h$JIvEN@V2# zu1?a?CH-uyXf`XE`V!Pa8so#dwO=fd{8x1DRr+?XztV3Rnn|T6Rc2E8Ip24>K=PTG z*;>*QzF0bXlPm(iq3n zJsgi-lW9aIZ+dDC^iE8>mq)L1&8-9pkx+|6TCTYzmeIR8YH6>9Z1kLyX4h5pzDxJV zaCBc8!!c112$7H$(sIqI`bTZgKBQ;WzSO0QD=={tBd*xgtEozC&z^hZ0jH`SWuO+) zxVllP{(4N(uyL~0Ot&lSEpgon_O5yj%iG(nF2|CrxAYT*T1ex17X4kSVx6sdr@ppm zr4z^Hd2E2O)L>+^UC9H^>|Wcmo9ld(&~q=c4iO{ZxNcFYr>Y%r3O3%JJxD);sD(7m z&&Z6PZi$s9I1T&P*58(C z-8+gja#0KEq(_=#*|)6tzy;af|)$Msi32kF@Fz90Es7w74dl=K_` zX;=K^%;%7OR8!#aIL~0mv?X1#9dG76Y!!E znOh(m@uSl0&KHFEqPlB6@>zLzfv!Q+LOM9lP$@SdlJV>;=QW)VEO+rU$;O-tdUxGj zVq@>#gvf>$XE{&n8bmFmv7TssNeAbFyKi?J=~Q8Bh_}-1X}h?ru=VJ%Pu&hqiOB8l z@vDh0Y9YP7X1d+;R%urYXE%t{K5`T)XdM4WorrAyFaT{xXU79_%Bwy=O*cUX2 zOdWP2xsU!5CTbxqJsj70t1j8=H|kvqy>-r;T}-pf+{M<}2jqNE{PW6he67?Ee`l|M z^jM<%_I0{G^gF!AahAl=H#C-fR6e=W8eFxsyHMLWtE2bQuCUgyHucv7PVBVqu2kCH zq1!HMAuThhoR85%XIU!`C%7YZ&f8B+v!@ke>oQMCT1950`Om*n2`RIzReKZM9{L$X zEu@2Umh;d4>m129O}DFuBgT(Pi+(|ndb>1lBtt%&({sFz36Cs3!CLTCZFfk%MlM?K zl$qxDJ~iLevu%D~vaS3CD@FHLb#=~B3u#QPo;_cA#5sMcsJm9@yi`WIoxPD;H9o2J zoOEvnn#=0O>?6*&BSqcEv<=ik8lPbO?aTuwl6TB(;MUcB;=PVui=k&WsTU=mTxM0P zY|&3tL#gw^yH6zFKEHumS*HrMkf!$|&BJo4S`0X69lb5y-K)#$!B%N@)m5AinLQ<~ z_8rsw{OSETPoA@`B*eS%Iv=Qow9JdLjnB)t&d=-1yZ7rS3j3w{Q*?hGo$Q(e{nC*R**mR>wn2UShFs;9BK7S92J(IBZE#F~Esg3)snL~6M{1qj zX{G3A5Veq|x50M>dA?Ms``%n`y}PWkyHyj|BjYoH&x+nXpouw}*r*BALK=H;J<2#y zG}7$DBTl@|2fn>z&f2Rr?Hg8^D?N43(?ugA-ag{|p>3cR()hO1-yiHf%bA&*;Qpy= zu+&4kcaHW9_|{)HO0QefkqvGoS;J;I;|?Xb?X(TlLK;T{N^O2J!I^qrefJanR>MAg zL2W%p5^dqw=j-n@j7V^fJW$`gtXn&3AziJUUcD84(v*s9pPF1!??Ag*mlZy1|>N_qrba+ z#jfu@qx(cmFZOEK+vypvlmx5ngY{iU+dwU(F@HLK{&?-kmRl!S|LC%!@yFB8a4FI_ zvE^>A4;rIfzfPX>l)<$lbx)4B2I-um7Sc4bTs%+eWB0rUk^Q+RvTH}j3=@{{XhP=R z=$W8i$=WERjJ~fnh-5r*BD=iKIcm{}LueXhPz-^es9Qf??!574Ww$fcAoP~_++pvk zBfN{2J4N29?AFlj3bl~N=TWHx#}XsOE_|N!pzhnnyCdtn)%%pNYM(jP2y?1s4H%Z&Tr}JzXeI7tGx`Jr$MrKYk&x1jtq|rq&x``;IQvK@f zHN&7Ql^Ud*LNqQRFXou@JT={=i&3daN+S$OH%gh`cRl;8bG{E}{^0qXy}o6v~l@L*|R&6}kM zTHnSgvAS3d8e>E;6{A@rH|F}=_Ith0tn0rF1osr{hTOBp^d7U{J1(uRzY)^TRE%bw z5xyUIUwuiNeCICAS3JwGzQePUF~{a~bYDIr-@y%OpQ#wldJy&o*1{5;hVv|{GpE{T z^n@Q4NJ6Bd5?RvUtz5m+wwe3WaW*~!?>}^95FYxwmEB&go4HS%Xc4KXBwzjA@~Hg% z4`;KP>Rk-kWywh1wH;rP^gqR`nxTajHrXA zv3pixM9KMScwdwB(vwo{d+r%$S$x!TE9#0YCDGq)sW8qR9p|a2q$K*gEmhgTea@u! z?TenQS*kWE`RebMM+}JKI3g95@qTbwZ?~l6>`d z%VXQw^>e?Z_&&OK=3di1wdJw;jQY9X#1W~eBwzjA@_?1o$Eki`7aiNKI5-)Vye6Do z9N0yLO1~`+MrevqFgMkYPLVT? zDGpXh$t&N0M_gmo-!0-G5C<-|h*VUJwx#Oy?^wV1v1bAv7o1ugXkL=SwbgHnxB;u? zlXERXQ-nLC_1l(eG+uZ7tJnmIr($eD#^o zyd*_hRJ=tbU;VZS_+|L&m!T;_#c2Jur5cRWt4=2zWhL>jQ++*~P|ecv_!x*sy4DX6 zs((s~Qc1r0yXCQeQ^Y;~pH9Kq1nVEFmk3&aw>%h;ic0d;-z|?5+KzPh-?br-UEV>c zHYxe)@0Q1LK-9Y1B2rOFzWTf6vEbty+%-9NM5WSLCEqXtW6;$xs3}6lX#KXO+Fo*p z`^k-Xu^E4?S#a6)cZ;}X)*bG~z7~;+O3JRk+j?Nsx;koEW8r-Dcgq7agR3(`Dk{lW zf44m1K3+ker?T8gzP$4`h7p<~RE*YdTdKJ36Yvm?<;B}YkGA?w_ElEL72QX^Eh4V_ z1PD!$@-kY#Z9Q%u2~XJ{dIbpCRiFEa&5Nn@+wv&Cv5i}6hec?LY7h*VUJwmjl`Nx(z2i5A^#Jwz8NILEe?ep?=Ky(BbYEMZDk8SJf;OBL65gSHZV@QOyZ&qc?T z^I^$XzbzuJ?*<4>5h_OOw=LD5cwN2*K8n)kqCuY6!t!7${kA+9p(&CVqxIYJh21LFRB`VESlCS=5dAtckb$pkaic0d;-z|@G&K~K1bG`M( z)lx}bEcyCvdB7XjS8rTRk-QkK-ZT>G)3}a zw0>J2xS`szgr#{=bql? zNJS<2>hG3Ee)>^<&TTgO9!s3sbR}Q?-SWt2b(G(5j76lPl6>`d%j4!|^<&@1cfxG( z;{CGzZh0^w6;;54PO#zof%QpmbMT78vZTLT9_{vZ@-w#E`yZ*Ogopla>#^>Q0{3`h ze3{!*+j=G)X7};e6}WR=tMTe@`8hjj5t&J^a0k`5JUE59E(gOG9CdS|N-Z^EQ!U*xj(KtNtb$+wJJ#|BkmvLxG7N;-i0}=!`{oz8w>LBXxaIGx<`hQojeJoaKrYBdfa`W##?;TQC&HO5#f8=6VX=L4Xo^P3L}!=lVE{_ z<<3*f9nVXAx}d+?QTrP1ek{hCE@Lnim5fyV-HzIV)y>^Vn(ti&uNOIeSvA0(NXtG! z?yCtEdsZ1!x4gOAqOI?Z#z_NHF*?|P#BaVKV%F)I?)#0V=B|dloxODU)QY`&iWjL=E8B=oWcn9fyMbptiV0^U5(Rp_V_YRVT6q4|BJ_ZGUlea1@2p?8u#6wmSl4Z zBV@)XzD;j>A6s7FPT5xD{J!bjGEQNH%t{*h&zJ+4cV9ZzxaZ9;&gK+G$jq0Fj2EAG zotsWt63mI3!ieyV_4vH&VBTHLDU6UAJQ+E1-Mj*~|0%}3XV$?iPGLkiMq_;5bujO) z<`hQAO4M}+qU;`=h}oz9TLtdG${OeS^xIZ*3M0ZksY6~XaL+oyxS!*>2OebQD3uP(?N3QWc5X`fC=csI)Y ztbauz1XIbk`W;}cZM7xwdIYC1q7}}$lU|d`p$4U51XIa((gWf^$4QBIGdP72%Rj`q zdcwy`dB|H3j9@DHp7p)XyWjUXxZ0wMd`@9R{<{+rejrH>!h;b^CEx0wjOfPCy}C+p zQgcpWL~Te((!V6hr6`18D)~uexd*^HYm4iPq(m!x8HB1mCFN8Ykq65%R56t4k*&{O^)wlGbGeQ^~jbawC4p z{W}w-;uJ>w`tk(w^6q@X7m0U%IOT9e(i5=Bf8S1t5VTT>SBH8-B;uJ=R7eUg?BFP2s36n<(Q?cIx?tGkoLLj?RDo$a9cqjaOoO*IF4@NLm*q>qf zzFLX4;uJ;%p0fX#xSu8SU<6ZzeQO!PDU4umQ)3!l{$1jAM@~5$acQ-d%G+_}O5r1t z$O!pXD)Fqkag!prRE%IM_Qf*h+2i&n#yO`jLOixQe5^c%eB&jgoe@kG_VIe>G7j_GO74jRcWPeCKLI|Q_Z(~H2UtE?LgPbDYny>i1rj{#4Fjd%7cEFt`!Glv6Azrh|@p0+I z*@;oh2&Q5`TSU#CpM2?$Qy3v0#yTF8BT(9k5lqEC$-&H!=s`|lgxu^%&R3XyvMi^f zkasjw@m&!3I$ymtF$Ot>5#pzxoOhEo!RwB6Cx)rQp8Z~z;zX%9g%RTApL+dZ1XJ<7 z0L096FHOiUr!Ycp3F&&3tcCOkBbX|DuW05y-vw_-3xZP^5%`6tT+bQ7RAEo@dVT*) z@Zc0ih*$ZMdWnp4Mlcooq2vDG_y&pb!6}Rgd$A^4t0?3V&s2PG2Ir1FcO`gm3M1Gb z)|lPnk}pUyB18p0TlF@EP3FHV5_7vyB~tLM`e*nai`GNhiV;l3cR>){_=GPKJUE3B z;X4h`!V}WY2&M|#`o4PAB*r4m z+KN*c!QRG64pJ&cFqM2K_vgd+{1WuJAUK5)e4ERdK_`8YuzoOtslqocdcBx@1)NhD z5w-~bl)fdfOvw0P1XJ-n4P&Y%W+nQAQy9UvWn)I2krmi|{s9k0Fjd%w3`#$>h4bZhENja>#?I8!m2?bpV<8R_U=+#%mf z2ZH-Ue6G|JkYxdT93XCMm+y@Of~goSK3*Ex4E|TRS$y!;66bZC8>p|EoE5ON^XM|B z-qv(?^+P4j!T9ZEwY@Mp?0NRZ=dqlp@NSsgA7mX)G)wg`W{nfkFDA!w8vl~%AA{Cq zDn^IBiod>RpEu029@u;?%O}VByFFw1@2Gv=?RYs<`aKnuw1WO_&sd)Ao#EDhI^7$I zda&$ri*idFQ{6Aaee&jX?^B!`FcqWuh7xZ5?rrFHDX((Q$1QC2jS}v>8idv>^YAYX z-Sh=jP9gf7sTi&PSGFD_aAV}&QTx5G(C55HiQkIE1Qe>!`e;tTt(4;@?DsxLshEn< z!Y_Fr=iq&}c$?$zjPjir_7>3JZGYevgojubL4Ty8l2YmKwjQ`|5JMcV0Kq;5e9ErB zTON!^MJ4&_@0Q2V0U55-JKgD43vcSRoS66Jj5>MpKHq9HG4BPZPM*AwH@xk{yjhpp z-|?PT&kXmE`_i424Z65Y#pqWK6zBbl^AG!OUyrjg-IvYO+yQun@A-2kCSLlheayt* zwO*kblrfRs?aRSja_{~rxnuFtA5$@UV*QE1d%~8-unRi6JA33iGx2WUk`pH8y|>kt zmrKGWM08`^eEIskd}k4A&Qy%<|8sHhzO&_#JEpxG{cW6+QM-%Vqu#{4mhI{WZN*fK zhP2<--mPg|=)8cMGZmxX`Mx;sf5+5~x7FZhJG;AUs&kL2*Tv;_=h|{B;H?zg2HbzJ zI`>c1oT(Vi{bbCD-3{IEmR32t(7H`tF3uY|s$Ni!idn_M3+7T=r>r>d?sM($&>1iW zk6TpboQHZa6{9;%EDqjSw{7(_Zmc(XuCrSYJmd}8^Y_#bcnr95Lf)+<^@G~VYqTG1 zwZ9va{YQ1~L?F%p52j*t=gt%I>b`8zhyvBFsr%ne!JTTC%RBD%;^38ZDan{mi}S|q zv;AbuC#{>hd%ml54jk3RWhzE<{UGgf*Ye-$*!+0w%A41cue5I3L$!iBNq-EiwBN>z zMjh@kyJLqSB}^rKqiE?5d7<03mA@_Bop4);(*-qu_>bbeM@QT8vShHtAiD9Eba&vL zCC+M;im4cV!iM6!sfc=Oc{J~z;oi|Z-MbS!n7fRLA9HNkxwN?9hI{lm|CjE42_8(v zXc;&1nz`li@tWrDvJSp;I(Trq_pK<-8}z6x$&=fP^WI*n{jqdqbNA8qzSH37E-q6s zn)?YS)kXWA*G{YJw#4}8d~0!Di!ZH=eueMSTk8cSsr^uKo_R%Ocldq#o!V)2-8)bZ zregHw%Zu}_eBPpQpL1KKv+Rtf?p=`GicZCOn>$+>9dto)UeSk^s{GR8ynE}b?Edt1 zrL!r$sXGQdn2OQ2G%wCO@T>Cpyj5MdQ{jGRC)$e3%cF=#7vf*Ftn2=7;(n(g5KP5r zuAea{k1TPvZ%=m{VTNn67H4!X+VZZ&&C=EpJBmKoJt6OyLaoOcgG-$MexL4sjs9RN zMh{toXf#*r82n~ry7LO+Cwz$h;PLzqPQbfOvQ+Xy_x+zLkIQdQcP{CZ;ci4*F%_eE z{3BNF&zbI%|HjIx0c3gIQ%uREhrKQff=yR4)9z{I5j9D=|&CPke)OiAP2~#neWg3wX%9^{4&i1{B zP%25ev9AfZi?sjWdo?|z?1KLD3=_;Nup!&=;mP=5Dn`rr*mJDS$(VaEOSj(L(0>@M zD^mTzm_t3JtwdfQdj8*lhe&?zzxLahzZO?HQ>q*Kg+MSBqeZ62o@8?}X4A=q&Yz>& z`@cdGMHkg@+YND}urHWhmF~~R z_z-E&?DB6=4=%fm4}Db|x5;lPadsmzMF!f6sTj?5!mCz0Gu=P`j^zwQ%~{7`Nes(w zFGzdyndLc6(7H^;Xx530$@sp~NkbHFiZ>6vbeKc~c`9!$k(UUv~GWMQc@VosX>4@%YP;Do$^|7UB+{XDF3 zaqxP&mEBKEOPvQ^P4g$9KbVTq-2a%V+ctI2{kqZ{3LZQvyCk?mB#n)MHzw;?_lbsV1k!cWj@b`xP+BsFu zO2nC9Dn|49FmxZ>h_8bkeFb>1w+P=d)cb>WH!-YTroaB-DY4hEA7m;_u-6YuLWa1M~u7u{d{K$cJy+mLE|d1w@7fuBoP;f_wGzMI_Q!#&j{a^$jkq4AVk$eCO<;gQ*zJZD`EGj``l1uyjrV z53wQXtv2>f5btQY`DWW{bWXnadu~VfOGrCYF`E4jjJY$tsej>)O7B^WTK063HACMt z;k!V_yxgg&|DU%iy;+bereZXYM`QX&OTGHg%1TiWu{7$9O!i0-o2B-XF-_-`dV^j~ zbMFQZreZYvni#VfKHu3BkwebjB?r8ivV|Oho?IYVV!sbt;i2jFUI+U7o>ZQ(7Ieh zjx)e5VoVo|^IHa_doN;~GZmxRD-`!87N+_4JzwfvhB3%%5&J;O`jLzqb; zB^nu1F`8F6jB~HbxqN#=_i`Zk-Zrn{d@>H7qIp$LzkLneRj4^rF`CzQoWEUH;_ZYD z%L5O&=OMRcrO$b!@(4EOjoVASRj@NW2OdntX!hQMz&xV#bT~9rr*{U z&InDBQZZV;?JRn8lR|IMsP=9L)Pv_&E(wB&faa@v(SA$ua3R+LT7g+<`Sl2H0wl&wPeq6g4Wf%q}_St)Nk7#@pGI2 zp()btjMi`4AF~m^^wLXwZve(QYj?c9vNj0o2jVTCcZTmxN9!^bqj}xMt(4o^`_G25jz>H)7n=Uh;30P^&xK7!YREGu zUJF>Jp#_Vl`LL+sUneT)13~o&KoR0q6(8?yE=1j$CX~U!k#45DzkH;2z-$Hgdh3{%}PS_ia zZ0~PtTNvynn2OQtjc-i+OgN~y&aYBi)@1bCwpIL0I6!EMv=yWE+sf`mqtd+@I0<+Q z^A{O77?m72S*-keSRp@$v~ydrH*R>vd8bRPylQ)<+Z#Q| zRE!R{ZamsTAc?A2c%%63Qj<44-aEjpqkFD{9GTOPC89Od^PZ4sIxc`;hQEssCuR(Zpqk!?f| za?N?>W!5NM4NAZ_6VdKhYEKHnmwuUc4vQZ_6Vd zqcK2eisZ#;{kA+@#Irp4`g%dcMYZBcUOa#3?-sEfhzBOs4G^iQ7;Q_16JB3EAbzc1 zl<-wK~CwoQr6!|7;0)SRgp&2_?QU&nlBS9VAD9U$2MLQdJWpXDT8WdU~Tv-6!V5I_15 z>cLcuW`7N19>;q{nXu{O%@=p}{Gx=P%rUcz5`HoV;LDrzdRg;RrFRov!gvj*;Y`Ko zS064S&zkmU`_8R+72y;30m!-RX@hNBu{RBS+2Hi`9N#%U+T0z9nllxngmK(jOH<)@L_SqhlTyD z*h{N3`F`R29Irai{wGDY?ZM=XauYnTpZxG{$RCiJ4(^ z%R*-rY?iNs2ajj=(qiu|?C$U;(yznXyG6%X?;TwM7|r7!z8`~PMF}5BojE06{oV3lL@FxD zSAVxWRt(<8C=^3y6-(v$FtXb%cBl+s@mIotJ zQAxh~yX7&n&bj{X&m#d3o^iN+^mogH5viyoU;W+k*n(KzZN9g$yboMg82HLdUXKqf zO!&I%??)n1Q8C(<%EL{L{E;?F^NP0$10P{YVNFlJE#jMZZt#~BScIkscSh^CE!AMe zh`)TOjViAii{!;+*WWE-I1v9Wu!vMtjJBo9x@Lv9e1_c#^T^?T*58jrq@t3N=M|T$76`L`1ooYll+;B3j@DbNjdS7 z!o*z({kDh?ff(7{A~Z#6$Y}kxH9ugc##Y0lY6H$|WkzoK=D~owXqmT-uw|DS{Jv|n z9;f^?CH5@*ye<*zAW<<|bkWA2+MKXI%f!ozu(_X%wvy2~{uoi};r?ih~AHTh* zJia(D--|&LmpAp8iqX>N6&Gk*rQz+UU-2$kIqW{7O|1O5c!>7VFk-)r zc?v$STNhV(#jvn26{AI;6OTRHx`+M~%gL|K^x^9q*hO2fu{D&{N83l%C~d>U8s%e+ z@|jB3B}L2kr&nmrAHbQx$MCHcUmUI>%M!PUF<;d#^g06Z5bD8HjAj`#<|W)I8nxKI zP@z&HHRPE{zirK524cw~i_jF2A4co9m8-v@^(`E~-`j^Cl==1Un{9t^ABdjVs`5~L ze2AWS6cBx2*=8z6bKk%(qfJx)wXK!je^7JoDbdKqBU<{Ldlowuc)eVKU5i-HnTpY( zw~IHnt@+qRrQSrmoK*;`8jsG*O+|t4sPN#?Y)ow+KA)fFABCDT6{BV4yzn=b-Fxt= z)kE;@TZnT59yy|`zc|iH29Gpj>ik+AdlBzo9gTBmred_{@Y{aUF-X47zIrZ84b^j1 z>Y?7Pw&o|^QsVfS;eLngG8LoM*ICekrtfMG%B=+LbGfac<4*20=-4y{QsSzVFcqWa zPD4^kUM@x?MBKHMS9N*D;Zek+%b4*)W966Oh1Ct{bEaZ+c!qoCzWv@`E$jMcpwDHc z7hid46PDM>6N>`hdRy~}6ZdoOIi zxlTCq!hMDY(dPcYayCIyE&G1)9+!N16d1D>h>fseJ%~~<6{AH%7SDAni34|6dKaZN z^`Aw}Ifcv4IRzf^Ufd(zXDUW>or0aPgPpLCov<%AQFP>p#Y5L6v4rT_Wz38l(w#1s zWcWUMkf|6g_gHiU<1JI{Qnhu}A75&yH!Y;CWM8ZD7WAN_J;+pyR-gTZBswaIoEMKG z9$m&j+8vd4reZYnMr>T{Ab-M&vlV@=w>hL9JR9&VVa&xX3Z24R+xzKgE2d(!-v6-m z=z;s^n{gN53P_21_6ra7>=!D%3t*)r4c;j0{+JS*2H9mQM(bSw%Y*Js_<9RM^5Pcd zmNsVRx0OyuNaFXEe~1M^bvUszBsH>M_DsoL2_3ElT9>I9&H9Ql9dNhr3|Q742M@i~ zBxTo|dQx`1`DE)+hKRkb+WF2>^aoQhTJQGRwiDP!(RDqRi*bDYR>JhH!ZYINe$pe-0Lf;tn_}vTFX?7=6-@--&wvh z5Od-^m`n67iL?nz21^X$0i5qUEz6qweNl6!Vzk~jv2FDZZl4uH(@00D^tO}m&>J;E zrMGTue|$S9%^kF~)GLA{G8Losew5|0=-2Ap7jc8220U1Pcvj=t&X~9NRp(aC?Cj&- zozGN^W_d#oLQ3{xMHm{F5^Z-b36~JsD{j%{wD&!EN0F)YMvc^#`zc}T^I_}rS;yfP z<(4*P&w^5CIqv*apg)+3(X12UuFPj`y(!N;7}y!uda71=DV6?i`(yeSZM|#bh*VUf zN9*rar@jsEl68x}OQx1z$&2^o`nyF;KRDK}Ki$4$mWqnewp6P(M*Qc@xgmRrq_Bln z?Io7SFF;%uN2H=+wB-RSj-z%TK3z}?q)_SaMG;p_GHOdf44lIU-Cih`8XmKmE^0xTOJKh8Q_m<(JW{yJ++X$_%uVmEe}R$ zisZ#;{kA;b#k)?io2^}x?dp1VBl+s@mIv&ju3A!4QAxh~yXDdEyI%g_(eam>;%AVD z*MlV#(Z7G_<$r&RMQ}ZoiqW=I4IjV7TYlO7L0hq23VY`pmze^&hEtW;Etwxxp2(uK`3I1T4}|Ew+Px8=bI zO_979t>2ahERe2RAZ0DmxCX2z=(pv;2u+c^7_HxyN0dBPm=${oV2?0iyo7wg*#DG1~H&-eQ1z-$`~1ie{m)H#lGY-SWT~ zbam9GqLO^|cgq9TLHBOAe&C&;y0fI{{bR{jzmG&{icm3Hzip{7qFfzO9KV3euD@FZ zMy;!(HWihWM1QxXg0gvoX+z0x* ze(Y<= zulW1$>LnH(IZ>2+^>@pos$KmU-uev?si-7h{oV3_2H>jBz$=TMB1^vdyXC=%R8*3$ z{%(2Tl+4j{H9k4!wNHPyJQ$IRO7hj;Esv9LTH$QOi<{C`tQF}wu;i=1TON!^MJ4&_ z@0Lf)i#9m5F{*?Ir*PTzcguqjsi-7h{oV3_?vty!51;+AEa~r-2XvoY)qPS?Nxu5K z<+13r`nlg8CMA->`Kpvy9><+tKX+3ck&24ZmdB_`w>T%nH2{`s)^YWB%L6)tqdG$> zD#=%Ww>)sd>*|>>OB~N1`n%=9h*VUPul{a%e2xAdoo8RKlUY<_Z^ UUdK{kDjs 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