From 542918c364dbbece4dc8a334182638db7ff11bab Mon Sep 17 00:00:00 2001 From: Cataldo URSO Date: Fri, 5 Apr 2019 11:08:39 +0200 Subject: [PATCH 01/21] 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 02/21] 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 ccbc00c2ee688090057056537dcca01694e7dba8 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 6 Jun 2019 11:16:30 +0200 Subject: [PATCH 03/21] 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 04/21] 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 05/21] 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 fd8dfb4185de0cd48c396d6286618b501892316d Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 14 Jun 2019 11:39:48 +0200 Subject: [PATCH 06/21] 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 eb8d353e115eeaaea35c03193b022bd2640e3407 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 19 Jun 2019 13:58:11 +0200 Subject: [PATCH 07/21] 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 08/21] 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 93351ec9b9f354ea3e5bd74f50bb0783ce07e2d9 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 20 Jun 2019 12:36:15 +0200 Subject: [PATCH 09/21] 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 10/21] 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 11/21] 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 12/21] 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 13/21] 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 14/21] 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 15/21] 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 16/21] 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 17/21] 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 18/21] 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 19/21] 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 20/21] 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 21/21] 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" + } } -} +}