From c5371e19ccbaace7684d93f7f35c1aae40537fb2 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 12 Oct 2018 14:07:13 +0200 Subject: [PATCH 01/57] fix: initial layer line width factor is not a specialization of the line width any more They are not even in the same unit, so it cannot be a child. A parent setting should be exactly equal to all child settings combined. --- 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 138e1adcc5..5ca4fc78bb 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -961,20 +961,20 @@ "maximum_value_warning": "2 * machine_nozzle_size", "settable_per_mesh": false, "settable_per_extruder": true - }, - "initial_layer_line_width_factor": - { - "label": "Initial Layer Line Width", - "description": "Multiplier of the line width on the first layer. Increasing this could improve bed adhesion.", - "type": "float", - "unit": "%", - "default_value": 100.0, - "minimum_value": "0.001", - "maximum_value_warning": "150", - "settable_per_mesh": false, - "settable_per_extruder": true } } + }, + "initial_layer_line_width_factor": + { + "label": "Initial Layer Line Width", + "description": "Multiplier of the line width on the first layer. Increasing this could improve bed adhesion.", + "type": "float", + "unit": "%", + "default_value": 100.0, + "minimum_value": "0.001", + "maximum_value_warning": "150", + "settable_per_mesh": false, + "settable_per_extruder": true } } }, From 3d1ad32c57a60a958e7208033215600b10ff15a4 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 12 Oct 2018 15:54:02 +0200 Subject: [PATCH 02/57] feat: feature dependent flow settings --- resources/definitions/fdmprinter.def.json | 175 +++++++++++++++++++++- 1 file changed, 174 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 5ca4fc78bb..bac99d5c37 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2229,7 +2229,180 @@ "minimum_value_warning": "50", "maximum_value_warning": "150", "enabled": "machine_gcode_flavor != \"UltiGCode\"", - "settable_per_mesh": true + "settable_per_mesh": true, + "children": + { + "wall_material_flow": + { + "label": "Wall Flow", + "description": "Flow compensation on wall lines.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "flow", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "limit_to_extruder": "wall_0_extruder_nr if wall_x_extruder_nr == wall_0_extruder_nr else -1", + "settable_per_mesh": true, + "children": + { + "wall_0_material_flow": + { + "label": "Outer Wall Flow", + "description": "Flow compensation on the outermost wall line.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "wall_material_flow", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "limit_to_extruder": "wall_0_extruder_nr", + "settable_per_mesh": true + }, + "wall_x_material_flow": + { + "label": "Inner Wall(s) Flow", + "description": "Flow compensation on wall lines for all wall lines except the outermost one.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "wall_material_flow", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "limit_to_extruder": "wall_x_extruder_nr", + "settable_per_mesh": true + } + } + }, + "skin_material_flow": + { + "label": "Top/Bottom Flow", + "description": "Flow compensation on top/bottom lines.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "flow", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "enabled": "top_layers > 0 or bottom_layers > 0", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "roofing_material_flow": + { + "label": "Top Surface Skin Flow", + "description": "Flow compensation on lines of the areas at the top of the print.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "skin_material_flow", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "limit_to_extruder": "roofing_extruder_nr", + "settable_per_mesh": true, + "enabled": "roofing_layer_count > 0 and top_layers > 0" + }, + "infill_material_flow": + { + "label": "Infill Flow", + "description": "Flow compensation on infill lines.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "flow", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "enabled": "infill_sparse_density > 0", + "limit_to_extruder": "infill_extruder_nr", + "settable_per_mesh": true + }, + "skirt_brim_material_flow": + { + "label": "Skirt/Brim Flow", + "description": "Flow compensation on skirt or brim lines.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "flow", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim'", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_material_flow": + { + "label": "Support Flow", + "description": "Flow compensation on support structure lines.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "flow", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "limit_to_extruder": "support_infill_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_interface_material_flow": + { + "label": "Support Interface Flow", + "description": "Flow compensation on lines of support roof or floor.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "flow", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "enabled": "support_enable and support_interface_enable", + "limit_to_extruder": "support_interface_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true, + "children": + { + "support_roof_material_flow": + { + "label": "Support Roof Flow", + "description": "Flow compensation on support roof lines.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "extruderValue(support_roof_extruder_nr, 'support_interface_material_flow')", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "enabled": "support_enable and support_roof_enable", + "limit_to_extruder": "support_roof_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_bottom_material_flow": + { + "label": "Support Floor Flow", + "description": "Flow compensation on support floor lines.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_material_flow')", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "enabled": "support_enable and support_bottom_enable", + "limit_to_extruder": "support_bottom_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + } }, "material_flow_layer_0": { From d5db639c45a41eb5bcd2aca1060694da0b7e34d2 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 12 Oct 2018 15:54:34 +0200 Subject: [PATCH 03/57] move prime_tower_flow to rest of flow settings --- resources/definitions/fdmprinter.def.json | 30 +++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index bac99d5c37..07f16b5cc2 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2402,7 +2402,22 @@ "settable_per_extruder": true } } + }, + "prime_tower_material_flow": + { + "label": "Prime Tower Flow", + "description": "Flow compensation on prime tower lines.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "flow", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "settable_per_mesh": false, + "settable_per_extruder": true } + } }, "material_flow_layer_0": { @@ -5363,21 +5378,6 @@ "settable_per_mesh": false, "settable_per_extruder": false }, - "prime_tower_flow": - { - "label": "Prime Tower Flow", - "description": "Flow compensation: the amount of material extruded is multiplied by this value.", - "type": "float", - "unit": "%", - "enabled": "resolveOrValue('prime_tower_enable')", - "default_value": 100, - "value": "material_flow", - "minimum_value": "0.0001", - "minimum_value_warning": "50", - "maximum_value_warning": "150", - "settable_per_mesh": false, - "settable_per_extruder": true - }, "prime_tower_wipe_enabled": { "label": "Wipe Inactive Nozzle on Prime Tower", From 46bb322d0b407a8bc51c53fec9c226933390e675 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 12 Oct 2018 15:56:13 +0200 Subject: [PATCH 04/57] initial layer flow is now a multiplier on top of the material_flow that's because we should override the per-feature flow settings with one global material_flow_layer_0 setting to rule them all. The flow per feature is more accurate to these features, so the initial layer should expand all these seaprately. --- 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 07f16b5cc2..36363afb5d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2425,7 +2425,6 @@ "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": "0.0001", "minimum_value_warning": "50", From 3da558245fc7068bee9383a0ae6090f74f8e1ffd Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 12 Oct 2018 16:11:54 +0200 Subject: [PATCH 05/57] fix setting inheritance from material_flow --- resources/definitions/fdmprinter.def.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 36363afb5d..73fe8086c9 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2239,7 +2239,7 @@ "unit": "%", "type": "float", "default_value": 100, - "value": "flow", + "value": "material_flow", "minimum_value": "5", "minimum_value_warning": "50", "maximum_value_warning": "150", @@ -2284,7 +2284,7 @@ "unit": "%", "type": "float", "default_value": 100, - "value": "flow", + "value": "material_flow", "minimum_value": "5", "minimum_value_warning": "50", "maximum_value_warning": "150", @@ -2314,7 +2314,7 @@ "unit": "%", "type": "float", "default_value": 100, - "value": "flow", + "value": "material_flow", "minimum_value": "5", "minimum_value_warning": "50", "maximum_value_warning": "150", @@ -2329,7 +2329,7 @@ "unit": "%", "type": "float", "default_value": 100, - "value": "flow", + "value": "material_flow", "minimum_value": "5", "minimum_value_warning": "50", "maximum_value_warning": "150", @@ -2344,7 +2344,7 @@ "unit": "%", "type": "float", "default_value": 100, - "value": "flow", + "value": "material_flow", "minimum_value": "5", "minimum_value_warning": "50", "maximum_value_warning": "150", @@ -2359,7 +2359,7 @@ "unit": "%", "type": "float", "default_value": 100, - "value": "flow", + "value": "material_flow", "minimum_value": "5", "minimum_value_warning": "50", "maximum_value_warning": "150", @@ -2410,7 +2410,7 @@ "unit": "%", "type": "float", "default_value": 100, - "value": "flow", + "value": "material_flow", "minimum_value": "5", "minimum_value_warning": "50", "maximum_value_warning": "150", From 369994113b043e11ea91f943c5c7fa3a1ebcc7e4 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 12 Oct 2018 16:12:13 +0200 Subject: [PATCH 06/57] keep old name of prime_tower_flow --- 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 73fe8086c9..3169aa4e6b 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2403,7 +2403,7 @@ } } }, - "prime_tower_material_flow": + "prime_tower_flow": { "label": "Prime Tower Flow", "description": "Flow compensation on prime tower lines.", From 59c39c0f5f73d992a8115d5c9790be690132073a Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 17 Oct 2018 14:30:30 +0200 Subject: [PATCH 07/57] move setting prime_tower_flow also in default expert visibility --- resources/setting_visibility/expert.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 437790ef74..5e5a389ff9 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -113,6 +113,7 @@ material_bed_temperature_layer_0 material_adhesion_tendency material_surface_energy material_flow +prime_tower_flow material_flow_layer_0 retraction_enable retract_at_layer_change @@ -295,7 +296,6 @@ prime_tower_size prime_tower_min_volume prime_tower_position_x prime_tower_position_y -prime_tower_flow prime_tower_wipe_enabled ooze_shield_enabled ooze_shield_angle From 0b7b395db1ca1de962d57ee6766ec1930ce3600f Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 17 Oct 2018 14:30:59 +0200 Subject: [PATCH 08/57] have all flow settings in expert visibility --- resources/setting_visibility/expert.cfg | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 5e5a389ff9..5fa2ec1ff2 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -113,6 +113,17 @@ material_bed_temperature_layer_0 material_adhesion_tendency material_surface_energy material_flow +wall_material_flow +wall_0_material_flow +wall_x_material_flow +skin_material_flow +roofing_material_flow +infill_material_flow +skirt_brim_material_flow +support_material_flow +support_interface_material_flow +support_roof_material_flow +support_bottom_material_flow prime_tower_flow material_flow_layer_0 retraction_enable From 542918c364dbbece4dc8a334182638db7ff11bab Mon Sep 17 00:00:00 2001 From: Cataldo URSO Date: Fri, 5 Apr 2019 11:08:39 +0200 Subject: [PATCH 09/57] Add files via upload Adding Geetech A30 and FLSUN QQ-S extruder definitions --- .../extruders/flsun_qq_s_extruder_0.def.json | 16 ++++++++++++++++ .../extruders/geeetech_a30_extruder_0.def.json | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 resources/extruders/flsun_qq_s_extruder_0.def.json create mode 100644 resources/extruders/geeetech_a30_extruder_0.def.json diff --git a/resources/extruders/flsun_qq_s_extruder_0.def.json b/resources/extruders/flsun_qq_s_extruder_0.def.json new file mode 100644 index 0000000000..cba424e182 --- /dev/null +++ b/resources/extruders/flsun_qq_s_extruder_0.def.json @@ -0,0 +1,16 @@ +{ + "id": "flsun_qq_s_extruder_0", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "flsun_qq_s", + "position": "0" + }, + + "overrides": { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} diff --git a/resources/extruders/geeetech_a30_extruder_0.def.json b/resources/extruders/geeetech_a30_extruder_0.def.json new file mode 100644 index 0000000000..bc1d6a6ed6 --- /dev/null +++ b/resources/extruders/geeetech_a30_extruder_0.def.json @@ -0,0 +1,16 @@ +{ + "id": "geeetech_a30_extruder_0", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "geeetech_a30", + "position": "0" + }, + + "overrides": { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} From 202734d7f1e6f22c414731fc2bf8bf6423f65035 Mon Sep 17 00:00:00 2001 From: Cataldo URSO Date: Fri, 5 Apr 2019 11:10:41 +0200 Subject: [PATCH 10/57] Add files via upload Adding Geetech A30 and FLSUN-QQS-S machine definitions --- resources/definitions/Geeetech_A30.def.json | 132 ++++++++++++++++++++ resources/definitions/flsun_qq_s.def.json | 35 ++++++ 2 files changed, 167 insertions(+) create mode 100644 resources/definitions/Geeetech_A30.def.json create mode 100644 resources/definitions/flsun_qq_s.def.json diff --git a/resources/definitions/Geeetech_A30.def.json b/resources/definitions/Geeetech_A30.def.json new file mode 100644 index 0000000000..a530b37699 --- /dev/null +++ b/resources/definitions/Geeetech_A30.def.json @@ -0,0 +1,132 @@ +{ + "id": "geeetech_a30", + "version": 2, + "name": "Geeetech A30", + "inherits": "fdmprinter", + "metadata": { + "author": "William & Cataldo URSO", + "manufacturer": "Shenzhen Geeetech Technology", + "setting_version": 1, + "file_formats": "text/x-gcode", + "visible": true, + "has_materials": true, + "preferred_quality_type": "draft", + "machine_extruder_trains": { "0": "geeetech_a30_extruder_0" } + + }, + + "overrides": { + "machine_name": { + "default_value": "Geeetech A30" + }, + "machine_start_gcode": { + "default_value": "G28 ;Home\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG1 Z15.0 F6000 ;Move the platform down 15mm\nG92 E0\nG1 F200 E3\nG92 E0" + }, + "machine_end_gcode": { + "default_value": "M104 S0;Cooling the heat end\nM140 S0;Cooling the heat bed\nG92 E1\nG1 E-1 F300\nG28 X0 Y0;Home X axis and Y axis\nM84" + }, + "machine_width": { + "default_value": 320 + }, + "machine_height": { + "default_value": 420 + }, + "machine_depth": { + "default_value": 320 + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_center_is_zero": { + "default_value": false + }, + "material_diameter": { + "default_value": 1.75 + }, + "material_bed_temperature": { + "default_value": 60 + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "layer_height": { + "default_value": 0.1 + }, + "layer_height_0": { + "default_value": 0.3 + }, + "retraction_amount": { + "default_value": 2.0 + }, + "retraction_speed": { + "default_value": 25 + }, + "retraction_retract_speed": { + "default_value": 25 + }, + "retraction_prime_speed": { + "default_value": 25 + }, + "adhesion_type": { + "default_value": "skirt" + }, + "machine_head_polygon": { + "default_value": [ + [-75, 35], + [18, 35], + [18, -18], + [-75, -18] + ] + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [-75, 35], + [18, 35], + [18, -18], + [-75, -18] + ] + }, + "gantry_height": { + "default_value": 55 + }, + "machine_max_feedrate_x": { + "default_value": 300 + }, + "machine_max_feedrate_y": { + "default_value": 300 + }, + "machine_max_feedrate_z": { + "default_value": 7 + }, + "machine_max_feedrate_e": { + "default_value": 50 + }, + "machine_max_acceleration_x": { + "default_value": 2000 + }, + "machine_max_acceleration_y": { + "default_value": 2000 + }, + "machine_max_acceleration_z": { + "default_value": 100 + }, + "machine_max_acceleration_e": { + "default_value": 10000 + }, + "machine_acceleration": { + "default_value": 2000 + }, + "machine_max_jerk_xy": { + "default_value": 10 + }, + "machine_max_jerk_z": { + "default_value": 1 + }, + "machine_max_jerk_e": { + "default_value": 5 + }, + "machine_gcode_flavor": { + "default_value": "Repetier" + } + } +} \ No newline at end of file diff --git a/resources/definitions/flsun_qq_s.def.json b/resources/definitions/flsun_qq_s.def.json new file mode 100644 index 0000000000..66b6f4c52f --- /dev/null +++ b/resources/definitions/flsun_qq_s.def.json @@ -0,0 +1,35 @@ +{ + "id": "flsun_qq_s", + "version": 2, + "name": "FLSUN QQ-S", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Cataldo URSO", + "manufacturer": "FLSUN", + "file_formats": "text/x-gcode", + "has_materials": true, + "preferred_quality_type": "draft", + "machine_extruder_trains": { "0": "flsun_qq_s_extruder_0" } + }, + "overrides":{ + "machine_center_is_zero":{ "default_value": true }, + "machine_shape":{ "default_value": "elliptic" }, + "machine_width": { "default_value": 260 }, + "machine_depth": { "default_value": 260 }, + "machine_height": { "default_value": 370 }, + "z_seam_type":{ "default_value": "back" }, + "top_thickness":{ "default_value": 5 }, + "bottom_layers":{ "default_value": 4 }, + "gantry_height": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 }, + "machine_start_gcode":{ "default_value":"G21\nG90\nM82\nM107 T0\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG28\nG92 E0\nG0 E3 F200\nG92 E0\n" }, + "machine_end_gcode":{ "default_value":"M107 T0\nM104 S0\nM104 S0 T1\nM140 S0\nG92 E0\nG91\nG1 E-1 F300 \nG1 Z+0.5 E-5 X-20 Y-20 F9000\nG28 X0 Y0\nM84 ;steppers off\nG90 ;absolute positioning\n" }, + "infill_sparse_density": { "default_value": 10 }, + "machine_head_with_fans_polygon": { "default_value": [[ 0, 0 ],[ 0, 0 ],[ 0, 0 ],[ 0, 0 ]] }, + "retraction_enable": { "default_value": true }, + "machine_heated_bed": { "default_value": true }, + "machine_gcode_flavor": { "default_value": "Repetier" } + } +} From 3845da24a18867a50a949cff153cb4923ce7ccf7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 23 May 2019 15:53:00 +0200 Subject: [PATCH 11/57] Add new material properties for cleanly breaking off materials When performing a long retract, the firmware can use these material properties to determine how fast and how far it needs to retract. The retraction goes in two stages: Anti-ooze retraction stops oozing, and then the break retraction breaks off the filament from the bead in the nozzle. Contributes to issue CURA-6329. --- resources/definitions/fdmprinter.def.json | 58 +++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 793a0e0889..f8cf1eb97f 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2234,6 +2234,64 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "material_crystallinity": + { + "label": "Crystalline Material", + "description": "Is this material the type that breaks off cleanly when heated, or is it the type that produces long intertwined polymer chains?", + "type": "bool", + "default_value": true, + "enabled": false, + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_anti_ooze_retraction_distance": + { + "label": "Anti-ooze Retraction Distance", + "description": "How far the material needs to be retracted before it stops oozing.", + "type": "float", + "unit": "mm", + "default_value": 4, + "minimum_value": "0", + "maximum_value_warning": "retraction_amount", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_anti_ooze_retraction_speed": + { + "label": "Anti-ooze Retraction Speed", + "description": "How fast the material needs to be retracted during a filament switch to prevent oozing.", + "type": "float", + "unit": "mm/s", + "default_value": 5, + "minimum_value": "0", + "maximum_value": "machine_max_feedrate_e", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_break_distance": + { + "label": "Break Retraction Distance", + "description": "How far can the filament be stretched before it breaks, while heated?", + "type": "float", + "unit": "mm", + "default_value": 16, + "minimum_value": "0", + "maximum_value_warning": "retraction_amount * 4", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_break_speed": + { + "label": "Break Retraction Speed", + "description": "How fast does the filament need to be retracted in order to break cleanly?", + "type": "float", + "unit": "mm/s", + "default_value": 2, + "minimum_value": "0", + "maximum_value": "machine_max_feedrate_e", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "material_flow": { "label": "Flow", From d7d51571b5ebc4cb3392cf520303e79443d9f572 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 3 Jun 2019 17:25:00 +0200 Subject: [PATCH 12/57] Add additional settings from XML materials These are all needed to implement the end-of-filament deprime procedure in the PPA's experiment. They are not necessary for slicing. Contributes to issue CURA-6329. --- resources/definitions/fdmprinter.def.json | 60 ++++++++++++++++++++--- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index f8cf1eb97f..6c315329de 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2268,10 +2268,10 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "material_break_distance": + "material_break_preparation_distance": { - "label": "Break Retraction Distance", - "description": "How far can the filament be stretched before it breaks, while heated?", + "label": "Break Preparation Retraction Distance", + "description": "How far the filament can be stretched before it breaks, while heated.", "type": "float", "unit": "mm", "default_value": 16, @@ -2280,10 +2280,10 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "material_break_speed": + "material_break_preparation_speed": { - "label": "Break Retraction Speed", - "description": "How fast does the filament need to be retracted in order to break cleanly?", + "label": "Break Preparation Retraction Speed", + "description": "How fast the filament needs to be retracted just before breaking it off in a retraction.", "type": "float", "unit": "mm/s", "default_value": 2, @@ -2292,6 +2292,54 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "material_break_preparation_temperature": + { + "label": "Break Preparation Temperature", + "description": "The temperature at which the filament needs to be stretched towards breaking.", + "type": "float", + "unit": "°C", + "default_value": 200, + "minimum_value": "-273.15", + "maximum_value_warning": "300", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_break_distance": + { + "label": "Break Retraction Distance", + "description": "How far to retract the filament in order to break it cleanly.", + "type": "float", + "unit": "mm", + "default_value": 50, + "minimum_value_warning": "0", + "maximum_value_warning": "100", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_break_speed": + { + "label": "Break Retraction Speed", + "description": "The speed at which to retract the filament in order to break it cleanly.", + "type": "float", + "unit": "mm/s", + "default_value": 25, + "minimum_value": "0", + "maximum_value": "machine_max_feedrate_e", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_break_temperature": + { + "label": "Break Temperature", + "description": "The temperature at which the filament is broken for a clean break.", + "type": "float", + "unit": "°C", + "default_value": 50, + "minimum_value": "-273.15", + "maximum_value_warning": "300", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "material_flow": { "label": "Flow", From 3d6e43ba9e874240321a4112000b8f2e5b571a06 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 3 Jun 2019 17:28:53 +0200 Subject: [PATCH 13/57] Disable deprime-related settings Cura needs to be able to read these from the XML profiles in order to set up the experiment, but they don't affect slicing so the user doesn't need to adjust them. Contributes to issue CURA-6329. --- 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 6c315329de..eebca3b87c 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2251,6 +2251,7 @@ "type": "float", "unit": "mm", "default_value": 4, + "enabled": false, "minimum_value": "0", "maximum_value_warning": "retraction_amount", "settable_per_mesh": false, @@ -2263,6 +2264,7 @@ "type": "float", "unit": "mm/s", "default_value": 5, + "enabled": false, "minimum_value": "0", "maximum_value": "machine_max_feedrate_e", "settable_per_mesh": false, @@ -2275,6 +2277,7 @@ "type": "float", "unit": "mm", "default_value": 16, + "enabled": false, "minimum_value": "0", "maximum_value_warning": "retraction_amount * 4", "settable_per_mesh": false, @@ -2287,6 +2290,7 @@ "type": "float", "unit": "mm/s", "default_value": 2, + "enabled": false, "minimum_value": "0", "maximum_value": "machine_max_feedrate_e", "settable_per_mesh": false, @@ -2299,6 +2303,7 @@ "type": "float", "unit": "°C", "default_value": 200, + "enabled": false, "minimum_value": "-273.15", "maximum_value_warning": "300", "settable_per_mesh": false, @@ -2311,6 +2316,7 @@ "type": "float", "unit": "mm", "default_value": 50, + "enabled": false, "minimum_value_warning": "0", "maximum_value_warning": "100", "settable_per_mesh": false, @@ -2323,6 +2329,7 @@ "type": "float", "unit": "mm/s", "default_value": 25, + "enabled": false, "minimum_value": "0", "maximum_value": "machine_max_feedrate_e", "settable_per_mesh": false, @@ -2335,6 +2342,7 @@ "type": "float", "unit": "°C", "default_value": 50, + "enabled": false, "minimum_value": "-273.15", "maximum_value_warning": "300", "settable_per_mesh": false, From b9e4ce8d150bfec323d764be76f881e249084c07 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 4 Jun 2019 17:06:41 +0200 Subject: [PATCH 14/57] Remove break preparation temperature This setting is not used in the deprime procedure. Contributes to issue CURA-6329. --- resources/definitions/fdmprinter.def.json | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index eebca3b87c..16b5ae270b 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2296,19 +2296,6 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "material_break_preparation_temperature": - { - "label": "Break Preparation Temperature", - "description": "The temperature at which the filament needs to be stretched towards breaking.", - "type": "float", - "unit": "°C", - "default_value": 200, - "enabled": false, - "minimum_value": "-273.15", - "maximum_value_warning": "300", - "settable_per_mesh": false, - "settable_per_extruder": true - }, "material_break_distance": { "label": "Break Retraction Distance", @@ -2317,7 +2304,7 @@ "unit": "mm", "default_value": 50, "enabled": false, - "minimum_value_warning": "0", + "minimum_value": "0", "maximum_value_warning": "100", "settable_per_mesh": false, "settable_per_extruder": true From a0c3738a49649f17d87a01e72731cadc84a6c038 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 4 Jun 2019 17:07:59 +0200 Subject: [PATCH 15/57] Add translations for deprime settings These need to be read for the deprime experiments in the PPA. Contributes to issue CURA-6329. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index f057585cb5..2fb23d53e8 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -1180,6 +1180,14 @@ class XmlMaterialProfile(InstanceContainer): "surface energy": "material_surface_energy", "shrinkage percentage": "material_shrinkage_percentage", "build volume temperature": "build_volume_temperature", + "anti ooze retract position": "material_anti_ooze_retraction_distance", + "anti ooze retract speed": "material_anti_ooze_retraction_speed", + "break preparation position": "material_break_preparation_distance", + "break preparation speed": "material_break_preparation_speed", + "break preparation temperature": "material_break_preparation_temperature", + "break position": "material_break_distance", + "break speed": "material_break_speed", + "break temperature": "material_break_temperature" } __unmapped_settings = [ "hardware compatible", From 36a206b418f3585689185426eefe0eb500926b77 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 4 Jun 2019 17:23:20 +0200 Subject: [PATCH 16/57] Also remove translation for break preparation temperature This setting is no longer used. If I don't remove it, it'll complain when syncing materials with the printer because it tries to serialise the material profiles then. Contributes to issue CURA-6329. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 2fb23d53e8..7e99b0f725 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -1184,7 +1184,6 @@ class XmlMaterialProfile(InstanceContainer): "anti ooze retract speed": "material_anti_ooze_retraction_speed", "break preparation position": "material_break_preparation_distance", "break preparation speed": "material_break_preparation_speed", - "break preparation temperature": "material_break_preparation_temperature", "break position": "material_break_distance", "break speed": "material_break_speed", "break temperature": "material_break_temperature" From ccbc00c2ee688090057056537dcca01694e7dba8 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 6 Jun 2019 11:16:30 +0200 Subject: [PATCH 17/57] Don't prime-blob when print-sequence is one-at-a-time. [CURA-6414] --- resources/definitions/builder_premium_large.def.json | 2 +- resources/definitions/builder_premium_medium.def.json | 2 +- resources/definitions/builder_premium_small.def.json | 2 +- resources/definitions/fdmprinter.def.json | 2 +- resources/definitions/ultimaker3.def.json | 2 +- resources/definitions/ultimaker_s5.def.json | 2 +- resources/definitions/winbo_dragonl4.def.json | 2 +- resources/definitions/winbo_mini2.def.json | 2 +- resources/definitions/winbo_superhelper105.def.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/definitions/builder_premium_large.def.json b/resources/definitions/builder_premium_large.def.json index 3ceae8d63f..feb6082c55 100644 --- a/resources/definitions/builder_premium_large.def.json +++ b/resources/definitions/builder_premium_large.def.json @@ -55,7 +55,7 @@ "prime_tower_wipe_enabled": { "default_value": false }, "prime_tower_min_volume": { "default_value": 50 }, - "prime_blob_enable": { "enabled": true }, + "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, diff --git a/resources/definitions/builder_premium_medium.def.json b/resources/definitions/builder_premium_medium.def.json index 5f608ba2a8..cea28b4bea 100644 --- a/resources/definitions/builder_premium_medium.def.json +++ b/resources/definitions/builder_premium_medium.def.json @@ -55,7 +55,7 @@ "prime_tower_wipe_enabled": { "default_value": false }, "prime_tower_min_volume": { "default_value": 50 }, - "prime_blob_enable": { "enabled": true }, + "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, diff --git a/resources/definitions/builder_premium_small.def.json b/resources/definitions/builder_premium_small.def.json index a19773ec05..688a62d02c 100644 --- a/resources/definitions/builder_premium_small.def.json +++ b/resources/definitions/builder_premium_small.def.json @@ -54,7 +54,7 @@ "prime_tower_wipe_enabled": { "default_value": false }, "prime_tower_min_volume": { "default_value": 50 }, - "prime_blob_enable": { "enabled": true }, + "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ebbb6a5a3c..0c05fd45b8 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4622,7 +4622,7 @@ "label": "Enable Prime Blob", "description": "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.", "type": "bool", - "resolve": "any(extruderValues('prime_blob_enable'))", + "resolve": "any(extruderValues('prime_blob_enable')) and resolveOrValue('print_sequence') != 'one_at_a_time'", "default_value": false, "settable_per_mesh": false, "settable_per_extruder": true, diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index d2cd0376d3..1ad2579295 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -79,7 +79,7 @@ "prime_tower_position_x": { "value": "machine_depth - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) - 30" }, "prime_tower_wipe_enabled": { "default_value": false }, - "prime_blob_enable": { "enabled": true, "default_value": true }, + "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'", "default_value": true }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index 0ebd956aa1..0fb94e8f55 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -69,7 +69,7 @@ "machine_end_gcode": { "default_value": "" }, "prime_tower_position_x": { "default_value": 345 }, "prime_tower_position_y": { "default_value": 222.5 }, - "prime_blob_enable": { "enabled": true, "default_value": false }, + "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'", "default_value": false }, "speed_travel": { diff --git a/resources/definitions/winbo_dragonl4.def.json b/resources/definitions/winbo_dragonl4.def.json index bf52a785e9..7340f52739 100644 --- a/resources/definitions/winbo_dragonl4.def.json +++ b/resources/definitions/winbo_dragonl4.def.json @@ -41,7 +41,7 @@ "machine_extruder_count": { "default_value": 1 }, "machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nM9998\nG28 X0 Y0\nG28 Z0\nG1 F6000 Z0.3\nG92 E0\nG1 F800 X585 E12\nG92 E0" }, "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" }, - "prime_blob_enable": { "enabled": true }, + "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, diff --git a/resources/definitions/winbo_mini2.def.json b/resources/definitions/winbo_mini2.def.json index f1c94ca07e..5b94b9a3fa 100644 --- a/resources/definitions/winbo_mini2.def.json +++ b/resources/definitions/winbo_mini2.def.json @@ -41,7 +41,7 @@ "machine_extruder_count": { "default_value": 1 }, "machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28 X0 Y0\nG28 Z0\nG1 F1000 Z3\nG1 F4000 X0\nG1 F4000 Y0\nG1 F1000 Z0.2\nG92 E0\nG1 F1000 X30 E8\nG92 E0\nM117 Printing." }, "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" }, - "prime_blob_enable": { "enabled": true }, + "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, diff --git a/resources/definitions/winbo_superhelper105.def.json b/resources/definitions/winbo_superhelper105.def.json index ac78467a2a..0a10d3c7e9 100644 --- a/resources/definitions/winbo_superhelper105.def.json +++ b/resources/definitions/winbo_superhelper105.def.json @@ -41,7 +41,7 @@ "machine_extruder_count": { "default_value": 1 }, "machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28 X0 Y0\nG28 Z0\nG1 F6000 Z0.3\nG92 E0\nG1 F1000 X30 E8\nG92 E0\nM117 Printing." }, "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" }, - "prime_blob_enable": { "enabled": true }, + "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, From 960a20652afdc2ee136a9fc93a5df346cce7273f Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jun 2019 12:30:05 +0200 Subject: [PATCH 18/57] Add warning state for prime blob and CheckBox CURA-6414 --- resources/definitions/fdmprinter.def.json | 3 +- resources/qml/Settings/SettingCheckBox.qml | 52 ++++++++++++++++------ 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0c05fd45b8..f9ff188bb8 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4626,7 +4626,8 @@ "default_value": false, "settable_per_mesh": false, "settable_per_extruder": true, - "enabled": false + "enabled": false, + "warning_value": "True if resolveOrValue('print_sequence') == 'one_at_a_time' else None" }, "extruder_prime_pos_x": { diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml index 8c0c58f371..694c4125ea 100644 --- a/resources/qml/Settings/SettingCheckBox.qml +++ b/resources/qml/Settings/SettingCheckBox.qml @@ -91,27 +91,27 @@ SettingItem } width: height - color: - { - if (!enabled) - { - return UM.Theme.getColor("setting_control_disabled") - } - if (control.containsMouse || control.activeFocus) - { - return UM.Theme.getColor("setting_control_highlight") - } - return UM.Theme.getColor("setting_control") - } - radius: UM.Theme.getSize("setting_control_radius").width border.width: UM.Theme.getSize("default_lining").width + border.color: { - if (!enabled) + if(!enabled) { return UM.Theme.getColor("setting_control_disabled_border") } + switch (propertyProvider.properties.validationState) + { + case "ValidatorState.Invalid": + case "ValidatorState.Exception": + case "ValidatorState.MinimumError": + case "ValidatorState.MaximumError": + return UM.Theme.getColor("setting_validation_error"); + case "ValidatorState.MinimumWarning": + case "ValidatorState.MaximumWarning": + return UM.Theme.getColor("setting_validation_warning"); + } + // Validation is OK. if (control.containsMouse || control.activeFocus) { return UM.Theme.getColor("setting_control_border_highlight") @@ -119,6 +119,30 @@ SettingItem return UM.Theme.getColor("setting_control_border") } + color: { + if (!enabled) + { + return UM.Theme.getColor("setting_control_disabled") + } + switch (propertyProvider.properties.validationState) + { + case "ValidatorState.Invalid": + case "ValidatorState.Exception": + case "ValidatorState.MinimumError": + case "ValidatorState.MaximumError": + return UM.Theme.getColor("setting_validation_error_background") + case "ValidatorState.MinimumWarning": + case "ValidatorState.MaximumWarning": + return UM.Theme.getColor("setting_validation_warning_background") + } + // Validation is OK. + if (control.containsMouse || control.activeFocus) + { + return UM.Theme.getColor("setting_control_highlight") + } + return UM.Theme.getColor("setting_control") + } + UM.RecolorImage { anchors.verticalCenter: parent.verticalCenter From 47ecdda0bcae14330626632171196a6e74f21d56 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 6 Jun 2019 12:31:04 +0200 Subject: [PATCH 19/57] Show prime blob by default CURA-6414 So user can see if it's in a warning state. --- resources/definitions/builder_premium_large.def.json | 2 +- resources/definitions/builder_premium_medium.def.json | 2 +- resources/definitions/builder_premium_small.def.json | 2 +- resources/definitions/ultimaker3.def.json | 2 +- resources/definitions/ultimaker_s5.def.json | 2 +- resources/definitions/winbo_dragonl4.def.json | 2 +- resources/definitions/winbo_mini2.def.json | 2 +- resources/definitions/winbo_superhelper105.def.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/definitions/builder_premium_large.def.json b/resources/definitions/builder_premium_large.def.json index feb6082c55..3ceae8d63f 100644 --- a/resources/definitions/builder_premium_large.def.json +++ b/resources/definitions/builder_premium_large.def.json @@ -55,7 +55,7 @@ "prime_tower_wipe_enabled": { "default_value": false }, "prime_tower_min_volume": { "default_value": 50 }, - "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, + "prime_blob_enable": { "enabled": true }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, diff --git a/resources/definitions/builder_premium_medium.def.json b/resources/definitions/builder_premium_medium.def.json index cea28b4bea..5f608ba2a8 100644 --- a/resources/definitions/builder_premium_medium.def.json +++ b/resources/definitions/builder_premium_medium.def.json @@ -55,7 +55,7 @@ "prime_tower_wipe_enabled": { "default_value": false }, "prime_tower_min_volume": { "default_value": 50 }, - "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, + "prime_blob_enable": { "enabled": true }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, diff --git a/resources/definitions/builder_premium_small.def.json b/resources/definitions/builder_premium_small.def.json index 688a62d02c..a19773ec05 100644 --- a/resources/definitions/builder_premium_small.def.json +++ b/resources/definitions/builder_premium_small.def.json @@ -54,7 +54,7 @@ "prime_tower_wipe_enabled": { "default_value": false }, "prime_tower_min_volume": { "default_value": 50 }, - "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, + "prime_blob_enable": { "enabled": true }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index 1ad2579295..d2cd0376d3 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -79,7 +79,7 @@ "prime_tower_position_x": { "value": "machine_depth - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) - 30" }, "prime_tower_wipe_enabled": { "default_value": false }, - "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'", "default_value": true }, + "prime_blob_enable": { "enabled": true, "default_value": true }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index 0fb94e8f55..0ebd956aa1 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -69,7 +69,7 @@ "machine_end_gcode": { "default_value": "" }, "prime_tower_position_x": { "default_value": 345 }, "prime_tower_position_y": { "default_value": 222.5 }, - "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'", "default_value": false }, + "prime_blob_enable": { "enabled": true, "default_value": false }, "speed_travel": { diff --git a/resources/definitions/winbo_dragonl4.def.json b/resources/definitions/winbo_dragonl4.def.json index 7340f52739..bf52a785e9 100644 --- a/resources/definitions/winbo_dragonl4.def.json +++ b/resources/definitions/winbo_dragonl4.def.json @@ -41,7 +41,7 @@ "machine_extruder_count": { "default_value": 1 }, "machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nM9998\nG28 X0 Y0\nG28 Z0\nG1 F6000 Z0.3\nG92 E0\nG1 F800 X585 E12\nG92 E0" }, "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" }, - "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, + "prime_blob_enable": { "enabled": true }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, diff --git a/resources/definitions/winbo_mini2.def.json b/resources/definitions/winbo_mini2.def.json index 5b94b9a3fa..f1c94ca07e 100644 --- a/resources/definitions/winbo_mini2.def.json +++ b/resources/definitions/winbo_mini2.def.json @@ -41,7 +41,7 @@ "machine_extruder_count": { "default_value": 1 }, "machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28 X0 Y0\nG28 Z0\nG1 F1000 Z3\nG1 F4000 X0\nG1 F4000 Y0\nG1 F1000 Z0.2\nG92 E0\nG1 F1000 X30 E8\nG92 E0\nM117 Printing." }, "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" }, - "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, + "prime_blob_enable": { "enabled": true }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, diff --git a/resources/definitions/winbo_superhelper105.def.json b/resources/definitions/winbo_superhelper105.def.json index 0a10d3c7e9..ac78467a2a 100644 --- a/resources/definitions/winbo_superhelper105.def.json +++ b/resources/definitions/winbo_superhelper105.def.json @@ -41,7 +41,7 @@ "machine_extruder_count": { "default_value": 1 }, "machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28 X0 Y0\nG28 Z0\nG1 F6000 Z0.3\nG92 E0\nG1 F1000 X30 E8\nG92 E0\nM117 Printing." }, "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" }, - "prime_blob_enable": { "enabled": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, + "prime_blob_enable": { "enabled": true }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, From 27ea9c813e4313585af4146e62e70bdd5538deec Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 7 Jun 2019 13:57:56 +0200 Subject: [PATCH 20/57] Allow negative retraction distances You COULD want to extrude. Contributes to issue CURA-6329. --- resources/definitions/fdmprinter.def.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 16b5ae270b..3722aadfbf 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2252,7 +2252,7 @@ "unit": "mm", "default_value": 4, "enabled": false, - "minimum_value": "0", + "minimum_value_warning": "0", "maximum_value_warning": "retraction_amount", "settable_per_mesh": false, "settable_per_extruder": true @@ -2278,7 +2278,7 @@ "unit": "mm", "default_value": 16, "enabled": false, - "minimum_value": "0", + "minimum_value_warning": "0", "maximum_value_warning": "retraction_amount * 4", "settable_per_mesh": false, "settable_per_extruder": true @@ -2304,7 +2304,7 @@ "unit": "mm", "default_value": 50, "enabled": false, - "minimum_value": "0", + "minimum_value_warning": "0", "maximum_value_warning": "100", "settable_per_mesh": false, "settable_per_extruder": true From abda45ee59b7ddcff3271791ae09fbf8ba48cc9b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 7 Jun 2019 16:26:19 +0200 Subject: [PATCH 21/57] Set crystalline to false by default Because PLA is not crystalline. Contributes to issue CURA-6329. --- 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 3722aadfbf..bba2caedbb 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2239,7 +2239,7 @@ "label": "Crystalline Material", "description": "Is this material the type that breaks off cleanly when heated, or is it the type that produces long intertwined polymer chains?", "type": "bool", - "default_value": true, + "default_value": false, "enabled": false, "settable_per_mesh": false, "settable_per_extruder": true From 1ae8011cf7df0caedde2a6a7b10b407e2fb30b2f Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 12 Jun 2019 14:02:37 +0200 Subject: [PATCH 22/57] Clarify crystalline description (crystal clear?). [CURA-6329] --- 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 bba2caedbb..4f99a5be5d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2237,7 +2237,7 @@ "material_crystallinity": { "label": "Crystalline Material", - "description": "Is this material the type that breaks off cleanly when heated, or is it the type that produces long intertwined polymer chains?", + "description": "Is this material the type that breaks off cleanly when heated (crystalline), or is it the type that produces long intertwined polymer chains (non-crystalline)?", "type": "bool", "default_value": false, "enabled": false, From fd8dfb4185de0cd48c396d6286618b501892316d Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 14 Jun 2019 11:39:48 +0200 Subject: [PATCH 23/57] Fix resolve/value/warning definition for enable prime blob. [CURA-6414] --- resources/definitions/fdmprinter.def.json | 1 - resources/definitions/ultimaker3.def.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index f9ff188bb8..633325ce76 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4622,7 +4622,6 @@ "label": "Enable Prime Blob", "description": "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.", "type": "bool", - "resolve": "any(extruderValues('prime_blob_enable')) and resolveOrValue('print_sequence') != 'one_at_a_time'", "default_value": false, "settable_per_mesh": false, "settable_per_extruder": true, diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index d2cd0376d3..a297d33c82 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -79,7 +79,7 @@ "prime_tower_position_x": { "value": "machine_depth - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) - 30" }, "prime_tower_wipe_enabled": { "default_value": false }, - "prime_blob_enable": { "enabled": true, "default_value": true }, + "prime_blob_enable": { "enabled": true, "default_value": true, "value": "resolveOrValue('print_sequence') != 'one_at_a_time'" }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, From c2ad542e2196107a5b6fa8b7430d2f6af73f1534 Mon Sep 17 00:00:00 2001 From: maukcc Date: Tue, 18 Jun 2019 10:56:04 +0200 Subject: [PATCH 24/57] HMS434 update start gcode exruder gcode --- resources/definitions/hms434.def.json | 4 ++-- resources/extruders/hms434_tool_1.def.json | 4 ++-- resources/extruders/hms434_tool_2.def.json | 4 ++-- resources/extruders/hms434_tool_3.def.json | 4 ++-- resources/extruders/hms434_tool_4.def.json | 4 ++-- resources/extruders/hms434_tool_5.def.json | 4 ++-- resources/extruders/hms434_tool_6.def.json | 4 ++-- resources/extruders/hms434_tool_7.def.json | 4 ++-- resources/extruders/hms434_tool_8.def.json | 4 ++-- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/resources/definitions/hms434.def.json b/resources/definitions/hms434.def.json index bd229a305b..e41ca71c97 100644 --- a/resources/definitions/hms434.def.json +++ b/resources/definitions/hms434.def.json @@ -56,7 +56,7 @@ "prime_tower_position_y": {"value": 70 }, "prime_blob_enable": {"default_value": false }, "machine_max_feedrate_z": {"default_value": 1200 }, - "machine_start_gcode": {"default_value": "\n;Neither MaukCC nor any of MaukCC representatives has any liabilities or gives any warranties on this .gcode file, or on any or all objects made with this .gcode file.\n\nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\n\nG1 X150 Y10 F9000\nG30 H0\nM340 P0 S1500\n\nG1 X-20 Y-100 F9000;go to wipe point\nG1 Z0 F900\nG1 Z0.2 F900\nG1 Y-50 F9000\nG1 X150 Y10 F9000\nM117 HMS434 Printing ...\n\n" }, + "machine_start_gcode": {"default_value": "\n;Neither MaukCC nor any of MaukCC representatives has any liabilities or gives any warranties on this .gcode file, or on any or all objects made with this .gcode file.\n\nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\n\nG1 X-44 Y-100 F9000;go to wipe point\nG1 Z0 F900\nG1 Z0.2 F900\nM117 HMS434 Printing ...\n\n" }, "machine_end_gcode": {"default_value": "" }, "retraction_extra_prime_amount": {"minimum_value_warning": "-2.0" }, @@ -94,7 +94,7 @@ "material_initial_print_temperature": {"value": "material_print_temperature"}, "material_final_print_temperature": {"value": "material_print_temperature"}, "material_bed_temperature_layer_0": {"value": "material_bed_temperature + 1"}, - "material_flow": {"value": "120 if infill_sparse_density < 95 else 115"}, + "material_flow": {"value": "100"}, "retraction_amount": {"value": "1"}, "retraction_speed": {"value": "20"}, "retraction_prime_speed": {"value": "8"}, diff --git a/resources/extruders/hms434_tool_1.def.json b/resources/extruders/hms434_tool_1.def.json index bf5cefe5b3..c1e20140f3 100644 --- a/resources/extruders/hms434_tool_1.def.json +++ b/resources/extruders/hms434_tool_1.def.json @@ -17,10 +17,10 @@ "machine_nozzle_offset_y": { "default_value": 0.0 }, "material_diameter": { "default_value": 1.75 }, "machine_extruder_start_code": { - "default_value": "\nM109 T0 S{material_print_temperature}\nG1 X-18 Y-50 F9000\nG1 X150 Y10 F9000\n\n" + "default_value": "\n;changing to tool1\nM109 T0 S{material_print_temperature}\nG1 X-18 Y-50 F9000\nG1 X150 Y10 F9000\n\n" }, "machine_extruder_end_code": { - "default_value": "\nG1 X150 Y10 F9000\nG1 X-20 Y-50 F9000\nG1 Y-100 F3000\n\n" + "default_value": "\nG1 X150 Y10 F9000\nG1 X-20 Y-50 F9000\nG1 Y-100 F3000\n; ending tool1\n\n" } } } diff --git a/resources/extruders/hms434_tool_2.def.json b/resources/extruders/hms434_tool_2.def.json index 06e6ff98b7..a2015006dc 100644 --- a/resources/extruders/hms434_tool_2.def.json +++ b/resources/extruders/hms434_tool_2.def.json @@ -17,10 +17,10 @@ "machine_nozzle_offset_y": { "default_value": 0.0 }, "material_diameter": { "default_value": 1.75 }, "machine_extruder_start_code": { - "default_value": "\nM109 T1 S{material_print_temperature}\nG1 X-18 Y-50 F9000\nG1 X150 Y10 F9000\n\n" + "default_value": "\n;changing to tool2\nM109 T1 S{material_print_temperature}\nG1 X-18 Y-50 F9000\nG1 X150 Y10 F9000\n\n" }, "machine_extruder_end_code": { - "default_value": "\nG1 X150 Y10 F9000\nG1 X-20 Y-50 F9000\nG1 Y-100 F3000\n\n" + "default_value": "\nG1 X150 Y10 F9000\nG1 X-20 Y-50 F9000\nG1 Y-100 F3000\n; ending tool2\n\n" } } } diff --git a/resources/extruders/hms434_tool_3.def.json b/resources/extruders/hms434_tool_3.def.json index df0024c4ac..b0199d5523 100644 --- a/resources/extruders/hms434_tool_3.def.json +++ b/resources/extruders/hms434_tool_3.def.json @@ -17,10 +17,10 @@ "machine_nozzle_offset_y": { "default_value": 0.0 }, "material_diameter": { "default_value": 1.75 }, "machine_extruder_start_code": { - "default_value": "" + "default_value": "\n;changing to tool3" }, "machine_extruder_end_code": { - "default_value": "" + "default_value": "\n;ending tool3" } } } diff --git a/resources/extruders/hms434_tool_4.def.json b/resources/extruders/hms434_tool_4.def.json index 351f37dd7b..9346dafd67 100644 --- a/resources/extruders/hms434_tool_4.def.json +++ b/resources/extruders/hms434_tool_4.def.json @@ -17,10 +17,10 @@ "machine_nozzle_offset_y": { "default_value": 0.0 }, "material_diameter": { "default_value": 1.75 }, "machine_extruder_start_code": { - "default_value": "" + "default_value": "\n;changing to tool4" }, "machine_extruder_end_code": { - "default_value": "" + "default_value": "\n;ending tool4" } } } diff --git a/resources/extruders/hms434_tool_5.def.json b/resources/extruders/hms434_tool_5.def.json index 4e27173223..051227fb1b 100644 --- a/resources/extruders/hms434_tool_5.def.json +++ b/resources/extruders/hms434_tool_5.def.json @@ -17,10 +17,10 @@ "machine_nozzle_offset_y": { "default_value": 0.0 }, "material_diameter": { "default_value": 1.75 }, "machine_extruder_start_code": { - "default_value": "" + "default_value": "\n;changing to tool5" }, "machine_extruder_end_code": { - "default_value": "" + "default_value": "\n;ending tool5" } } } diff --git a/resources/extruders/hms434_tool_6.def.json b/resources/extruders/hms434_tool_6.def.json index 80abc23f0d..056bb66741 100644 --- a/resources/extruders/hms434_tool_6.def.json +++ b/resources/extruders/hms434_tool_6.def.json @@ -17,10 +17,10 @@ "machine_nozzle_offset_y": { "default_value": 0.0 }, "material_diameter": { "default_value": 1.75 }, "machine_extruder_start_code": { - "default_value": "" + "default_value": "\n;changing to tool6" }, "machine_extruder_end_code": { - "default_value": "" + "default_value": "\n;ending tool6" } } } diff --git a/resources/extruders/hms434_tool_7.def.json b/resources/extruders/hms434_tool_7.def.json index 9806a29fae..ff8f938e1c 100644 --- a/resources/extruders/hms434_tool_7.def.json +++ b/resources/extruders/hms434_tool_7.def.json @@ -17,10 +17,10 @@ "machine_nozzle_offset_y": { "default_value": 0.0 }, "material_diameter": { "default_value": 1.75 }, "machine_extruder_start_code": { - "default_value": "" + "default_value": "\n;changing to tool7" }, "machine_extruder_end_code": { - "default_value": "" + "default_value": "\n;ending tool7" } } } diff --git a/resources/extruders/hms434_tool_8.def.json b/resources/extruders/hms434_tool_8.def.json index 612d670b5d..2e9302e26c 100644 --- a/resources/extruders/hms434_tool_8.def.json +++ b/resources/extruders/hms434_tool_8.def.json @@ -17,10 +17,10 @@ "machine_nozzle_offset_y": { "default_value": 0.0 }, "material_diameter": { "default_value": 1.75 }, "machine_extruder_start_code": { - "default_value": "" + "default_value": "\n;changing to tool8" }, "machine_extruder_end_code": { - "default_value": "" + "default_value": "\n;ending tool8" } } } From eb8d353e115eeaaea35c03193b022bd2640e3407 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 19 Jun 2019 13:58:11 +0200 Subject: [PATCH 25/57] Add basic support for print job actions via Cloud output device --- .../resources/qml/MonitorPrintJobCard.qml | 5 -- .../resources/qml/MonitorPrinterCard.qml | 1 - .../resources/qml/MonitorQueue.qml | 2 - .../src/Cloud/CloudApiClient.py | 15 +++++ .../src/Cloud/CloudOutputController.py | 8 ++- .../src/Cloud/CloudOutputDevice.py | 53 ++++++++++-------- resources/qml/BorderGroup.qmlc.pqgKbT | Bin 0 -> 736 bytes 7 files changed, 50 insertions(+), 34 deletions(-) create mode 100644 resources/qml/BorderGroup.qmlc.pqgKbT diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml index 470eb84ac3..fd0870d351 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml @@ -22,10 +22,6 @@ Item // The print job which all other data is derived from property var printJob: null - // If the printer is a cloud printer or not. Other items base their enabled state off of this boolean. In the future - // they might not need to though. - property bool cloudConnection: Cura.MachineManager.activeMachineIsUsingCloudConnection - width: parent.width height: childrenRect.height @@ -217,7 +213,6 @@ Item } width: 32 * screenScaleFactor // TODO: Theme! height: 32 * screenScaleFactor // TODO: Theme! - enabled: !cloudConnection onClicked: enabled ? contextMenu.switchPopupState() : {} visible: { diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml index f4295ee18d..89687ceeb8 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml @@ -172,7 +172,6 @@ Item } width: 36 * screenScaleFactor // TODO: Theme! height: 36 * screenScaleFactor // TODO: Theme! - enabled: !cloudConnection onClicked: enabled ? contextMenu.switchPopupState() : {} visible: diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml index 8460425190..cd5a5d1a37 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml @@ -73,8 +73,6 @@ Item MouseArea { anchors.fill: manageQueueLabel - enabled: !cloudConnection - hoverEnabled: !cloudConnection onClicked: Cura.MachineManager.printerOutputDevices[0].openPrintJobControlPanel() onEntered: { diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py index adff94bbbc..4edb30db23 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py @@ -96,6 +96,21 @@ class CloudApiClient: reply = self._manager.post(self._createEmptyRequest(url), b"") self._addCallback(reply, on_finished, CloudPrintResponse) + ## Send a print job action to the cluster for the given print job. + # \param cluster_id: The ID of the cluster. + # \param cluster_job_id: The ID of the print job within the cluster. + # \param action: The name of the action to execute. + def doPrintJobAction(self, cluster_id: str, cluster_job_id: str, action: str, data: Dict[str, any] = None) -> None: + body = b"" + if data: + try: + body = json.dumps({"data": data}).encode() + except JSONDecodeError as err: + Logger.log("w", "Could not encode body: %s", err) + return + url = "{}/clusters/{}/print_jobs/{}/action/{}".format(self.CLUSTER_API_ROOT, cluster_id, cluster_job_id, action) + self._manager.post(self._createEmptyRequest(url), body) + ## We override _createEmptyRequest in order to add the user credentials. # \param url: The URL to request # \param content_type: The type of the body contents. diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputController.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputController.py index bd56ef3185..8c09483990 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputController.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputController.py @@ -1,5 +1,6 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.PrinterOutputController import PrinterOutputController from typing import TYPE_CHECKING @@ -13,10 +14,13 @@ class CloudOutputController(PrinterOutputController): # The cloud connection only supports fetching the printer and queue status and adding a job to the queue. # To let the UI know this we mark all features below as False. - self.can_pause = False - self.can_abort = False + self.can_pause = True + self.can_abort = True self.can_pre_heat_bed = False self.can_pre_heat_hotends = False self.can_send_raw_gcode = False self.can_control_manually = False self.can_update_firmware = False + + def setJobState(self, job: "PrintJobOutputModel", state: str): + self._output_device.setJobState(job.key, state) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index df513f4174..dcbeeb4626 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -6,6 +6,7 @@ from time import time from typing import Dict, List, Optional, Set, cast from PyQt5.QtCore import QObject, QUrl, pyqtProperty, pyqtSignal, pyqtSlot +from PyQt5.QtGui import QDesktopServices from UM import i18nCatalog from UM.Backend.Backend import BackendState @@ -399,6 +400,22 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is not None and print_job.state != "queued"] + def setJobState(self, print_job_uuid: str, state: str) -> None: + self._api.doPrintJobAction(self._cluster.cluster_id, print_job_uuid, state) + + @pyqtSlot(str) + def sendJobToTop(self, print_job_uuid: str) -> None: + self._api.doPrintJobAction(self._cluster.cluster_id, print_job_uuid, "move", + {"list": "queued", "to_position": 0}) + + @pyqtSlot(str) + def deleteJobFromQueue(self, print_job_uuid: str) -> None: + self._api.doPrintJobAction(self._cluster.cluster_id, print_job_uuid, "remove") + + @pyqtSlot(str) + def forceSendJob(self, print_job_uuid: str) -> None: + self._api.doPrintJobAction(self._cluster.cluster_id, print_job_uuid, "force") + @pyqtSlot(int, result = str) def formatDuration(self, seconds: int) -> str: return Duration(seconds).getDisplayString(DurationFormat.Format.Short) @@ -411,6 +428,18 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): def getDateCompleted(self, time_remaining: int) -> str: return formatDateCompleted(time_remaining) + @pyqtProperty(bool, notify=printJobsChanged) + def receivedPrintJobs(self) -> bool: + return bool(self._print_jobs) + + @pyqtSlot() + def openPrintJobControlPanel(self) -> None: + QDesktopServices.openUrl(QUrl("https://mycloud.ultimaker.com")) + + @pyqtSlot() + def openPrinterControlPanel(self) -> None: + QDesktopServices.openUrl(QUrl("https://mycloud.ultimaker.com")) + ## TODO: The following methods are required by the monitor page QML, but are not actually available using cloud. # TODO: We fake the methods here to not break the monitor page. @@ -422,30 +451,6 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): def setActiveCameraUrl(self, camera_url: "QUrl") -> None: pass - @pyqtProperty(bool, notify = printJobsChanged) - def receivedPrintJobs(self) -> bool: - return bool(self._print_jobs) - - @pyqtSlot() - def openPrintJobControlPanel(self) -> None: - pass - - @pyqtSlot() - def openPrinterControlPanel(self) -> None: - pass - - @pyqtSlot(str) - def sendJobToTop(self, print_job_uuid: str) -> None: - pass - - @pyqtSlot(str) - def deleteJobFromQueue(self, print_job_uuid: str) -> None: - pass - - @pyqtSlot(str) - def forceSendJob(self, print_job_uuid: str) -> None: - pass - @pyqtProperty("QVariantList", notify = _clusterPrintersChanged) def connectedPrintersTypeCount(self) -> List[Dict[str, str]]: return [] diff --git a/resources/qml/BorderGroup.qmlc.pqgKbT b/resources/qml/BorderGroup.qmlc.pqgKbT new file mode 100644 index 0000000000000000000000000000000000000000..0bb07b4a6761aa19a3bc17211da06fd1dc491556 GIT binary patch literal 736 zcmaJ;t4~647(FN;nA}Vjt4S~*VBcVi;&?wU7d0A9j$kktEN%n?b91v9 zbUunR61DkXT+jF2i;v>Rj^FEihx5bEe!{d2$Cw3UI)wY1r+hU4yiWj^r|wYm< z1tQ9jpAs%xN^NI8B^2T*8nT-v07C4I%yS$U=d+FcoGQ#A^iSQ*4{Orqs7BqsG z!4<1<56HFa$};26B}=ru^e4;Rcs^turk=zk5!6cFmC;(>C=vC0kLArmI$sS$F;t6k z|J#*x5iA8FxX}F({~i<4-4f5li1;MVXzK0fL6Gmw!XbL7z(h^N81j3|d<#WXQR2qY zxp+As(_&v{Exm~r>V)n0MRta-wawWc`E_cnAg-S>xefMlRW0$Z$gZZ7G$D zY*0&fw(@(-2CFpvdX@QI#Sr7hCbvr!*_&F&(V3h)IeS!b94 literal 0 HcmV?d00001 From 6cbe89f83283f047ff4fc81953abbd66dff76be1 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 19 Jun 2019 13:58:26 +0200 Subject: [PATCH 26/57] Remove weird file --- resources/qml/BorderGroup.qmlc.pqgKbT | Bin 736 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/qml/BorderGroup.qmlc.pqgKbT diff --git a/resources/qml/BorderGroup.qmlc.pqgKbT b/resources/qml/BorderGroup.qmlc.pqgKbT deleted file mode 100644 index 0bb07b4a6761aa19a3bc17211da06fd1dc491556..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 736 zcmaJ;t4~647(FN;nA}Vjt4S~*VBcVi;&?wU7d0A9j$kktEN%n?b91v9 zbUunR61DkXT+jF2i;v>Rj^FEihx5bEe!{d2$Cw3UI)wY1r+hU4yiWj^r|wYm< z1tQ9jpAs%xN^NI8B^2T*8nT-v07C4I%yS$U=d+FcoGQ#A^iSQ*4{Orqs7BqsG z!4<1<56HFa$};26B}=ru^e4;Rcs^turk=zk5!6cFmC;(>C=vC0kLArmI$sS$F;t6k z|J#*x5iA8FxX}F({~i<4-4f5li1;MVXzK0fL6Gmw!XbL7z(h^N81j3|d<#WXQR2qY zxp+As(_&v{Exm~r>V)n0MRta-wawWc`E_cnAg-S>xefMlRW0$Z$gZZ7G$D zY*0&fw(@(-2CFpvdX@QI#Sr7hCbvr!*_&F&(V3h)IeS!b94 From 9845178d26cc43157eca4a9c17772193fd8ebb00 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 20 Jun 2019 09:44:19 +0200 Subject: [PATCH 27/57] Remove superfluous bracket (causing 'EOF'). [CURA-6460] --- 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 cd680a26c1..0a26c1fc0c 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5305,7 +5305,7 @@ "type": "float", "default_value": 6, "minimum_value": "0", - "maximum_value_warning": "((resolveOrValue('prime_tower_size') * 0.5) ** 2 * 3.14159 * resolveOrValue('layer_height')", + "maximum_value_warning": "(resolveOrValue('prime_tower_size') * 0.5) ** 2 * 3.14159 * resolveOrValue('layer_height')", "enabled": "resolveOrValue('prime_tower_enable')", "settable_per_mesh": false, "settable_per_extruder": true From 93351ec9b9f354ea3e5bd74f50bb0783ce07e2d9 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 20 Jun 2019 12:36:15 +0200 Subject: [PATCH 28/57] Show context menu on printers with firmware 5.3 or later --- .../resources/qml/MonitorPrintJobCard.qml | 5 +++-- .../resources/qml/MonitorPrinterCard.qml | 5 ++--- .../resources/qml/MonitorQueue.qml | 12 +++++------- .../src/Cloud/CloudOutputDevice.py | 11 +++++++++++ .../src/Cloud/Models/CloudClusterPrintJobStatus.py | 1 - .../UM3NetworkPrinting/src/ClusterUM3OutputDevice.py | 5 +++++ .../UM3NetworkPrinting/src/UM3OutputDevicePlugin.py | 2 +- 7 files changed, 27 insertions(+), 14 deletions(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml index fd0870d351..b863712481 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml @@ -213,6 +213,7 @@ Item } width: 32 * screenScaleFactor // TODO: Theme! height: 32 * screenScaleFactor // TODO: Theme! + enabled: OutputDevice.supportsPrintJobActions onClicked: enabled ? contextMenu.switchPopupState() : {} visible: { @@ -245,7 +246,7 @@ Item MonitorInfoBlurb { id: contextMenuDisabledInfo - text: catalog.i18nc("@info", "These options are not available because you are monitoring a cloud printer.") + text: catalog.i18nc("@info", "Please update your printer's firmware to manage the queue remotely.") target: contextMenuButton } -} \ No newline at end of file +} diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml index 89687ceeb8..1f5a4cfcb2 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml @@ -172,7 +172,7 @@ Item } width: 36 * screenScaleFactor // TODO: Theme! height: 36 * screenScaleFactor // TODO: Theme! - + enabled: OutputDevice.supportsPrintJobActions onClicked: enabled ? contextMenu.switchPopupState() : {} visible: { @@ -205,7 +205,7 @@ Item MonitorInfoBlurb { id: contextMenuDisabledInfo - text: catalog.i18nc("@info", "These options are not available because you are monitoring a cloud printer.") + text: catalog.i18nc("@info", "Please update your printer's firmware to manage the queue remotely.") target: contextMenuButton } @@ -243,7 +243,6 @@ Item } } - // Divider Rectangle { diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml index cd5a5d1a37..369951fa9c 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml @@ -42,7 +42,6 @@ Item } height: 18 * screenScaleFactor // TODO: Theme! width: childrenRect.width - visible: !cloudConnection UM.RecolorImage { @@ -65,7 +64,7 @@ Item color: UM.Theme.getColor("monitor_text_link") font: UM.Theme.getFont("medium") // 14pt, regular linkColor: UM.Theme.getColor("monitor_text_link") - text: catalog.i18nc("@label link to connect manager", "Go to Cura Connect") + text: catalog.i18nc("@label link to connect manager", "Manage in browser") renderType: Text.NativeRendering } } @@ -73,7 +72,7 @@ Item MouseArea { anchors.fill: manageQueueLabel - onClicked: Cura.MachineManager.printerOutputDevices[0].openPrintJobControlPanel() + onClicked: OutputDevice.openPrintJobControlPanel() onEntered: { manageQueueText.font.underline = true @@ -196,8 +195,7 @@ Item color: UM.Theme.getColor("monitor_card_background") border.color: UM.Theme.getColor("monitor_card_border") radius: 2 * screenScaleFactor // TODO: Theme! - - visible: printJobList.model.length == 0 + visible: OutputDevice.printJobs.length == 0 Row { @@ -247,14 +245,14 @@ Item color: UM.Theme.getColor("monitor_text_link") font: UM.Theme.getFont("medium") // 14pt, regular linkColor: UM.Theme.getColor("monitor_text_link") - text: catalog.i18nc("@label link to connect manager", "View print history") + text: catalog.i18nc("@label link to connect manager", "Manage in browser") renderType: Text.NativeRendering } MouseArea { anchors.fill: parent hoverEnabled: true - onClicked: Cura.MachineManager.printerOutputDevices[0].openPrintJobControlPanel() + onClicked: OutputDevice.openPrintJobControlPanel() onEntered: { viewPrintHistoryText.font.underline = true diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index dcbeeb4626..34f062671f 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -16,6 +16,7 @@ from UM.Message import Message from UM.PluginRegistry import PluginRegistry from UM.Qt.Duration import Duration, DurationFormat from UM.Scene.SceneNode import SceneNode +from UM.Version import Version from cura.CuraApplication import CuraApplication from cura.PrinterOutput.NetworkedPrinterOutputDevice import AuthState, NetworkedPrinterOutputDevice @@ -49,6 +50,9 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): # The interval with which the remote clusters are checked CHECK_CLUSTER_INTERVAL = 10.0 # seconds + # The minimum version of firmware that support print job actions over cloud. + PRINT_JOB_ACTIONS_MIN_VERSION = Version("5.3.0") + # Signal triggered when the print jobs in the queue were changed. printJobsChanged = pyqtSignal() @@ -360,6 +364,13 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice): ).show() self.writeFinished.emit() + ## Whether the printer that this output device represents supports print job actions via the cloud. + @pyqtProperty(bool, notify = _clusterPrintersChanged) + def supportsPrintJobActions(self) -> bool: + version_number = self.printers[0].firmwareVersion.split(".") + firmware_version = Version([version_number[0], version_number[1], version_number[2]]) + return firmware_version >= self.PRINT_JOB_ACTIONS_MIN_VERSION + ## Gets the number of printers in the cluster. # We use a minimum of 1 because cloud devices are always a cluster and printer discovery needs it. @pyqtProperty(int, notify = _clusterPrintersChanged) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py index 79050521af..4a3823ccca 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py @@ -91,7 +91,6 @@ class CloudClusterPrintJobStatus(BaseCloudModel): def createOutputModel(self, controller: CloudOutputController) -> UM3PrintJobOutputModel: model = UM3PrintJobOutputModel(controller, self.uuid, self.name) self.updateOutputModel(model) - return model ## Creates a new configuration model diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py index 3f3cd4cdd6..6fbb115601 100644 --- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py @@ -140,6 +140,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): if self._printer_selection_dialog is not None: self._printer_selection_dialog.show() + ## Whether the printer that this output device represents supports print job actions via the local network. + @pyqtProperty(bool, constant=True) + def supportsPrintJobActions(self) -> bool: + return True + @pyqtProperty(int, constant=True) def clusterSize(self) -> int: return self._cluster_size diff --git a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py index be7bb1006a..e49077d66d 100644 --- a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py @@ -27,7 +27,7 @@ from UM.Version import Version from . import ClusterUM3OutputDevice, LegacyUM3OutputDevice from .Cloud.CloudOutputDeviceManager import CloudOutputDeviceManager -from .Cloud.CloudOutputDevice import CloudOutputDevice # typing +from .Cloud.CloudOutputDevice import CloudOutputDevice # typing if TYPE_CHECKING: from PyQt5.QtNetwork import QNetworkReply From 0513322f86f91e60d6ff7c0cce54b9b832bec610 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 20 Jun 2019 12:36:56 +0200 Subject: [PATCH 29/57] Fix expected controller options in test --- .../UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py index d11cfa8a0e..352efb292e 100644 --- a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py @@ -72,9 +72,9 @@ class TestCloudOutputDevice(TestCase): controller_fields = { "_output_device": self.device, - "can_abort": False, + "can_abort": True, "can_control_manually": False, - "can_pause": False, + "can_pause": True, "can_pre_heat_bed": False, "can_pre_heat_hotends": False, "can_send_raw_gcode": False, From baf9dc041cf56567c97f9ac17a469b1faf012556 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 20 Jun 2019 12:56:45 +0200 Subject: [PATCH 30/57] Fix typing of Any --- plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py index 4edb30db23..f1fd6f8b7c 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py @@ -100,7 +100,7 @@ class CloudApiClient: # \param cluster_id: The ID of the cluster. # \param cluster_job_id: The ID of the print job within the cluster. # \param action: The name of the action to execute. - def doPrintJobAction(self, cluster_id: str, cluster_job_id: str, action: str, data: Dict[str, any] = None) -> None: + def doPrintJobAction(self, cluster_id: str, cluster_job_id: str, action: str, data: Dict[str, Any] = None) -> None: body = b"" if data: try: From 1ab109ade00721604270ffb84f758b58ed172d33 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 20 Jun 2019 13:46:20 +0200 Subject: [PATCH 31/57] Fix 'resume' action --- plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml index 771bd4b8cf..fbae66117e 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml @@ -81,7 +81,7 @@ Item enabled: visible && !(printJob.state == "pausing" || printJob.state == "resuming"); onClicked: { if (printJob.state == "paused") { - printJob.setState("print"); + printJob.setState("resume"); popUp.close(); return; } From f5d94b96461cab34ec3d6fab4ee4fbcfdd1a6bdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=BE=D0=B1=D0=BE=D0=BA=D0=B8=D0=BD=D0=B5=D1=82?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0?= <40807893+Robokinetics@users.noreply.github.com> Date: Fri, 21 Jun 2019 11:53:06 +0300 Subject: [PATCH 32/57] Fixed the value of "retraction_amount" --- resources/definitions/erzay3d.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/erzay3d.def.json b/resources/definitions/erzay3d.def.json index 0eacce12b9..0a6d676bea 100644 --- a/resources/definitions/erzay3d.def.json +++ b/resources/definitions/erzay3d.def.json @@ -66,7 +66,7 @@ "material_print_temperature_layer_0": { "default_value": 220 }, "material_initial_print_temperature": { "default_value": 220 }, "material_final_print_temperature": { "default_value": 220 }, - "retraction_amount": { "default_value": 4 }, + "retraction_amount": { "default_value": 6.5 }, "speed_print": { "default_value": 40 }, "speed_infill": { "default_value": 60 }, From 0a0b4821efe6702f16e0327bf39039f1b162c2e9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Jun 2019 11:32:43 +0200 Subject: [PATCH 33/57] Added logging for cases where the upgrade of the profile failed CURA-6592 --- plugins/CuraProfileReader/CuraProfileReader.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py index eae672c11e..de0e97c806 100644 --- a/plugins/CuraProfileReader/CuraProfileReader.py +++ b/plugins/CuraProfileReader/CuraProfileReader.py @@ -32,7 +32,7 @@ class CuraProfileReader(ProfileReader): def read(self, file_name: str) -> List[Optional[InstanceContainer]]: try: with zipfile.ZipFile(file_name, "r") as archive: - results = [] #type: List[Optional[InstanceContainer]] + results = [] # type: List[Optional[InstanceContainer]] for profile_id in archive.namelist(): with archive.open(profile_id) as f: serialized = f.read() @@ -107,9 +107,11 @@ class CuraProfileReader(ProfileReader): if source_format in plugin["version_upgrade"] and plugin["version_upgrade"][source_format][1] == InstanceContainer.Version] if not profile_convert_funcs: + Logger.log("w", "Unable to find an upgrade path for the profile [%s]", profile_id) return [] filenames, outputs = profile_convert_funcs[0](serialized, profile_id) if filenames is None and outputs is None: + Logger.log("w", "The conversion failed to return any usable data for [%s]", profile_id) return [] return list(zip(outputs, filenames)) From 9e4f2a441b30195a7d71df501eb7537b4735e19f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Jun 2019 11:59:13 +0200 Subject: [PATCH 34/57] Revert "Also upgrade profiles if only the setting version is incorrect" This reverts commit 77d396b9bdbfe52f70548b26adcc18038ff6115d. The upgrade only needs to be run if it still uses "profile" as type (eg 2.1 profiles). So for a regular setting version upgrade, this does not need to be run (and breaks importing profiles). Fixes CURA-6592 --- plugins/CuraProfileReader/CuraProfileReader.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py index de0e97c806..daab73abc2 100644 --- a/plugins/CuraProfileReader/CuraProfileReader.py +++ b/plugins/CuraProfileReader/CuraProfileReader.py @@ -8,7 +8,6 @@ from UM.PluginRegistry import PluginRegistry from UM.Logger import Logger from UM.Settings.ContainerFormatError import ContainerFormatError from UM.Settings.InstanceContainer import InstanceContainer # The new profile to make. -from cura.CuraApplication import CuraApplication #To get the current setting version. from cura.ReaderWriters.ProfileReader import ProfileReader import zipfile @@ -68,7 +67,7 @@ class CuraProfileReader(ProfileReader): return [] version = int(parser["general"]["version"]) - if InstanceContainer.Version != version or "metadata" not in parser or "setting_version" not in parser["metadata"] or parser["metadata"]["setting_version"] != str(CuraApplication.SettingVersion): + if InstanceContainer.Version != version: name = parser["general"]["name"] return self._upgradeProfileVersion(serialized, name, version) else: From 1d09cb5b9cf7a76d6b30d8e701dff0f2fffc663f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 24 Jun 2019 13:18:27 +0200 Subject: [PATCH 35/57] Fix typing for optional data argument Co-Authored-By: Jaime van Kessel --- plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py index f1fd6f8b7c..d55fd8ab28 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py @@ -100,7 +100,7 @@ class CloudApiClient: # \param cluster_id: The ID of the cluster. # \param cluster_job_id: The ID of the print job within the cluster. # \param action: The name of the action to execute. - def doPrintJobAction(self, cluster_id: str, cluster_job_id: str, action: str, data: Dict[str, Any] = None) -> None: + def doPrintJobAction(self, cluster_id: str, cluster_job_id: str, action: str, data: Optional[Dict[str, Any]] = None) -> None: body = b"" if data: try: From 6a7da56057471028b9afefb252d563c074ea26ab Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 24 Jun 2019 13:19:24 +0200 Subject: [PATCH 36/57] geeetech_a30.def.json Fix geeetech_a30.def.json --- resources/definitions/Geeetech_A30.def.json | 260 ++++++++++---------- 1 file changed, 130 insertions(+), 130 deletions(-) diff --git a/resources/definitions/Geeetech_A30.def.json b/resources/definitions/Geeetech_A30.def.json index a530b37699..64d519bafc 100644 --- a/resources/definitions/Geeetech_A30.def.json +++ b/resources/definitions/Geeetech_A30.def.json @@ -1,132 +1,132 @@ { "id": "geeetech_a30", - "version": 2, - "name": "Geeetech A30", - "inherits": "fdmprinter", - "metadata": { - "author": "William & Cataldo URSO", - "manufacturer": "Shenzhen Geeetech Technology", - "setting_version": 1, - "file_formats": "text/x-gcode", - "visible": true, - "has_materials": true, - "preferred_quality_type": "draft", - "machine_extruder_trains": { "0": "geeetech_a30_extruder_0" } - - }, - - "overrides": { - "machine_name": { - "default_value": "Geeetech A30" - }, - "machine_start_gcode": { - "default_value": "G28 ;Home\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG1 Z15.0 F6000 ;Move the platform down 15mm\nG92 E0\nG1 F200 E3\nG92 E0" - }, - "machine_end_gcode": { - "default_value": "M104 S0;Cooling the heat end\nM140 S0;Cooling the heat bed\nG92 E1\nG1 E-1 F300\nG28 X0 Y0;Home X axis and Y axis\nM84" - }, - "machine_width": { - "default_value": 320 - }, - "machine_height": { - "default_value": 420 - }, - "machine_depth": { - "default_value": 320 - }, - "machine_heated_bed": { - "default_value": true - }, - "machine_center_is_zero": { - "default_value": false - }, - "material_diameter": { - "default_value": 1.75 - }, - "material_bed_temperature": { - "default_value": 60 - }, - "machine_nozzle_size": { - "default_value": 0.4 - }, - "layer_height": { - "default_value": 0.1 - }, - "layer_height_0": { - "default_value": 0.3 - }, - "retraction_amount": { - "default_value": 2.0 - }, - "retraction_speed": { - "default_value": 25 - }, - "retraction_retract_speed": { - "default_value": 25 - }, - "retraction_prime_speed": { - "default_value": 25 - }, - "adhesion_type": { - "default_value": "skirt" - }, - "machine_head_polygon": { - "default_value": [ - [-75, 35], - [18, 35], - [18, -18], - [-75, -18] - ] - }, - "machine_head_with_fans_polygon": { - "default_value": [ - [-75, 35], - [18, 35], - [18, -18], - [-75, -18] - ] - }, - "gantry_height": { - "default_value": 55 - }, - "machine_max_feedrate_x": { - "default_value": 300 - }, - "machine_max_feedrate_y": { - "default_value": 300 - }, - "machine_max_feedrate_z": { - "default_value": 7 - }, - "machine_max_feedrate_e": { - "default_value": 50 - }, - "machine_max_acceleration_x": { - "default_value": 2000 - }, - "machine_max_acceleration_y": { - "default_value": 2000 - }, - "machine_max_acceleration_z": { - "default_value": 100 - }, - "machine_max_acceleration_e": { - "default_value": 10000 - }, - "machine_acceleration": { - "default_value": 2000 - }, - "machine_max_jerk_xy": { - "default_value": 10 - }, - "machine_max_jerk_z": { - "default_value": 1 - }, - "machine_max_jerk_e": { - "default_value": 5 - }, - "machine_gcode_flavor": { - "default_value": "Repetier" - } - } -} \ No newline at end of file + "version": 2, + "name": "Geeetech A30", + "inherits": "fdmprinter", + "metadata": { + "author": "William & Cataldo URSO", + "manufacturer": "Shenzhen Geeetech Technology", + "setting_version": 1, + "file_formats": "text/x-gcode", + "visible": true, + "has_materials": true, + "preferred_quality_type": "draft", + "machine_extruder_trains": { + "0": "geeetech_a30_extruder_0" + } + }, + "overrides": { + "machine_name": { + "default_value": "Geeetech A30" + }, + "machine_start_gcode": { + "default_value": "G28 ;Home\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG1 Z15.0 F6000 ;Move the platform down 15mm\nG92 E0\nG1 F200 E3\nG92 E0" + }, + "machine_end_gcode": { + "default_value": "M104 S0;Cooling the heat end\nM140 S0;Cooling the heat bed\nG92 E1\nG1 E-1 F300\nG28 X0 Y0;Home X axis and Y axis\nM84" + }, + "machine_width": { + "default_value": 320 + }, + "machine_height": { + "default_value": 420 + }, + "machine_depth": { + "default_value": 320 + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_center_is_zero": { + "default_value": false + }, + "material_diameter": { + "default_value": 1.75 + }, + "material_bed_temperature": { + "default_value": 60 + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "layer_height": { + "default_value": 0.1 + }, + "layer_height_0": { + "default_value": 0.3 + }, + "retraction_amount": { + "default_value": 2 + }, + "retraction_speed": { + "default_value": 25 + }, + "retraction_retract_speed": { + "default_value": 25 + }, + "retraction_prime_speed": { + "default_value": 25 + }, + "adhesion_type": { + "default_value": "skirt" + }, + "machine_head_polygon": { + "default_value": [ + [-75, 35], + [18, 35], + [18, -18], + [-75, -18] + ] + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [-75, 35], + [18, 35], + [18, -18], + [-75, -18] + ] + }, + "gantry_height": { + "default_value": 55 + }, + "machine_max_feedrate_x": { + "default_value": 300 + }, + "machine_max_feedrate_y": { + "default_value": 300 + }, + "machine_max_feedrate_z": { + "default_value": 7 + }, + "machine_max_feedrate_e": { + "default_value": 50 + }, + "machine_max_acceleration_x": { + "default_value": 2000 + }, + "machine_max_acceleration_y": { + "default_value": 2000 + }, + "machine_max_acceleration_z": { + "default_value": 100 + }, + "machine_max_acceleration_e": { + "default_value": 10000 + }, + "machine_acceleration": { + "default_value": 2000 + }, + "machine_max_jerk_xy": { + "default_value": 10 + }, + "machine_max_jerk_z": { + "default_value": 1 + }, + "machine_max_jerk_e": { + "default_value": 5 + }, + "machine_gcode_flavor": { + "default_value": "Repetier" + } + } +} From 544e7a1614e2f874c39290f75502507cab83a91a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 24 Jun 2019 13:20:04 +0200 Subject: [PATCH 37/57] Rename Geeetech_A30.def.json to geeetech_a30.def.json --- .../definitions/{Geeetech_A30.def.json => geeetech_a30.def.json} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename resources/definitions/{Geeetech_A30.def.json => geeetech_a30.def.json} (100%) diff --git a/resources/definitions/Geeetech_A30.def.json b/resources/definitions/geeetech_a30.def.json similarity index 100% rename from resources/definitions/Geeetech_A30.def.json rename to resources/definitions/geeetech_a30.def.json From d9358d56ccf201577f44340acff27514822e070c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Jun 2019 13:20:05 +0200 Subject: [PATCH 38/57] Update issue templates Added a bit more clarification to the issue template. --- .github/ISSUE_TEMPLATE/bug-report.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index f1d700828b..a7371e02a6 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -8,11 +8,11 @@ assignees: '' --- **Additional information** - + From 7bd297bef5eb7153c0ea10ede90efa108a57d703 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 24 Jun 2019 13:21:04 +0200 Subject: [PATCH 39/57] Fix setting_version --- resources/definitions/geeetech_a30.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/geeetech_a30.def.json b/resources/definitions/geeetech_a30.def.json index 64d519bafc..9b9ceb3f40 100644 --- a/resources/definitions/geeetech_a30.def.json +++ b/resources/definitions/geeetech_a30.def.json @@ -6,7 +6,7 @@ "metadata": { "author": "William & Cataldo URSO", "manufacturer": "Shenzhen Geeetech Technology", - "setting_version": 1, + "setting_version": 8, "file_formats": "text/x-gcode", "visible": true, "has_materials": true, From 92d029d18f7c8cc3e3ca216c948050dedbe3149f Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 24 Jun 2019 13:22:18 +0200 Subject: [PATCH 40/57] Update flsun_qq_s.def.json --- resources/definitions/flsun_qq_s.def.json | 87 +++++++++++++++++------ 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/resources/definitions/flsun_qq_s.def.json b/resources/definitions/flsun_qq_s.def.json index 66b6f4c52f..5a739e9ae1 100644 --- a/resources/definitions/flsun_qq_s.def.json +++ b/resources/definitions/flsun_qq_s.def.json @@ -9,27 +9,70 @@ "manufacturer": "FLSUN", "file_formats": "text/x-gcode", "has_materials": true, - "preferred_quality_type": "draft", - "machine_extruder_trains": { "0": "flsun_qq_s_extruder_0" } + "preferred_quality_type": "draft", + "machine_extruder_trains": { + "0": "flsun_qq_s_extruder_0" + } }, - "overrides":{ - "machine_center_is_zero":{ "default_value": true }, - "machine_shape":{ "default_value": "elliptic" }, - "machine_width": { "default_value": 260 }, - "machine_depth": { "default_value": 260 }, - "machine_height": { "default_value": 370 }, - "z_seam_type":{ "default_value": "back" }, - "top_thickness":{ "default_value": 5 }, - "bottom_layers":{ "default_value": 4 }, - "gantry_height": { "default_value": 0 }, - "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 1.75 }, - "machine_start_gcode":{ "default_value":"G21\nG90\nM82\nM107 T0\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG28\nG92 E0\nG0 E3 F200\nG92 E0\n" }, - "machine_end_gcode":{ "default_value":"M107 T0\nM104 S0\nM104 S0 T1\nM140 S0\nG92 E0\nG91\nG1 E-1 F300 \nG1 Z+0.5 E-5 X-20 Y-20 F9000\nG28 X0 Y0\nM84 ;steppers off\nG90 ;absolute positioning\n" }, - "infill_sparse_density": { "default_value": 10 }, - "machine_head_with_fans_polygon": { "default_value": [[ 0, 0 ],[ 0, 0 ],[ 0, 0 ],[ 0, 0 ]] }, - "retraction_enable": { "default_value": true }, - "machine_heated_bed": { "default_value": true }, - "machine_gcode_flavor": { "default_value": "Repetier" } + "overrides": { + "machine_center_is_zero": { + "default_value": true + }, + "machine_shape": { + "default_value": "elliptic" + }, + "machine_width": { + "default_value": 260 + }, + "machine_depth": { + "default_value": 260 + }, + "machine_height": { + "default_value": 370 + }, + "z_seam_type": { + "default_value": "back" + }, + "top_thickness": { + "default_value": 5 + }, + "bottom_layers": { + "default_value": 4 + }, + "gantry_height": { + "default_value": 0 + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_start_gcode": { + "default_value": "G21\nG90\nM82\nM107 T0\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG28\nG92 E0\nG0 E3 F200\nG92 E0\n" + }, + "machine_end_gcode": { + "default_value": "M107 T0\nM104 S0\nM104 S0 T1\nM140 S0\nG92 E0\nG91\nG1 E-1 F300 \nG1 Z+0.5 E-5 X-20 Y-20 F9000\nG28 X0 Y0\nM84 ;steppers off\nG90 ;absolute positioning\n" + }, + "infill_sparse_density": { + "default_value": 10 + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ] + }, + "retraction_enable": { + "default_value": true + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_gcode_flavor": { + "default_value": "Repetier" + } } -} +} From faf256b2f0326bd04933352becff9109faf82a11 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 26 Jun 2019 16:41:51 +0200 Subject: [PATCH 41/57] Rename deprime settings with the new name These have been renamed for greater clarity. We also have to rename them on this side now. Contributes to issue CURA-6329. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 6 +++--- resources/definitions/fdmprinter.def.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 27201b8eed..241d1a954f 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -1196,11 +1196,11 @@ class XmlMaterialProfile(InstanceContainer): "surface energy": "material_surface_energy", "shrinkage percentage": "material_shrinkage_percentage", "build volume temperature": "build_volume_temperature", - "anti ooze retract position": "material_anti_ooze_retraction_distance", + "anti ooze retracted position": "material_anti_ooze_retracted_position", "anti ooze retract speed": "material_anti_ooze_retraction_speed", - "break preparation position": "material_break_preparation_distance", + "break preparation retracted position": "material_break_preparation_retracted_position", "break preparation speed": "material_break_preparation_speed", - "break position": "material_break_distance", + "break retracted position": "material_break_retracted_position", "break speed": "material_break_speed", "break temperature": "material_break_temperature" } diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0621c6e2d0..b013851cef 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2244,7 +2244,7 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "material_anti_ooze_retraction_distance": + "material_anti_ooze_retracted_position": { "label": "Anti-ooze Retraction Distance", "description": "How far the material needs to be retracted before it stops oozing.", @@ -2270,7 +2270,7 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "material_break_preparation_distance": + "material_break_preparation_retracted_position": { "label": "Break Preparation Retraction Distance", "description": "How far the filament can be stretched before it breaks, while heated.", @@ -2296,7 +2296,7 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "material_break_distance": + "material_break_retracted_position": { "label": "Break Retraction Distance", "description": "How far to retract the filament in order to break it cleanly.", From fe0fcc6eec6d5718b9479d0346673d9898874a70 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 26 Jun 2019 16:43:11 +0200 Subject: [PATCH 42/57] Change human-readable names of renamed settings too Forgot about those. Contributes to issue CURA-6329. --- resources/definitions/fdmprinter.def.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b013851cef..dbdc9cc798 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2246,7 +2246,7 @@ }, "material_anti_ooze_retracted_position": { - "label": "Anti-ooze Retraction Distance", + "label": "Anti-ooze Retracted Position", "description": "How far the material needs to be retracted before it stops oozing.", "type": "float", "unit": "mm", @@ -2272,7 +2272,7 @@ }, "material_break_preparation_retracted_position": { - "label": "Break Preparation Retraction Distance", + "label": "Break Preparation Retracted Position", "description": "How far the filament can be stretched before it breaks, while heated.", "type": "float", "unit": "mm", @@ -2298,7 +2298,7 @@ }, "material_break_retracted_position": { - "label": "Break Retraction Distance", + "label": "Break Retracted Position", "description": "How far to retract the filament in order to break it cleanly.", "type": "float", "unit": "mm", From efc6ef2905aa97c65590c8f64a9a30faf12d7e13 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 28 Jun 2019 13:44:47 +0200 Subject: [PATCH 43/57] Add missing typing --- cura/BuildVolume.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index b21efc93f3..e8b077eae6 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -908,9 +908,12 @@ class BuildVolume(SceneNode): # for. # \return A dictionary with for each used extruder ID the disallowed areas # where that extruder may not print. - def _computeDisallowedAreasStatic(self, border_size, used_extruders): - #Convert disallowed areas to polygons and dilate them. + def _computeDisallowedAreasStatic(self, border_size:float, used_extruders: List["ExtruderStack"]) -> Dict[str, List[Polygon]]: + # Convert disallowed areas to polygons and dilate them. machine_disallowed_polygons = [] + if self._global_container_stack is None: + return {} + for area in self._global_container_stack.getProperty("machine_disallowed_areas", "value"): polygon = Polygon(numpy.array(area, numpy.float32)) polygon = polygon.getMinkowskiHull(Polygon.approximatedCircle(border_size)) @@ -921,7 +924,7 @@ class BuildVolume(SceneNode): nozzle_offsetting_for_disallowed_areas = self._global_container_stack.getMetaDataEntry( "nozzle_offsetting_for_disallowed_areas", True) - result = {} + result = {} # type: Dict[str, List[Polygon]] for extruder in used_extruders: extruder_id = extruder.getId() offset_x = extruder.getProperty("machine_nozzle_offset_x", "value") @@ -930,13 +933,13 @@ class BuildVolume(SceneNode): offset_y = extruder.getProperty("machine_nozzle_offset_y", "value") if offset_y is None: offset_y = 0 - offset_y = -offset_y #Y direction of g-code is the inverse of Y direction of Cura's scene space. + offset_y = -offset_y # Y direction of g-code is the inverse of Y direction of Cura's scene space. result[extruder_id] = [] for polygon in machine_disallowed_polygons: - result[extruder_id].append(polygon.translate(offset_x, offset_y)) #Compensate for the nozzle offset of this extruder. + result[extruder_id].append(polygon.translate(offset_x, offset_y)) # Compensate for the nozzle offset of this extruder. - #Add the border around the edge of the build volume. + # Add the border around the edge of the build volume. left_unreachable_border = 0 right_unreachable_border = 0 top_unreachable_border = 0 @@ -944,7 +947,8 @@ class BuildVolume(SceneNode): # Only do nozzle offsetting if needed if nozzle_offsetting_for_disallowed_areas: - #The build volume is defined as the union of the area that all extruders can reach, so we need to know the relative offset to all extruders. + # The build volume is defined as the union of the area that all extruders can reach, so we need to know + # the relative offset to all extruders. for other_extruder in ExtruderManager.getInstance().getActiveExtruderStacks(): other_offset_x = other_extruder.getProperty("machine_nozzle_offset_x", "value") if other_offset_x is None: @@ -1028,8 +1032,8 @@ class BuildVolume(SceneNode): [ half_machine_width - border_size, 0] ], numpy.float32))) result[extruder_id].append(Polygon(numpy.array([ - [ half_machine_width,-half_machine_depth], - [-half_machine_width,-half_machine_depth], + [ half_machine_width, -half_machine_depth], + [-half_machine_width, -half_machine_depth], [ 0, -half_machine_depth + border_size] ], numpy.float32))) From b240ede21c28c9bbd1090e69c9b4ed6fb6981c6f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 28 Jun 2019 13:45:05 +0200 Subject: [PATCH 44/57] Add test for computing the static disallowed areas --- tests/TestBuildVolume.py | 44 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tests/TestBuildVolume.py b/tests/TestBuildVolume.py index 51a5f7e9e2..7095179a95 100644 --- a/tests/TestBuildVolume.py +++ b/tests/TestBuildVolume.py @@ -43,6 +43,50 @@ def test_buildGridMesh(build_volume): assert numpy.array_equal(result_vertices, mesh.getVertices()) +class TestComputeDisallowedAreasStatic: + setting_property_dict = {"machine_disallowed_areas": {"value": [[[-200, 112.5], [ -82, 112.5], [ -84, 102.5], [-115, 102.5]]]}, + "machine_width": {"value": 200}, + "machine_depth": {"value": 200}, + } + + def getPropertySideEffect(*args, **kwargs): + properties = TestComputeDisallowedAreasStatic.setting_property_dict.get(args[1]) + if properties: + return properties.get(args[2]) + + def test_computeDisallowedAreasStaticNoExtruder(self, build_volume: BuildVolume): + mocked_stack = MagicMock() + mocked_stack.getProperty = MagicMock(side_effect=self.getPropertySideEffect) + + build_volume._global_container_stack = mocked_stack + assert build_volume._computeDisallowedAreasStatic(0, []) == {} + + def test_computeDisalowedAreasStaticSingleExtruder(self, build_volume: BuildVolume): + mocked_stack = MagicMock() + mocked_stack.getProperty = MagicMock(side_effect=self.getPropertySideEffect) + + mocked_extruder = MagicMock() + mocked_extruder.getProperty = MagicMock(side_effect=self.getPropertySideEffect) + mocked_extruder.getId = MagicMock(return_value = "zomg") + + build_volume._global_container_stack = mocked_stack + with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance"): + result = build_volume._computeDisallowedAreasStatic(0, [mocked_extruder]) + assert result == {"zomg": [Polygon([[-84.0, 102.5], [-115.0, 102.5], [-200.0, 112.5], [-82.0, 112.5]])]} + + def test_computeDisalowedAreasMutliExtruder(self, build_volume): + mocked_stack = MagicMock() + mocked_stack.getProperty = MagicMock(side_effect=self.getPropertySideEffect) + + mocked_extruder = MagicMock() + mocked_extruder.getProperty = MagicMock(side_effect=self.getPropertySideEffect) + mocked_extruder.getId = MagicMock(return_value="zomg") + extruder_manager = MagicMock() + extruder_manager.getActiveExtruderStacks = MagicMock(return_value = [mocked_stack]) + build_volume._global_container_stack = mocked_stack + with patch("cura.Settings.ExtruderManager.ExtruderManager.getInstance", MagicMock(return_value = extruder_manager)): + result = build_volume._computeDisallowedAreasStatic(0, [mocked_extruder]) + assert result == {"zomg": [Polygon([[-84.0, 102.5], [-115.0, 102.5], [-200.0, 112.5], [-82.0, 112.5]])]} class TestUpdateRaftThickness: setting_property_dict = {"raft_base_thickness": {"value": 1}, From 47cc87ec471c607210d455e813e754b8f90ecac8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 28 Jun 2019 14:17:18 +0200 Subject: [PATCH 45/57] Add tests for calculating the bed adhesion size --- tests/TestBuildVolume.py | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/tests/TestBuildVolume.py b/tests/TestBuildVolume.py index 7095179a95..902d8a839c 100644 --- a/tests/TestBuildVolume.py +++ b/tests/TestBuildVolume.py @@ -43,6 +43,65 @@ def test_buildGridMesh(build_volume): assert numpy.array_equal(result_vertices, mesh.getVertices()) +def test_clamp(build_volume): + assert build_volume._clamp(0, 0, 200) == 0 + assert build_volume._clamp(0, -200, 200) == 0 + assert build_volume._clamp(300, -200, 200) == 200 + + +class TestCalculateBedAdhesionSize: + setting_property_dict = {"adhesion_type": {"value": "brim"}, + "skirt_brim_line_width": {"value": 0}, + "initial_layer_line_width_factor": {"value": 0}, + "brim_line_count": {"value": 0}, + "machine_width": {"value": 200}, + "machine_depth": {"value": 200}, + "skirt_line_count": {"value": 0}, + "skirt_gap": {"value": 0}, + "raft_margin": {"value": 0} + } + + def getPropertySideEffect(*args, **kwargs): + properties = TestCalculateBedAdhesionSize.setting_property_dict.get(args[1]) + if properties: + return properties.get(args[2]) + + def createAndSetGlobalStack(self, build_volume): + mocked_stack = MagicMock() + mocked_stack.getProperty = MagicMock(side_effect=self.getPropertySideEffect) + + build_volume._global_container_stack = mocked_stack + + def test_noGlobalStack(self, build_volume: BuildVolume): + assert build_volume._calculateBedAdhesionSize([]) is None + + @pytest.mark.parametrize("setting_dict, result", [ + ({}, 0), + ({"adhesion_type": {"value": "skirt"}}, 0), + ({"adhesion_type": {"value": "raft"}}, 0), + ({"adhesion_type": {"value": "none"}}, 0), + ({"adhesion_type": {"value": "skirt"}, "skirt_line_count": {"value": 2}, "initial_layer_line_width_factor": {"value": 1}, "skirt_brim_line_width": {"value": 2}}, 0.02), + # Even though it's marked as skirt, it should behave as a brim as the prime tower has a brim (skirt line count is still at 0!) + ({"adhesion_type": {"value": "skirt"}, "prime_tower_brim_enable": {"value": True}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, -0.06), + ({"brim_line_count": {"value": 1}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, 0), + ({"brim_line_count": {"value": 2}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, 0.06), + ({"brim_line_count": {"value": 9000000}, "skirt_brim_line_width": {"value": 90000}, "initial_layer_line_width_factor": {"value": 9000}}, 100), # Clamped at half the max size of buildplate + ]) + def test_singleExtruder(self, build_volume: BuildVolume, setting_dict, result): + self.createAndSetGlobalStack(build_volume) + patched_dictionary = self.setting_property_dict.copy() + patched_dictionary.update(setting_dict) + with patch.dict(self.setting_property_dict, patched_dictionary): + assert build_volume._calculateBedAdhesionSize([]) == result + + def test_unknownBedAdhesion(self, build_volume: BuildVolume): + self.createAndSetGlobalStack(build_volume) + patched_dictionary = self.setting_property_dict.copy() + patched_dictionary.update({"adhesion_type": {"value": "OMGZOMGBBQ"}}) + with patch.dict(self.setting_property_dict, patched_dictionary): + with pytest.raises(Exception): + build_volume._calculateBedAdhesionSize([]) + class TestComputeDisallowedAreasStatic: setting_property_dict = {"machine_disallowed_areas": {"value": [[[-200, 112.5], [ -82, 112.5], [ -84, 102.5], [-115, 102.5]]]}, "machine_width": {"value": 200}, From 2133fc78e041bf6080824609ccd664d2f398fa79 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 28 Jun 2019 15:01:09 +0200 Subject: [PATCH 46/57] Remove unused code --- cura/BuildVolume.py | 42 +++++++++--------------------------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index e8b077eae6..c89768b122 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -738,37 +738,14 @@ class BuildVolume(SceneNode): else: used_extruders = [self._global_container_stack] - result_areas = self._computeDisallowedAreasStatic(disallowed_border_size, used_extruders) #Normal machine disallowed areas can always be added. + result_areas = self._computeDisallowedAreasStatic(disallowed_border_size, used_extruders) # Normal machine disallowed areas can always be added. prime_areas = self._computeDisallowedAreasPrimeBlob(disallowed_border_size, used_extruders) - result_areas_no_brim = self._computeDisallowedAreasStatic(0, used_extruders) #Where the priming is not allowed to happen. This is not added to the result, just for collision checking. - prime_disallowed_areas = copy.deepcopy(result_areas_no_brim) + result_areas_no_brim = self._computeDisallowedAreasStatic(0, used_extruders) # Where the priming is not allowed to happen. This is not added to the result, just for collision checking. - #Check if prime positions intersect with disallowed areas. + # Check if prime positions intersect with disallowed areas. for extruder in used_extruders: extruder_id = extruder.getId() - collision = False - for prime_polygon in prime_areas[extruder_id]: - for disallowed_polygon in prime_disallowed_areas[extruder_id]: - if prime_polygon.intersectsPolygon(disallowed_polygon) is not None: - collision = True - break - if collision: - break - - #Also check other prime positions (without additional offset). - for other_extruder_id in prime_areas: - if extruder_id == other_extruder_id: #It is allowed to collide with itself. - continue - for other_prime_polygon in prime_areas[other_extruder_id]: - if prime_polygon.intersectsPolygon(other_prime_polygon): - collision = True - break - if collision: - break - if collision: - break - result_areas[extruder_id].extend(prime_areas[extruder_id]) result_areas_no_brim[extruder_id].extend(prime_areas[extruder_id]) @@ -776,14 +753,13 @@ class BuildVolume(SceneNode): for area in nozzle_disallowed_areas: polygon = Polygon(numpy.array(area, numpy.float32)) polygon_disallowed_border = polygon.getMinkowskiHull(Polygon.approximatedCircle(disallowed_border_size)) - result_areas[extruder_id].append(polygon_disallowed_border) #Don't perform the offset on these. - #polygon_minimal_border = polygon.getMinkowskiHull(5) - result_areas_no_brim[extruder_id].append(polygon) # no brim + result_areas[extruder_id].append(polygon_disallowed_border) # Don't perform the offset on these. + result_areas_no_brim[extruder_id].append(polygon) # No brim # Add prime tower location as disallowed area. - if len(used_extruders) > 1: #No prime tower in single-extrusion. + if len(used_extruders) > 1: # No prime tower in single-extrusion. - if len([x for x in used_extruders if x.isEnabled]) > 1: #No prime tower if only one extruder is enabled + if len([x for x in used_extruders if x.isEnabled]) > 1: # No prime tower if only one extruder is enabled prime_tower_collision = False prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders) for extruder_id in prime_tower_areas: @@ -792,7 +768,7 @@ class BuildVolume(SceneNode): if prime_tower_area.intersectsPolygon(area) is not None: prime_tower_collision = True break - if prime_tower_collision: #Already found a collision. + if prime_tower_collision: # Already found a collision. break if (ExtruderManager.getInstance().getResolveOrValue("prime_tower_brim_enable") and ExtruderManager.getInstance().getResolveOrValue("adhesion_type") != "raft"): @@ -806,7 +782,7 @@ class BuildVolume(SceneNode): self._has_errors = len(self._error_areas) > 0 - self._disallowed_areas = [] + self._disallowed_areas = [] # type: List[Polygon] for extruder_id in result_areas: self._disallowed_areas.extend(result_areas[extruder_id]) self._disallowed_areas_no_brim = [] From f329d7aed90d86e663dc3cce69d029b4f8e105de Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 28 Jun 2019 15:08:46 +0200 Subject: [PATCH 47/57] Made typing hint a bit more specific --- 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 53c0a54f85..7674aa05b9 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -205,7 +205,7 @@ class ExtruderManager(QObject): # list. # # \return A list of extruder stacks. - def getUsedExtruderStacks(self) -> List["ContainerStack"]: + def getUsedExtruderStacks(self) -> List["ExtruderStack"]: global_stack = self._application.getGlobalContainerStack() container_registry = ContainerRegistry.getInstance() From 691d10671917e39314ff0ec061c4febabc74c434 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 28 Jun 2019 15:09:08 +0200 Subject: [PATCH 48/57] Remove old unused code --- cura/BuildVolume.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index c89768b122..ce7a5461bc 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -727,17 +727,9 @@ class BuildVolume(SceneNode): self._error_areas = [] - extruder_manager = ExtruderManager.getInstance() - used_extruders = extruder_manager.getUsedExtruderStacks() + used_extruders = ExtruderManager.getInstance().getUsedExtruderStacks() disallowed_border_size = self.getEdgeDisallowedSize() - if not used_extruders: - # If no extruder is used, assume that the active extruder is used (else nothing is drawn) - if extruder_manager.getActiveExtruderStack(): - used_extruders = [extruder_manager.getActiveExtruderStack()] - else: - used_extruders = [self._global_container_stack] - result_areas = self._computeDisallowedAreasStatic(disallowed_border_size, used_extruders) # Normal machine disallowed areas can always be added. prime_areas = self._computeDisallowedAreasPrimeBlob(disallowed_border_size, used_extruders) result_areas_no_brim = self._computeDisallowedAreasStatic(0, used_extruders) # Where the priming is not allowed to happen. This is not added to the result, just for collision checking. From 6136f5a2f2586da4b5d232b125032219471af42a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 28 Jun 2019 15:22:58 +0200 Subject: [PATCH 49/57] Further simplify the build volume code --- cura/BuildVolume.py | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index ce7a5461bc..3358fe8b85 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -749,28 +749,24 @@ class BuildVolume(SceneNode): result_areas_no_brim[extruder_id].append(polygon) # No brim # Add prime tower location as disallowed area. - if len(used_extruders) > 1: # No prime tower in single-extrusion. - - if len([x for x in used_extruders if x.isEnabled]) > 1: # No prime tower if only one extruder is enabled - prime_tower_collision = False - prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders) - for extruder_id in prime_tower_areas: - for i_area, prime_tower_area in enumerate(prime_tower_areas[extruder_id]): - for area in result_areas[extruder_id]: - if prime_tower_area.intersectsPolygon(area) is not None: - prime_tower_collision = True - break - if prime_tower_collision: # Already found a collision. + if len([x for x in used_extruders if x.isEnabled]) > 1: # No prime tower if only one extruder is enabled + prime_tower_collision = False + prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders) + for extruder_id in prime_tower_areas: + for area_index, prime_tower_area in enumerate(prime_tower_areas[extruder_id]): + for area in result_areas[extruder_id]: + if prime_tower_area.intersectsPolygon(area) is not None: + prime_tower_collision = True break - if (ExtruderManager.getInstance().getResolveOrValue("prime_tower_brim_enable") and - ExtruderManager.getInstance().getResolveOrValue("adhesion_type") != "raft"): - prime_tower_areas[extruder_id][i_area] = prime_tower_area.getMinkowskiHull( - Polygon.approximatedCircle(disallowed_border_size)) - if not prime_tower_collision: - result_areas[extruder_id].extend(prime_tower_areas[extruder_id]) - result_areas_no_brim[extruder_id].extend(prime_tower_areas[extruder_id]) - else: - self._error_areas.extend(prime_tower_areas[extruder_id]) + if prime_tower_collision: # Already found a collision. + break + if self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft": + prime_tower_areas[extruder_id][area_index] = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(disallowed_border_size)) + if not prime_tower_collision: + result_areas[extruder_id].extend(prime_tower_areas[extruder_id]) + result_areas_no_brim[extruder_id].extend(prime_tower_areas[extruder_id]) + else: + self._error_areas.extend(prime_tower_areas[extruder_id]) self._has_errors = len(self._error_areas) > 0 @@ -794,8 +790,8 @@ class BuildVolume(SceneNode): for extruder in used_extruders: result[extruder.getId()] = [] - #Currently, the only normally printed object is the prime tower. - if ExtruderManager.getInstance().getResolveOrValue("prime_tower_enable"): + # Currently, the only normally printed object is the prime tower. + if self._global_container_stack.getProperty("prime_tower_enable"): prime_tower_size = self._global_container_stack.getProperty("prime_tower_size", "value") machine_width = self._global_container_stack.getProperty("machine_width", "value") machine_depth = self._global_container_stack.getProperty("machine_depth", "value") @@ -805,8 +801,7 @@ class BuildVolume(SceneNode): prime_tower_x = prime_tower_x - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left. prime_tower_y = prime_tower_y + machine_depth / 2 - if (ExtruderManager.getInstance().getResolveOrValue("prime_tower_brim_enable") and - ExtruderManager.getInstance().getResolveOrValue("adhesion_type") != "raft"): + if self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft": brim_size = ( extruder.getProperty("brim_line_count", "value") * extruder.getProperty("skirt_brim_line_width", "value") / 100.0 * From db3d6aae83b2a6123d59de1e0a25210a948b3432 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 1 Jul 2019 09:55:04 +0200 Subject: [PATCH 50/57] Add boundingbox test for buildvolume --- tests/TestBuildVolume.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/tests/TestBuildVolume.py b/tests/TestBuildVolume.py index 902d8a839c..6ccb3d0fb7 100644 --- a/tests/TestBuildVolume.py +++ b/tests/TestBuildVolume.py @@ -1,9 +1,9 @@ from unittest.mock import MagicMock, patch - +from UM.Math.AxisAlignedBox import AxisAlignedBox import pytest from UM.Math.Polygon import Polygon -from UM.Settings.SettingInstance import InstanceState +from UM.Math.Vector import Vector from cura.BuildVolume import BuildVolume, PRIME_CLEARANCE import numpy @@ -304,6 +304,25 @@ class TestRebuild: build_volume.rebuild() assert build_volume.getMeshData() is None + def test_updateBoundingBox(self, build_volume: BuildVolume): + build_volume.setWidth(10) + build_volume.setHeight(10) + build_volume.setDepth(10) + + mocked_global_stack = MagicMock() + build_volume._global_container_stack = mocked_global_stack + build_volume.getEdgeDisallowedSize = MagicMock(return_value = 0) + build_volume.updateNodeBoundaryCheck = MagicMock() + + # Fake the the "engine is created callback" + build_volume._onEngineCreated() + build_volume.rebuild() + + bounding_box = build_volume.getBoundingBox() + assert bounding_box.minimum == Vector(-5.0, -1.0, -5.0) + assert bounding_box.maximum == Vector(5.0, 10.0, 5.0) + + class TestUpdateMachineSizeProperties: setting_property_dict = {"machine_width": {"value": 50}, "machine_depth": {"value": 100}, From f86cf06b8845c74922592adc9149948f74624954 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 1 Jul 2019 10:56:50 +0200 Subject: [PATCH 51/57] Add typing --- cura/Arranging/ShapeArray.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/cura/Arranging/ShapeArray.py b/cura/Arranging/ShapeArray.py index 64b78d6f17..8a8cc7ad18 100644 --- a/cura/Arranging/ShapeArray.py +++ b/cura/Arranging/ShapeArray.py @@ -1,12 +1,18 @@ +#Copyright (c) 2019 Ultimaker B.V. +#Cura is released under the terms of the LGPLv3 or higher. + import numpy import copy +from typing import Optional, Tuple, TYPE_CHECKING from UM.Math.Polygon import Polygon +if TYPE_CHECKING: + from UM.Scene.SceneNode import SceneNode ## Polygon representation as an array for use with Arrange class ShapeArray: - def __init__(self, arr, offset_x, offset_y, scale = 1): + def __init__(self, arr: numpy.array, offset_x: float, offset_y: float, scale: float = 1) -> None: self.arr = arr self.offset_x = offset_x self.offset_y = offset_y @@ -16,7 +22,7 @@ class ShapeArray: # \param vertices # \param scale scale the coordinates @classmethod - def fromPolygon(cls, vertices, scale = 1): + def fromPolygon(cls, vertices: numpy.array, scale: float = 1) -> "ShapeArray": # scale vertices = vertices * scale # flip y, x -> x, y @@ -42,7 +48,7 @@ class ShapeArray: # \param min_offset offset for the offset ShapeArray # \param scale scale the coordinates @classmethod - def fromNode(cls, node, min_offset, scale = 0.5, include_children = False): + def fromNode(cls, node: SceneNode, min_offset: float, scale: float = 0.5, include_children: bool = False) -> Tuple[Optional["ShapeArray"], Optional["ShapeArray"]]: transform = node._transformation transform_x = transform._data[0][3] transform_y = transform._data[2][3] @@ -88,7 +94,7 @@ class ShapeArray: # \param shape numpy format shape, [x-size, y-size] # \param vertices @classmethod - def arrayFromPolygon(cls, shape, vertices): + def arrayFromPolygon(cls, shape: Tuple[int, int], vertices: numpy.array) -> numpy.array: base_array = numpy.zeros(shape, dtype = numpy.int32) # Initialize your array of zeros fill = numpy.ones(base_array.shape) * True # Initialize boolean array defining shape fill @@ -111,9 +117,9 @@ class ShapeArray: # \param p2 2-tuple with x, y for point 2 # \param base_array boolean array to project the line on @classmethod - def _check(cls, p1, p2, base_array): + def _check(cls, p1: numpy.array, p2: numpy.array, base_array: numpy.array) -> bool: if p1[0] == p2[0] and p1[1] == p2[1]: - return + return False idxs = numpy.indices(base_array.shape) # Create 3D array of indices p1 = p1.astype(float) @@ -131,5 +137,4 @@ class ShapeArray: max_col_idx = (idxs[0] - p1[0]) / (p2[0] - p1[0]) * (p2[1] - p1[1]) + p1[1] sign = numpy.sign(p2[0] - p1[0]) - return idxs[1] * sign <= max_col_idx * sign - + return idxs[1] * sign <= max_col_idx * sign \ No newline at end of file From 17e86a28b77e1031199c25002b32a6458b319d49 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 1 Jul 2019 10:58:08 +0200 Subject: [PATCH 52/57] Guard against broken import --- cura/Arranging/ShapeArray.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Arranging/ShapeArray.py b/cura/Arranging/ShapeArray.py index 8a8cc7ad18..9227e446fb 100644 --- a/cura/Arranging/ShapeArray.py +++ b/cura/Arranging/ShapeArray.py @@ -48,7 +48,7 @@ class ShapeArray: # \param min_offset offset for the offset ShapeArray # \param scale scale the coordinates @classmethod - def fromNode(cls, node: SceneNode, min_offset: float, scale: float = 0.5, include_children: bool = False) -> Tuple[Optional["ShapeArray"], Optional["ShapeArray"]]: + def fromNode(cls, node: "SceneNode", min_offset: float, scale: float = 0.5, include_children: bool = False) -> Tuple[Optional["ShapeArray"], Optional["ShapeArray"]]: transform = node._transformation transform_x = transform._data[0][3] transform_y = transform._data[2][3] From 6544c123a480ac851e50fc10a7155d346a698c0f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 1 Jul 2019 11:15:26 +0200 Subject: [PATCH 53/57] Add camera view selector to the view application menu --- resources/qml/Menus/ViewMenu.qml | 45 ++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index 59e6dd24d0..4e5545223f 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -24,6 +24,51 @@ Menu MenuItem { action: Cura.Actions.viewRightSideCamera; } } + Menu + { + id: cameraViewMenu + property string cameraMode: UM.Preferences.getValue("general/camera_perspective_mode") + Connections + { + target: UM.Preferences + onPreferenceChanged: + { + if (preference !== "general/camera_perspective_mode") + { + return + } + cameraViewMenu.cameraMode = UM.Preferences.getValue("general/camera_perspective_mode") + } + } + + title: catalog.i18nc("@action:inmenu menubar:view","Camera view") + MenuItem + { + text: catalog.i18nc("@action:inmenu menubar:view", "Perspective") + checkable: true + checked: cameraViewMenu.cameraMode == "perspective" + onTriggered: + { + UM.Preferences.setValue("general/camera_perspective_mode", "perspective") + checked = cameraViewMenu.cameraMode == "perspective" + } + exclusiveGroup: group + } + MenuItem + { + text: catalog.i18nc("@action:inmenu menubar:view", "Orthographic") + checkable: true + checked: cameraViewMenu.cameraMode == "orthogonal" + onTriggered: + { + UM.Preferences.setValue("general/camera_perspective_mode", "orthogonal") + checked = cameraViewMenu.cameraMode == "orthogonal" + } + exclusiveGroup: group + } + ExclusiveGroup { id: group } + } + MenuSeparator { visible: UM.Preferences.getValue("cura/use_multi_build_plate") From a7d419f497203757c7eee7e4f5f7e6dfe5c4f1af Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 1 Jul 2019 11:18:54 +0200 Subject: [PATCH 54/57] Fix deprecation decorator breaking the getExtruder function --- cura/Settings/MachineManager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 3366d67d25..764ad8ed43 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -986,8 +986,9 @@ class MachineManager(QObject): self._application.globalContainerStackChanged.emit() self.forceUpdateAllSettings() + # Note that this function is deprecated, but the decorators for this don't play well together! + # @deprecated("use Cura.MachineManager.activeMachine.extruders instead", "4.2") @pyqtSlot(int, result = QObject) - @deprecated("use Cura.MachineManager.activeMachine.extruders instead", "4.2") def getExtruder(self, position: int) -> Optional[ExtruderStack]: if self._global_container_stack: return self._global_container_stack.extruders.get(str(position)) From ea93490c45249c8c29f3f0916326e4e8b35f5ae2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 1 Jul 2019 14:55:46 +0200 Subject: [PATCH 55/57] Fix crash when loading multi-extrusion print Because getProperty needs a property to get. --- cura/BuildVolume.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 3358fe8b85..559cb72e3d 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -791,7 +791,7 @@ class BuildVolume(SceneNode): result[extruder.getId()] = [] # Currently, the only normally printed object is the prime tower. - if self._global_container_stack.getProperty("prime_tower_enable"): + if self._global_container_stack.getProperty("prime_tower_enable", "value"): prime_tower_size = self._global_container_stack.getProperty("prime_tower_size", "value") machine_width = self._global_container_stack.getProperty("machine_width", "value") machine_depth = self._global_container_stack.getProperty("machine_depth", "value") From f5b0cae55451df8415599225456acd5604dfa072 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 2 Jul 2019 07:46:21 +0200 Subject: [PATCH 56/57] Prime-brim calculation needs adhesion extruder, not just any. --- cura/BuildVolume.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 3358fe8b85..bf38e6e562 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -787,11 +787,14 @@ class BuildVolume(SceneNode): # where that extruder may not print. def _computeDisallowedAreasPrinted(self, used_extruders): result = {} + adhesion_extruder = None #type: ExtruderStack for extruder in used_extruders: + if int(extruder.getProperty("extruder_nr", "value")) == int(self._global_container_stack.getProperty("adhesion_extruder_nr", "value")): + adhesion_extruder = extruder result[extruder.getId()] = [] # Currently, the only normally printed object is the prime tower. - if self._global_container_stack.getProperty("prime_tower_enable"): + if self._global_container_stack.getProperty("prime_tower_enable", "value"): prime_tower_size = self._global_container_stack.getProperty("prime_tower_size", "value") machine_width = self._global_container_stack.getProperty("machine_width", "value") machine_depth = self._global_container_stack.getProperty("machine_depth", "value") @@ -801,11 +804,11 @@ class BuildVolume(SceneNode): prime_tower_x = prime_tower_x - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left. prime_tower_y = prime_tower_y + machine_depth / 2 - if self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft": + if adhesion_extruder is not None and self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft": brim_size = ( - extruder.getProperty("brim_line_count", "value") * - extruder.getProperty("skirt_brim_line_width", "value") / 100.0 * - extruder.getProperty("initial_layer_line_width_factor", "value") + adhesion_extruder.getProperty("brim_line_count", "value") * + adhesion_extruder.getProperty("skirt_brim_line_width", "value") / 100.0 * + adhesion_extruder.getProperty("initial_layer_line_width_factor", "value") ) prime_tower_x -= brim_size prime_tower_y += brim_size From 43baca1545af9d1f242438378bec1f5c44df0207 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 2 Jul 2019 13:33:15 +0200 Subject: [PATCH 57/57] Hardcode Cura SDK version with each release --- CMakeLists.txt | 1 - cura/ApplicationMetadata.py | 8 +------- cura/CuraVersion.py.in | 4 +++- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ba427a745d..4406fd4856 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,6 @@ set(CURA_APP_NAME "cura" CACHE STRING "Short name of Cura, used for configuratio set(CURA_APP_DISPLAY_NAME "Ultimaker Cura" CACHE STRING "Display name of Cura") set(CURA_VERSION "master" CACHE STRING "Version name of Cura") set(CURA_BUILDTYPE "" CACHE STRING "Build type of Cura, eg. 'PPA'") -set(CURA_SDK_VERSION "" CACHE STRING "SDK version of Cura") set(CURA_CLOUD_API_ROOT "" CACHE STRING "Alternative Cura cloud API root") set(CURA_CLOUD_API_VERSION "" CACHE STRING "Alternative Cura cloud API version") diff --git a/cura/ApplicationMetadata.py b/cura/ApplicationMetadata.py index 06fdd7a3f0..aea68c0af5 100644 --- a/cura/ApplicationMetadata.py +++ b/cura/ApplicationMetadata.py @@ -9,7 +9,6 @@ DEFAULT_CURA_DISPLAY_NAME = "Ultimaker Cura" DEFAULT_CURA_VERSION = "master" DEFAULT_CURA_BUILD_TYPE = "" DEFAULT_CURA_DEBUG_MODE = False -DEFAULT_CURA_SDK_VERSION = "6.1.0" try: from cura.CuraVersion import CuraAppName # type: ignore @@ -42,9 +41,4 @@ try: except ImportError: CuraDebugMode = DEFAULT_CURA_DEBUG_MODE -try: - from cura.CuraVersion import CuraSDKVersion # type: ignore - if CuraSDKVersion == "": - CuraSDKVersion = DEFAULT_CURA_SDK_VERSION -except ImportError: - CuraSDKVersion = DEFAULT_CURA_SDK_VERSION +from cura.CuraVersion import CuraSDKVersion # type: ignore diff --git a/cura/CuraVersion.py.in b/cura/CuraVersion.py.in index 1a500df248..abbc3a0a0d 100644 --- a/cura/CuraVersion.py.in +++ b/cura/CuraVersion.py.in @@ -6,7 +6,9 @@ CuraAppDisplayName = "@CURA_APP_DISPLAY_NAME@" CuraVersion = "@CURA_VERSION@" CuraBuildType = "@CURA_BUILDTYPE@" CuraDebugMode = True if "@_cura_debugmode@" == "ON" else False -CuraSDKVersion = "@CURA_SDK_VERSION@" + +CuraSDKVersion = "6.1.0" + CuraCloudAPIRoot = "@CURA_CLOUD_API_ROOT@" CuraCloudAPIVersion = "@CURA_CLOUD_API_VERSION@" CuraCloudAccountAPIRoot = "@CURA_CLOUD_ACCOUNT_API_ROOT@"